我正在尝试使用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的路径相同。
答案 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之类的数据包嗅探器来检查发生了什么