Indy和smtps:无法连接

时间:2012-07-05 09:58:09

标签: delphi delphi-xe2 indy indy10

我正在尝试使用Indy发送来自smtps(安全smtp)的电子邮件,并使用简化in this Marco Cantù article的技术。

这就是我正在使用的:

object SMTP: TIdSMTP
  IOHandler = IdSSLIOHandlerSocketOpenSSL1
  SASLMechanisms = <>
  UseTLS = utUseExplicitTLS
  Left = 32
  Top = 196
end

SMTP.Host := 'smtps.pec.aruba.it';;
        SMTP.Port := 465;;
        SMTP.Username := 'myaddress@pec.it';
        SMTP.Password := 'myPassw0rd'; 
        MailMessage.Encoding := meDefault;
        MailMessage.From.Address := 'myaddress@pec.it';

        MailMessage.BccList.EMailAddresses := 'testaddress0@gmail.com';
        MailMessage.Subject := 'Test Mail';
        MailMessage.Body.Text := 'Please ignore this mail, This is a test';

        SMTP.Connect; //failure!!!
        SMTP.Send(MailMessage);

我的程序在SMTP.Connect上挂起,但没有任何异常或有用的错误。

如果不是我使用gmail setings,如the article所解释的那样

你能提出建议吗?

我有Indy 10.5.8和ssl dll与exe的路径相同。

2 个答案:

答案 0 :(得分:6)

Connect()因为您使用错误的Port属性分配连接到错误的UseTLS而挂起。

端口465是SMTP的隐式SSL端口,这意味着客户端必须在连接到服务器之后立即加密连接,然后才能进行任何与SMTP相关的通信。服务器期望您的客户端发送SSL握手,但您的客户端没有这样做,因为您设置了UseTLS=utUseExplicitTLS。这告诉TIdSMTP期望连接在连接到服务器时最初未加密,然后TIdSMTP可以向服务器发送显式STARTTLS命令以在需要时动态激活TLS加密。

因此,TIdSMTP正在等待服务器发送一个它永远不会发送的SMTP问候语,并且服务器期望您的客户端发送SSL握手,而这种情况从未发生过。发生死锁,直到其中一方断开连接。

如果连接到端口465,则必须设置UseTLS=utUseImplicitTLS。要使用UseTLS=utUseExplicitTLS,您需要连接到端口25或587。

答案 1 :(得分:0)

许多邮件服务器都会延迟接受连接,以防止邮件机器人试图通过传递垃圾邮件来轰炸它们。

你可能看到的挂起只是连接中的一个长时间延迟,我之前使用过很多不同服务器的这些组件,并且连接将始终在错误上返回异常。如果是我,我现在将使用诸如wireshark之类的数据包嗅探器来检查发生了什么