【问题标题】:Indy 9 SMTP Send with TLS causing crash使用 TLS 的 Indy 9 SMTP 发送导致崩溃
【发布时间】:2012-12-01 14:07:18
【问题描述】:

我在通过 gmail 发送电子邮件时遇到了一个奇怪的问题。 我正在使用 Delphi 7 和 Indy 9 在 VirtualBox (4.2) 上运行 Windows 7 Professionel 32 位

由于 Indy 9 不支持开箱即用的 TLS,我必须自己发送 STARTTLS 命令。

这适用于小型测试邮件。带有附件的普通邮件会导致 VirtualBox 完全崩溃。没有 Windows 蓝屏。

我已经找到了一种解决方法,但它似乎很脏。如果我从 Delphi 源添加 IdSSLOpenSSL.pas 并添加 Sleep(5);到它工作的发送功能

function TIdSSLIOHandlerSocket.Send(var ABuf; ALen: integer): integer;
begin
  // 13.12.2012 fix timing
  Sleep(5);

  if fPassThrough then begin
    result := inherited Send(ABuf, ALen);
  end
  else begin
    result := SendEnc(ABuf, ALen);
  end;
end;

有没有更好的方法来解决这个问题?

如果您需要代码来设置 IOHandler

sslIOHandler                   := TIdSSLIOHandlerSocket.Create(nil);
sslIOHandler.SSLOptions.Method := sslvTLSv1;
sslIOHandler.PassThrough       := True;
IdSSLOpenSSLHeaders.Load;
smtpClient.Username            := tbUsername.Text;
smtpClient.Password            := tbPassword.Text;
smtpClient.AuthenticationType  := atLogin;
smtpClient.IOHandler           := sslIOHandler;
smtpClient.Connect(C_TIMEOUT);
smtpClient.SendCmd('STARTTLS');
sslIOHandler.PassThrough := False;
smtpClient.Authenticate();

【问题讨论】:

  • 在有免费的 Indy 10 和许多其他组件的情况下,是否有任何理由使用 dino-ages old、不受支持的 Indy 9?
  • 发送成功STARTTLS并建立TLS会话后,需要重新发出新的HELO/EHLO命令来发现服务器的新功能,可能由于激活 TLS。
  • @Nickolay,我们在此设置上运行的应用程序太多,无法在合理的时间内迁移到 Indy 10,无论如何这不是我的决定@Remy Lebeau,我看不出这对明显的帮助有什么帮助ssl 处理程序中的计时问题,但感谢提示

标签: delphi smtp indy ssl indy-9


【解决方案1】:

由于似乎没有人对此有解决方案并且升级到 Indy 10 是没有选择的(涉及的项目太多)我找到了一个不同的库来处理 tls 的 smtp...

现在我使用 Synapse,它不会干扰 Indy 9,并且符合我的预期。

http://synapse.ararat.cz/doku.php/public:howto:smtpsend

希望这可以帮助其他有同样问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多