Delphi XE Indy TIDSMTP和Gmail:套接字错误10060

3
我在使用Delphi XE应用程序发送电子邮件时,遇到了“Socket Error 10060-连接超时”的问题。但是,在同一台计算机上的Delphi 2007应用程序中,相同的代码可以正常工作。两个应用程序都没有安装防火墙或杀毒软件,并且使用相同的DLL(libeay32.dll / ssleay32.dll)。
以下是我的代码:
idsmtp1.host = 'xxxx'; 
idsmtp1.port = 465;
idsmtp1.username = 'x';
idsmtp1.password = 'x';
with ssl1 do
      begin
      SSLOptions.Method := sslvTLSv1;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
      Destination := 'smtp.gmail.com:465';
      host := 'smtp.gmail.com';
      //OnStatusInfo := ssl1statusinfo;
      end;
idsmtp1.iohandler := ssl1;
idsmtp1.usetls := utUseImplicitTLS;
idsmtp1.UseEhlo := true;
idsmtp1.connect; // here the exception is throw 

1
不要手动设置 ssl1.Destinationssl1.HostConnect() 会自动为您分配它们。除此之外,尝试在设置 idsmtp1.UseTLS 后再设置 idsmtp1.Port。设置 UseTLS 可能会更改 Port,因此您需要确保您选择的端口实际上被使用。如果这不起作用,请尝试在端口 587 上使用 utUseExplicitTLS - Remy Lebeau
1
移除了“ssl1.destination”和“ssl1.host”,并将端口移到代码的末尾。在465和587 / utUseExplicitTLS上没有起作用。但是,在Delphi 2007上工作正常... XE / 2007是否有任何区别,它能使用相同的DLLS吗? - delphirules
1
以下是一个奇怪的事情:在ssl1的'onStatusInfo'上设置断点后,它停在那里很多次,消息也被发送了!我发现通过断点,它可以工作,但没有断点就不行...就好像它需要一些“暂停”才能工作。这有意义吗? - delphirules
1
我可以确认,在ssl1的'onSatusInfo'上添加一些'pause'解决了这个问题。我只是添加了这样一个代码:'sleep(500);application.processmessages',现在它可以正常工作了。 - delphirules
1个回答

1
我不知道为什么,在TIdSSLIOHandlerSocketOpenSSL的事件'onStatusInfo'中添加一些'pause'可以解决问题。以下是添加的代码:
procedure ssl1StatusInfo(Msg: string);
begin
sleep(500);
application.processmessages;
end;

没有这段代码,我总是会遇到“Socket Error 10060 - Connection timed out”错误。

2
嘿,delphirules谢谢你!顺便说一句,如果你没有使用SSL,那么可以使用IdIOHandlerStack并将睡眠代码发布到OnStatus事件中。它确实有效,并且不会出现超时错误。 - sandman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接