TIdMessage headers 和消息中时间不准确的奇怪问题

Strange issue with inaccurate time in TIdMessage headers and message

使用 Indy 10.1.5(D2007 附带的版本),我正在撰写和发送电子邮件作为自动化内部流程的一部分。

邮件发送正常,但是当收件人收到邮件时,电子邮件客户端中显示的时间不正确,导致邮件在收件箱中的排序不正确。这导致收件人忽略了该消息(因为它没有按正确的顺序出现在收件箱中并且滚出了底部),导致了轻微的处理延迟。

美国东部时区 (UTC -0400) 的发件人和收件人。消息 header 正确显示消息日期,但不包括时区:

Date: Mon, 3 Aug 2015 11:12:21 +0000

收到电子邮件并在 Outlook 中查看时,显示的邮件具有 UTC 偏移量:

Mon 08/03/2015 7:12 AM

创建消息的代码非常简单(copied/pasted 然后匿名和简化)。它创建一条相对较短的消息 body(提供有关附加文件的信息)、创建附件并发送消息。 (为简洁起见删除了 try..excepttry..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;

我已经通读了 Indy 文档并检查了我能找到的 TIdSMTPTIdMessage 的所有属性,但找不到任何其他可以纠正此时区不匹配的内容.

谁能看到我在这里遗漏了什么?

10.1.5 是 Indy 10 的过时版本。当前版本是 10.6.2。

Indy 10 的早期版本中存在一些与 UTC 相关的错误。在这种情况下,Indy 的 OffsetFromUTC() 函数中存在一个错误,该函数检索本地机器的 UTC 偏移量并在计算时间戳时使用外发电子邮件。您应该升级到 Indy 10 的现代版本,以便您拥有最新的修复、功能、架构更改等。

如果无法升级,则必须将 TIdMessage.UseNowForDate 属性 设置为 false 并在 TIdMessage.Date 属性 以解决 Indy 的错误偏移,因此发送了正确的时间戳值。