Indy10 + OpenSSL:发送电子邮件代码在Windows 8上停止工作

use*_*551 3 delphi openssl indy10

代码在Windows 8上停止工作.它在Windows7,Windows XP上正常工作......我找到了解决此问题的方法:在Windows兼容模式下启动应用程序:Windows XP(Service Pack 3) - 代码正常工作.如果Windows兼容模式是Windows 7,则代码无效.我以管理员身份运行应用程序.已经尝试关闭防病毒和防火墙.我可以使用另一个smtp客户端发送具有相同参数的电子邮件,例如.Net SmtpClient.该问题在不同的Windows 8计算机(家庭,办公室)上重现.我创建了简单的测试应用.代码是用Delphi XE编写的,Indy 10.5.7,OpenSSL 1.0.1.3 dll都放在test.exe文件夹中.

有任何想法吗?

码:

SSLHandler.MaxLineAction := maException;
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.SSLOptions.VerifyMode := [];
SSLHandler.SSLOptions.VerifyDepth := 0;
SSLHandler.OnStatusInfo := IdSSLIOHandlerSocketOpenSSL1StatusInfo;

SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.UseTLS := utUseExplicitTLS;
SMTP.Username := FromAddress;
SMTP.Password := AuthPassword;

Email.From.Address := FromAddress;
Email.Recipients.EmailAddresses := ToAddress;
Email.Subject := Subject;
Email.Body.Text := Body;

SMTP.Connect;
SMTP.Send(Email);
SMTP.Disconnect;
Run Code Online (Sandbox Code Playgroud)

输出:

SSL状态:"在/初始化之前"

SSL状态:"在/初始化之前"

SSL状态:"SSLv3写客户端问候A"

SSL状态:"SSLv3读取服务器问候A"

EIdSocketError,消息'Socket Error#10060 Connection time out out.'

小智 7

它是IdHTTP的ReadTimeout.默认情况下,它为-1,不适用于Windows 8.将其设置为15000ms或30000之类的正数将解决问题.

请注意,您需要以编程方式在IdHTTP对象上设置数值.不要尝试通过对象检查器设置绑定的IoHandler,因为它不会以这种方式工作.

例:

  IdHTTP1.ReadTimeout := 30000;
Run Code Online (Sandbox Code Playgroud)

一个告诉Indy在其套接字操作上使用无限超时.但是,要在连接断开时在Vista +上解决OpenSSL中的死锁问题,如果ReadTimeout <= 0,TIdSSLIOHandlerSocketOpenSSL会在较低的套接字层强制执行30秒的超时.

Bob Daneshfar在此论坛上发布的解决方案.