在 Windows XP 中使用 Indy 10 发送带有内嵌图像的电子邮件时出现“SMTP 传入数据超时”
Posted
技术标签:
【中文标题】在 Windows XP 中使用 Indy 10 发送带有内嵌图像的电子邮件时出现“SMTP 传入数据超时”【英文标题】:"SMTP incoming data timeout" when sending email with inline images using Indy 10 in Windows XP 【发布时间】:2010-10-19 15:56:40 【问题描述】:当我尝试在 Windows XP 中发送带有内联图像的电子邮件时收到错误“SMTP 传入数据超时”,我正在使用 Indy 10 的 tiburon 分支和以下代码发送带有内联图像的电子邮件:
MB := TIdMessageBuilderhtml.Create;
try
MB.PlainText.Assign(Text);
MB.Html.Assign(FHTML);
MB.HtmlFiles.Add('c:\Path\to\My\Image.jpg');
MB.FillMessage(IdMessage);
finally
MB.Free;
end;
if not IdSMTP.Connected then
IdSMTP.Connect;
IdSMTP.Send(IdMessage);
这只是在 Windows XP 中发生,在 Windows Vista 中,电子邮件和内联图像发送得很好。
显然它没有向服务器发送任何内容,它似乎在发送之前卡住了图像。
这是调用堆栈:
IdReplySMTP 497 +1 TIdReplySMTP.RaiseReplyError
IdTCPConnection 574 +1 TIdTCPConnection.RaiseExceptionForLastCmdResult
IdTCPConnection 724 +10 TIdTCPConnection.CheckResponse
IdTCPConnection 563 +2 TIdTCPConnection.GetResponse
IdTCPConnection 583 +4 TIdTCPConnection.SendCmd
IdTCPConnection 696 +4 TIdTCPConnection.SendCmd
IdSMTP 377 +2 TIdSMTP.DisconnectNotifyPeer
IdTCPConnection 517 +5 TIdTCPConnection.Disconnect
IdSMTP 476 +2 TIdSMTP.Disconnect
IdTCPConnection 828 +2 TIdTCPConnection.Disconnect
Email 130 +11 TEmail.Destroy
System 9806 +1 TObject.Free
EnviarEmail 322 +38 TFormEnviarEmail.Enviar
System 12106 +38 @HandleFinally
RtlUnwind
System 11589 +83 @HandleAnyException
KiUserExceptionDispatcher
RtlAppendUnicodeToString
IdMessageClient 873 +4 EncodeAttachment
IdMessageClient 1213 +252 TIdMessageClient.SendBody
IdMessageClient 1244 +283 TIdMessageClient.SendBody
IdMessageClient 1269 +12 TIdMessageClient.SendMsg
IdSMTPBase 251 +6 TIdSMTPBase.SendNoPipelining
IdSMTPBase 436 +4 TIdSMTPBase.InternalSend
IdSMTPBase 457 +1 TIdSMTPBase.Send
IdSMTP 415 +6 TIdSMTP.Send
IdSMTPBase 449 +6 TIdSMTPBase.Send
任何关于导致它的原因以及如何解决问题的线索?
谢谢。
【问题讨论】:
【参考方案1】:您是否确认您可以使用真正的邮件客户端发送相同的邮件,最好是简单便携且不集成到系统内部的邮件客户端,例如 Mozilla Thunderbird 或 Opera 包含的邮件客户端?那里可能有防病毒/反垃圾邮件/反任何系统干扰 - 其中许多透明地拦截传出的 25/TCP 并对数据进行处理。
【讨论】:
【参考方案2】:如果编码不是原因,而是读取超时,您可以使用 ReadTimeOut 属性增加它:
IdSMTP1.ReadTimeOut := 20000;
【讨论】:
把ReadTimeOut改成20000导致EIdReadTimeOut异常,是什么意思? Indy 通过引发 EIdReadTimeOut 异常来报告超时。所以这告诉你其实只有服务器端的问题:服务器20秒没有发送任何数据【参考方案3】:问题解决了。
我正在解析一个 HTML 文件以加载图像并将它们附加到电子邮件中,但在 Windows XP 中,路径是:
C:\Documents And Settings\User\Desktop\....
在 html 文件中,这个路径是
C:\Documents%20And%20Settings\User\Desktop\....
因此,内部引发了 File not Found 异常并停止进程,直到超时,Indy 并没有引发它。
在 Windows XP 机器上运行的进程中附加远程调试器后,我在第一次尝试时遇到了异常。
我认为 Indy “吞没”异常是不正确的,但那是另一段历史了。
【讨论】:
Indy 将等待系统特定的超时时间,这在 Windows 系统上相当长。我也被这个咬过。以上是关于在 Windows XP 中使用 Indy 10 发送带有内嵌图像的电子邮件时出现“SMTP 传入数据超时”的主要内容,如果未能解决你的问题,请参考以下文章
使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时
在 Visual Studio 2015 和 Windows 10 中无法获取 XP 样式按钮 (FlatStyle=System)?