使用Indy 10.1.5(D2007附带的版本),我正在撰写并发送电子邮件作为自动内部流程的一部分。
电子邮件已正常发送,但当收件人收到邮件时,电子邮件客户端中的时间显示不正确,导致邮件在收件箱中错误排序。这导致收件人忽略了该消息(因为它没有以正确的顺序出现在收件箱中并从底部滚动),导致处理延迟。
美国东部时区的发件人和收件人(UTC -0400)。邮件标题正确显示邮件日期,但未包含时区:
日期:星期一,2015年8月3日11:12:21 +0000
在Outlook中收到并查看电子邮件时,将显示带有UTC偏移的消息:
星期一08/03/2015 7:12 AM
创建消息的代码非常简单(复制/粘贴,然后匿名和简化)。它创建一个相对较短的消息体(提供有关附加文件的信息),创建附件并发送消息。 (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;
我已经阅读了Indy文档并检查了我可以为TIdSMTP
和TIdMessage
找到的所有属性,并且找不到任何可以纠正此时区不匹配的内容。< / p>
任何人都能看到我在这里失踪的是什么吗?
答案 0 :(得分:2)
10.1.5是Indy 10的过时版本。当前版本是10.6.2。
早期版本的Indy 10中存在一些与UTC相关的错误。在这种情况下,Indy的OffsetFromUTC()
函数中存在一个错误,它检索本地机器的UTC偏移量,并且在计算外发电子邮件的时间戳时使用。您应升级到Indy 10的现代版本,以便获得最新的修复,功能,架构更改等。
如果您无法升级,则必须将TIdMessage.UseNowForDate
属性设置为false,并在TDateTime
属性中提供您自己的时区调整后的TIdMessage.Date
值,以说明Indy&#39; s错误的偏移量,因此发送了一个合适的时间戳值。