Используя Indy 10.1.5 (версия, поставляемая с D2007), я составляю и отправляю сообщение электронной почты как часть автоматизированного внутреннего процесса.Странная проблема с неточным временем в заголовках TIdMessage и сообщении
Письмо отправляется нормально, но когда получатель получает сообщение, время отображается неправильно в почтовом клиенте, в результате чего сообщение будет неправильно сортироваться во входящих. Это заставило получателя игнорировать сообщение (потому что оно не находилось в папке «Входящие» в правильной последовательности и прокручивалось снизу), что вызвало небольшие задержки обработки.
Как отправитель, так и получатель в восточном часовом поясе США (UTC -0400). Заголовок сообщения правильно с указанием даты сообщения, но без учета часового пояса:
Дата: Ср, 3 августа 2015 11:12:21 +0000
Когда электронная почта принимается и рассматривается в Outlook, сообщение показывается с UTC смещения:
пн 08/03/2015 7:12 утра
код, который создает т essage довольно прост (скопирован/вставлен, а затем анонимен и упрощен). Он создает относительно короткое тело сообщения (предоставление информации о прикрепленном файле), создает вложение и отправляет сообщение. (try..except
и try..finally
удалены для краткости - они существуют в реальном коде.)
Msg := TIdMessage.Create;
// Also tried using False and setting Date property manually
Msg.UseNowForDate := True;
for i := 0 to NumAddr do // Number of recipients
begin
Msg.Recipients.Add;
Msg.Recipients[Msg.Recipients.Count - 1] := RecipAddr[i];
end;
Msg.FromList.Add;
Msg.FromList[0].Name := Sender Name;
Msg.FromList[0].Address := SenderAddress;
Msg.Subject := 'Some text';
Msg.Body.Add('A few lines of text providing summary info.');
TIdAttachmentFile.Create(Msg.MessageParts, FileToAttach);
Mail := TIdSMTP.Create;
Mail.Host := PrimaryMailServer;
Mail.Connect;
Mail.Send(Msg);
Mail.Disconnect;
Я прочитал Инди документации и изучили все свойства можно найти как для TIdSMTP
и TIdMessage
, и не может найти что-нибудь еще, что бы устранить несоответствие часовых поясов.
Может ли кто-нибудь увидеть, что мне здесь не хватает?
Я верю, что в более ранних версиях Indy 10 были некоторые ошибки, связанные с GMT. Я уверен, что Remy может дать лучшую информацию, но я видел старые сообщения на разных сайтах, где пользователи описывали эту проблему, и он сказал, что обновление до последней В сборку Indy включены исправления GMT. –
@SamM: то, что вы сказали, точно верно. Самое главное, что была ошибка в функции 'OffsetFromUTC()' Indy, которая извлекает смещение UTC локальной машины, которое используется при вычислении метки времени для исходящих писем. Если вы не можете перейти на новую версию Indy, вам нужно будет установить значение 'TIdMessage.UseNowForDate' в false и предоставить собственное значение' TIdMessage.Date', которое учитывает ошибочное смещение, чтобы получить правильное значение временной отметки. –
@RemyLebeau - почему бы не оставить комментарий в качестве ответа? – RBA