【问题标题】:SendMail with TIdSMTP Connection Time Out带有 TIdSMTP 连接超时的 SendMail
【发布时间】:2014-11-09 13:14:49
【问题描述】:

我无法使用TIdSMTP 发送电子邮件我收到以下消息:Socket Error # 10060 / Connection timed out.

我使用的是 Delphi XE6 版本

这是我的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  IdSMTP : TIdSMTP;
  IdMessage : TIdMessage;
begin
  IdSMTP := TIdSMTP.Create (Nil);
  IdMessage := TIdMessage.Create (Nil);
  IdSMTP.Host := 'mail.mysmtp.com';
  IdSMTP.Port := 25;
  IdSMTP.Connect ();
  IdMessage.From.Address := 'test@mysmtp.com';
  IdMessage.From.Name := 'Contato';
  IdMessage.Recipients.EMailAddresses := 'test@hotmail.com';
  IdMessage.Subject := 'Contato test';
  IdMessage.Body.Text := 'test';
  IdSMTP.Send (IdMessage);
  IdSMTP.Disconnect ();
  FreeAndNil (IdMessage);
  FreeAndNil (IdSMTP);
end;

【问题讨论】:

  • IdSMTP.connect 是否引发了异常?您可以通过 Telnet 连接到您的 SMTP 服务器吗?
  • 您确定是主机吗?可能不相关,但也会缺少一些身份验证(用户名/密码/ SMTP 之前的 Pop)、端口、TSL ... 看看here,也许你必须完善你的问题。
  • 请注意,您可以简单地编写 TIdSMTP.CreateTIdMessage.Create 而无需 (nil)。也可以使用 try .. finally 并将 Free / FreeAndNil 放在 finally 块中,以消除内存泄漏的风险。
  • 我不知道有不需要任何身份验证的 SMTP 服务器这样的东西......
  • @mjn 在这种特殊情况下,它绝对会泄漏IdSMTPIdMessage 对象。

标签: delphi smtp sendmail indy


【解决方案1】:

来自 Google:10060 范围内的套接字错误是 Winsock 错误。一般是传出连接问题或者主机端连接问题造成的。

我不知道你是否清理了这段代码以发布它,但我想说罪魁祸首是主机名或发件人地址上的用户名。

Winsock 将尝试创建到主机名的连接。如果未能获得预期的 ACK,则会产生超时错误。当 DNS 未解析域名时,我也看到过这种情况。

此外,前面提到的有关身份验证的内容... SMTP 主机没有响应可能是由于身份验证不正确造成的。这完全取决于主机的 SMTP 服务是如何配置的,因此它可以忽略未经授权的请求。

您需要查看是否必须在 SMTP 请求中传入用户名/密码,或者先读取邮箱(可以说是先读后写)。我无法想象有人在不需要某种身份验证的情况下配置 SMTP 服务器,否则您将拥有相当于“开放中继”的东西,任何进程都可以通过它发送无限流量。

此外,发件人地址可能需要有效。也就是说,“test@mysmtp.com”需要一个用户/邮箱才能存在“test”,而不是“*@mysmtp.com”,它可以使用任何用户/邮箱名称。

所有这些都可能导致超时,因为 SMTP 主机可以配置为简单地忽略不正确和未经身份验证的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2015-01-23
    • 2022-01-21
    • 2023-03-14
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多