gpt4 book ai didi

Delphi XE2 - 无法通过 SSL 连接到 Gmail smtp 服务器

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:39 41 4
gpt4 key购买 nike

使用 Delphi XE2、附带的 Indy 10 和 OpenSSL dll 的 1.0.1c 版本。

我们正处于将 Delphi 6 项目转换为 Delphi XE2 的最后阶段。

到目前为止,我们已经解决了所有的显示问题,但我遇到了一个试图连接到 Gmail smtp 服务器的问题。

根据 Google 自己的文档,我们的 Delphi 6 应用程序使用 SSL v2.3 和 SSL v3 以及连接到端口 465 的 Indy 9 组件运行良好。 Google Support

我们的 Delphi XE2 应用程序根本无法连接。连接调用进入以太网,大约 7 分钟没有任何反应,直到我厌倦了等待事情超时并将其关闭。实际上,我一直跟踪程序执行到此处的 IdWinsock2 函数:

function Stub_select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Integer; stdcall;
begin
@select := FixupStub(hWinSockDll, 'select'); {Do not Localize}
Result := select(nfds, readfds, writefds, exceptfds, timeout);//<-this line never returns and timeout is always nil
end;

我需要为现有用户的配置维护旧的 SSL 连接。

新用户将能够使用 TLS 进行连接(到端口 587),这行得通吗!?!?

我不知道为什么非 TLS SSL 选项不起作用,不报告任何错误,也不超时,只是去 Never-Never Land。请帮忙!

张杰

代码如下:

  SMTPClient.Host := trim(EditSMTPServer.Text);
SMTPClient.Port := EditSMTPServerPort.AsInteger;//<- value from custom edit box
SMTPClient.Username := trim(EditSMTPLogon.Text);
SMTPClient.Password := trim(EditSMTPPassword.Text);
SMTPClient.AuthType := satDefault;

if CheckBoxUseSSL.Checked then begin
SMTPClient.IOHandler := IdSSLIOHandlerSocket1;
IdSSLIOHandlerSocket1.ReadTimeout := 30000;//30 second timeout which does not appear to work
case ComboBoxSSLMode.ItemIndex of
0 : IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv2;
1 : IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23;
2 : IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv3;
3 : begin
IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLsv1;
SMTPClient.UseTLS := utUseImplicitTLS;
end;
end;//case
IdSSLIOHandlerSocket2.SSLOptions.Method := IdSSLIOHandlerSocket1.SSLOptions.Method;
IdSSLIOHandlerSocket2.PassThrough := False;
end
else begin
SMTPClient.IOHandler := nil;
end;

try
SMTPClient.Connect;
if SMTPClient.Connected then begin
if SMTPClient.Authenticate then begin
... do some work ...
end;
end;
except
on e:Exception do begin
showmessage(e.message);
end;
end;

编辑:

像往常一样,在我发布问题后,我偶然发现了一个解决方法。

如果我将所有非 SSL 事务的 UsetTLS 属性设置为 utUseImplicitTLS,并将它设置为 TLS 事务的 utUseExplicitTLS,我的连接似乎会及时工作。

希望这对某人有所帮助。

更新代码:

if CheckBoxUseSSL.Checked then begin
SMTPClient.IOHandler := IdSSLIOHandlerSocket1;
SMTPClient.UseTLS := utUseImplicitTLS;
case ComboBoxSSLMode.ItemIndex of
0 : IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv2;
1 : IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23;
2 : IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv3;
3 : begin
IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLsv1;
SMTPClient.UseTLS := utUseExplicitTLS;
end;
end;//case
IdSSLIOHandlerSocket2.SSLOptions.Method := IdSSLIOHandlerSocket1.SSLOptions.Method;
IdSSLIOHandlerSocket2.PassThrough := False;
end
else begin
SMTPClient.UseTLS := utNoTLSSupport;//reset TLS support flag
SMTPClient.IOHandler := nil;
end;

最佳答案

您发现的就是您应该做的。 SSL 和 TLS 具有不同的语义,因此您必须相应地设置 UseTLS

对于端口 465 上的 SSL,服务器希望您的客户端在连接后立即启动 SSL 握手,然后服务器再发送加密的问候语。 UseTLS=utUseImplicitTLS 会这样做,但 UseTLS=utUseExplicitTLS 不会。当 UseTLS=utUseExplicitTLS 时,TIdSMTP 将期望服务器立即发送未加密的问候语,这将解释 select() 中的挂起 - 服务器没有发送任何数据!

对于端口 587 上的 TLS,服务器期望客户端最初未加密连接,然后在准备好启动加密时发送显式 STARTTLS 命令。 UseTLS=utUseExplicitTLS 会这样做,但 UseTLS=utUseImplicitTLS 不会。

关于Delphi XE2 - 无法通过 SSL 连接到 Gmail smtp 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671416/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com