使用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;
有什么建议吗?
答案 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服务器连接至。它与“连接重置”错误不同,表示连接断开。在这两种情况下,连接都不再存在,您无法再读/写。