Delphi + Indy: 连接优雅地关闭

9

使用D7 + Indy 10最新版本。

我的代码使用TIdSMTP发送电子邮件。但是在某些终端用户处,我不断收到“连接已优雅地关闭”的消息,而电子邮件从未发送成功。

代码如下:

try
~~~~
~~~~
_idSMTP := TIdSmtp.Create;
with _idSMTP do
begin
  Host := 'myhost';
  Connect;
  try
    Send(_EmailMsg);
    Result := True;
  except
    on E: Exception do
    begin
      MsgDlgErr(Self.Handle, E.Message)
    end
  end;
end;
finally
 _idSMTP.Disconnect;
 _idSMTP.Free;
end;

有什么建议吗?

5个回答

22

http://www.swissdelphicenter.ch/en/showarticle.php?id=1上阅读更多信息。

EIdConnClosedGracefully是一种异常,表示连接已被对方有意关闭。这与导致连接重置错误的断开连接不同。如果对方关闭了连接并且套接字正在读取或写入数据,则Indy会引发EIdConnClosedGracefully异常。这类似于尝试读取或写入已在您不知情的情况下关闭的文件。

在某些情况下,这是真正的异常,您的代码需要处理它。在其他情况下(通常是服务器),这是协议运行的正常部分,Indy会为您处理此异常。即使Indy捕获了它,在IDE中运行时调试器也将首先触发。您只需按F9继续,Indy将处理该异常,但在调试期间不断停止可能会很烦人。在Indy捕获异常的情况下,除非从IDE运行程序,否则您的用户永远不会看到程序中的异常。


异常不会在IDE中发生,但会发生在最终用户计算机上。 - Atlas
现在一些病毒扫描器会阻止SMTP端口的出站连接。这可能会导致连接无响应并抛出此错误。 - Stijn Sanders
2
@Atlas:这就是为什么它说“在某些情况下……” :) 该页面还讨论了其他情况。 - Lars Truijens
1
如果在消息数据或发件人/收件人地址中检测到任何错误,服务器也可能会在其端断开连接。 - Remy Lebeau

2
在我的情况下,错误是由于我使用了一个与托管SMTP服务器的域不同的发件人电子邮件地址,这就是为什么SMTP服务器拒绝连接的原因。

1
根据我的经验,在AT&T服务器的情况下,如果MAIL FROM中的电子邮件地址不是@att.net地址,则会被拒绝。对于那些收到此错误的用户,可以通过使用TIdLogEvent记录错误来确定更多信息,否则错误报告相当模糊 - 如果在MAIL FROM之后立即发生断开连接(连接正常关闭),则可能表明服务器策略拒绝具有其未托管域的电子邮件,正如Toni所解释的那样。
否则,“连接正常关闭”错误意味着正在尝试读/写已被对等方有意地关闭的套接字 - 在您的情况下,对等方是您连接到的SMTP服务器。这与“连接重置”错误不同,后者表示连接已断开。在这两种情况下,连接已不存在,因此无法再进行读/写操作。

1
我们在客户端遇到了这个错误,原因是缺少OpenSSL库的安装。

0

我知道这已经很老了,但我已经处理完这个异常了。

在我的情况下,服务器阻止发送邮件,因为我超过了托管服务的每日发送限制。当测试某些东西时,很容易超过这些限制。异常本身是模糊的,因此可能有更多原因,但我首先会检查这个问题。这为我解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接