我使用 TidSMTP 与 TIdSSLIOHandlerSocketOpenSSL ,只需连接到"套接字错误" 就会出现问题服务器。
这是表单组件代码
object IdSMTP: TIdSMTP
IOHandler = IdSSLIOHandlerSSL
Port = 465
SASLMechanisms = <>
UseTLS = utUseImplicitTLS
Left = 93
Top = 49
end
object IdSSLIOHandlerSSL: TIdSSLIOHandlerSocketOpenSSL
OnStatus = IdSSLIOHandlerSSLStatus
Destination = ':465'
MaxLineAction = maException
Port = 465
DefaultPort = 0
SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
OnStatusInfo = IdSSLIOHandlerSSLStatusInfo
Left = 88
Top = 112
end
和Delphi Code
IdSMTP.Username := 'username';
IdSMTP.Password := 'password';
IdSMTP.Host := 'domain';
IdSMTP.Port := 465;
IdSMTP.UseTLS := utUseImplicitTLS;
try
IdSMTP.Connect;
except
on E:Exception do
// Socket Error, Connection Timeout is thrown.
Memo1.Lines.Add(E.Message);
end;
我记录了SSL IO状态并得到了这个:
Resolving hostname {domain}.
Connecting to {ip}.
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
Socket Error # 10060
Connection timed out.
我们的邮件服务器正在使用自签名证书。
我做错了什么?
TIA
更新:2014年7月2日
尝试了Sending mail to Gmail using Indy提示,但我 SSLv3读取服务器问候语后,连接正常发送电子邮件。
Resolving hostname smtp.gmail.com.
Connecting to 74.125.25.108.
Connected.
Sending Email..
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
Disconnected.
Connection Closed Gracefully.
这是新代码:
IdSMTP.Username := 'username';
IdSMTP.Password := 'password';
IdSMTP.Host := 'smtp.gmail.com';
IdSMTP.UseTLS := utUseExplicitTLS;
IdSMTP.Port := 587;
try
// Can connect successfully
IdSMTP.Connect;
// This part throws the exception
IdSMTP.Send(IdMessage);
except
on E:Exception do
// Disconnected, connection closed gracefully
Memo1.Lines.Add(E.Message);
end;
更新
尝试使用连接到同一域的Thunderbird发送电子邮件。
雷鸟:
印:
否&#34; 客户端密钥交换,... &#34;发生在我的计划上。
解决
通过手动设置connectiontimeout
解决了这个问题答案 0 :(得分:3)
您正在使用隐式SSL。这意味着在交换任何应用程序数据(SMTP命令/响应)之前,一旦套接字连接到服务器,就会启动SSL握手。客户端问候语被发送到服务器,然后在等待服务器响应发送回hello时发生超时。这意味着服务器不在您连接的端口上使用SSL。
要记住一些事项 - 设置UseTLS
属性可能会更改Port
属性,因此请确保Port
实际上是您在调用Connect()
时所期望的。为确保这一点,请在设置Port
之后设置UseTLS
,而不是之前设置。{/ p>
答案 1 :(得分:0)
请检查您的防火墙是否已暂时停用。 我到了这个页面,因为我遇到了同样的问题 - 立即断开&#34; Connection正常关闭&#34;使用SSL执行SMTP时。 然后我禁用了我的Avast!防火墙,这很好。