2

我正在尝试使用 Indy 和这篇 Marco Cantù 文章中阐述的技术从 smtps(安全 smtp)发送电子邮件。

这就是我正在使用的:

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 上挂起,但没有任何异常或有用的错误。

如果不是 aboe,我使用 gmail 设置,如文章中所述,所有工作

你能给个建议吗?

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

4

2 回答 2

8

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

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

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

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

于 2012-07-05T23:21:43.763 回答
0

许多邮件服务器延迟接受连接,以防止邮件程序机器人通过尝试发送垃圾邮件来轰炸它们。

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

于 2012-07-05T22:57:41.177 回答