Date - дата письма из заголовка Date: , который проставляется на стороне отправителя
MailDate - скорей всего дата создания (получения) письма. Т.е. если вы скопируете на сервер старое письмо, то у него Date будет старая, а MailDate свежая.
date (udate) может прийти с неправильным временем я так понимаю, т.к. эту строку напрямую прописывает сервер отправителя, т.е. трудно ориентироваться на это значение, время может быть выставлено неправильно. MailDate вообще хрен пойми чего, RFC составляли какие-то инвалиды-склерозники... Где-то вообще пишут, "The two date values in there (Date and MailDate) are not really reliable, and should be avoided", а на чё, _лять, тогда ориентироваться, по рунам чтоли гадать