Delphi + Indy:连接正常关闭

时间:2009-07-06 08:13:37

标签: delphi indy

使用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;

有什么建议吗?

3 个答案:

答案 0 :(得分:21)

http://www.swissdelphicenter.ch/en/showarticle.php?id=1

上阅读所有相关内容
  

EIdConnClosedGracefully是一个   异常信号表示   连接已被关闭   另一方故意。这不是   与断开的连接相同   会导致连接重置错误。   如果对方关闭了   连接和套接字被读取或   写给,EIdConnClosedGracefully   将由Indy筹集。这是   类似于尝试阅读或写作   到没有关闭的文件   你的知识。

     

在某些情况下,这是一个真正的例外   并且您的代码需要处理它。在   其他情况(通常是服务器)   是正常运作的一部分   协议和Indy处理这个问题   你的例外。 Indy   在IDE中运行时捕获它   首先会触发调试器。   您只需按F9即可继续   和Indy将处理异常,   但不断停止   调试可能很烦人。在   Indy捕获的情况   例外,您的用户永远不会看到   您的计划中的例外情况,除非它   从IDE运行。

答案 1 :(得分:2)

在我的情况下,错误是由于我使用来自与smtp服务器托管的域不同的域的发件人电子邮件地址,这就是smtp服务器拒绝连接的原因。

答案 2 :(得分:1)

根据我的经验,如果是AT& T服务器,它会拒绝@att.net中不是MAIL FROM地址的电子邮件地址。可以通过使用TIdLogEvent为接收它的这些用户记录错误来确定更多信息,否则错误报告相当模糊 - 如果断开连接(连接正常关闭)发生在MAIL FROM之后,则可能表示服务器策略拒绝包含其未托管的域的电子邮件,如Toni所解释的那样。

否则“正常关闭连接”错误意味着正在尝试读取/写入已被对等方故意关闭的套接字 - 在您的情况下,对等方是您的SMTP服务器连接至。它与“连接重置”错误不同,表示连接断开。在这两种情况下,连接都不再存在,您无法再读/写。