在 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 传入数据超时”的主要内容,如果未能解决你的问题,请参考以下文章

Indy10 Tcp接收数据问题

INDY10 BASE64编码

在 Delphi 2009 中逐步升级 Indy 10

使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时

在 Visual Studio 2015 和 Windows 10 中无法获取 XP 样式按钮 (FlatStyle=System)?

Indy 10 Http 服务器示例