2012-07-05 68 views
2

我试图发送使用印地从SMTPS电子邮件(SMTP安全)和技术exaplined in this Marco Cantù article印和SMTPS:无法连接

这是我在用的:

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

SMTP.Host := 'smtps.pec.aruba.it';; 
     SMTP.Port := 465;; 
     SMTP.Username := '[email protected]'; 
     SMTP.Password := 'myPassw0rd'; 
     MailMessage.Encoding := meDefault; 
     MailMessage.From.Address := '[email protected]'; 

     MailMessage.BccList.EMailAddresses := '[email protected]'; 
     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 setings作为the article所有作品解释

能否请您给的建议吗?

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

回答

6

Connect()挂起,因为您连接到错误Port与错误UseTLS属性赋值。

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

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

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

+0

+1谢谢,UseTLS = utUseImplicittTLS帮助,现在被执行,甚至派连接,但我不明白的电子邮件...你认为什么检查? – LaBracca 2012-07-06 16:05:05

+1

如果服务器接受电子邮件数据没有错误(即'Send()'不会引发异常),则服务器负责发送电子邮件。如果电子邮件没有到达,那么在您断开与服务器的连接之后很长一段时间内,传送失败的可能性很大。诊断的唯一方法是检查收件箱,看看服务器是否向您发送错误消息。服务器接受之后发生的传递错误在SMTP会话之外,这就是为什么'TIdSMTP'无法向您报告它们的原因。 – 2012-07-07 07:53:34

+0

我能够读取交付失败的邮件错误是“ccn不允许”,因为它是强制性的有一个真正的(非cc或ccn)收件人,所以我使用收件人显式,现在它的工作原理。非常感谢! – LaBracca 2012-07-10 09:40:48

0

许多邮件服务器延迟连接的接受,以防止邮件机器人与尝试传送垃圾邮件轰炸他们。

这也许是挂你看到的是在连接只是一个较长时间的延迟,我已经使用这些组件之前,有许多不同的服务器和连接将始终返回一个错误异常。如果是我,我现在是使用数据包嗅探器,例如wireshark检查是怎么回事