2015-08-03 6 views
-1

Используя 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, и не может найти что-нибудь еще, что бы устранить несоответствие часовых поясов.

Может ли кто-нибудь увидеть, что мне здесь не хватает?

+2

Я верю, что в более ранних версиях Indy 10 были некоторые ошибки, связанные с GMT. Я уверен, что Remy может дать лучшую информацию, но я видел старые сообщения на разных сайтах, где пользователи описывали эту проблему, и он сказал, что обновление до последней В сборку Indy включены исправления GMT. –

+1

@SamM: то, что вы сказали, точно верно. Самое главное, что была ошибка в функции 'OffsetFromUTC()' Indy, которая извлекает смещение UTC локальной машины, которое используется при вычислении метки времени для исходящих писем. Если вы не можете перейти на новую версию Indy, вам нужно будет установить значение 'TIdMessage.UseNowForDate' в false и предоставить собственное значение' TIdMessage.Date', которое учитывает ошибочное смещение, чтобы получить правильное значение временной отметки. –

+2

@RemyLebeau - почему бы не оставить комментарий в качестве ответа? – RBA

ответ

2

10.1.5 - устаревшая версия Indy 10. Текущая версия 10.6.2.

В ранних версиях Indy 10 были некоторые ошибки, связанные с UTC. В этом случае была ошибка в функции Indy OffsetFromUTC(), которая извлекает смещение UTC локальной машины и используется при расчете временной метки для исходящих писем. Вы должны перейти на современную версию Indy 10, так что у вас есть последние исправления, функции, архитектурные изменения и т. Д.

Если вы не можете обновить, вам нужно будет установить для свойства TIdMessage.UseNowForDate значение false и предоставить свой собственный часовой пояс- скорректированное значение TDateTime в свойстве TIdMessage.Date для учета ошибочного смещения Indy, поэтому отправляется правильное значение временной отметки.

+0

10.6.2 действительно устраняет проблему.Спасибо, Реми. –

 Смежные вопросы

  • Нет связанных вопросов^_^