delphi - 25端口接收邮件是否可以实现SSL连接

标签 delphi email ssl smtp indy

我有一个在端口 25 和 465 上运行的 TIdSMTPServer,它的 OnConnect 事件如下所示:

procedure TMainForm.SMTPServerConnect(AContext: TIdContext);
begin
  if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then begin
    TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
end;

在激活 SMTPServer 之前执行这段代码:

with IdServerIOHandlerSSLOpenSSL1 do begin
  SSLOptions.CertFile := myCertFile;
  SSLOptions.RootCertFile := myRootCertFile;
  SSLOptions.KeyFile := myKeyFile;
end;
SMTPServer.IOHandler := IdServerIOHandlerSSLOpenSSL1;

当客户端尝试连接到端口 465 时一切正常(使用 隐式 SSL)。但是当另一个 smtp 服务器(例如 yahoogmail)发送邮件时,它出现在端口 25 上,并且在我的 OnConnect 事件中显然被阻止了。所以我问是否有可能发出类似 STARTTLS 的东西并使用 SSL 以某种方式加密端口 25 上的连接,或者是否有办法告诉另一方我想使用 SSL 在端口 465 上进行通信(在这两种情况下都使用我的证书,连接始终是直接的 - 无需用户名/密码身份验证)?

最佳答案

在 Indy 10 中,PassThrough 默认为 True。在将 PassThrough 设置为 False 之前,您需要查看客户端实际连接的端口号,例如:

procedure TMainForm.SMTPServerConnect(AContext: TIdContext);
begin
  if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
  begin
    if AContext.Binding.Port = 465 then begin
      TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
    end;
  end;
end;

TIdHTTPServer 有一个 OnQuerySSLPort 事件为您处理这个细节。该功能尚未移植到其他 Indy 服务器组件,您必须手动完成。

您充当服务器客户端 决定是否启动 SSL/TLS session ,您不能从服务器端执行此操作。 IF 客户端想要在端口 25 上使用 SSL/TLS,它将通过 EHLO 命令查询您的服务器的功能,然后发送 STARTTLS 命令如果它在其 EHLO 回复中报告 STARTTLS,则发送到您的服务器。 TIdSMTPServer 为您处理所有这些,您唯一需要做的就是为服务器分配一个 SSLIOHandler 并将 TIdSMTPServer.UseTLS 属性设置为 utUseRequireTLSutUseExplicitTLS

关于delphi - 25端口接收邮件是否可以实现SSL连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26442418/

相关文章:

java - Lotus Notes Java API。邮件转发

IIS、XP、SSL 与 KeepAlives

ios - 如何为 AFNetworking 创建 .cer 文件以在 iOS 应用程序包中使用

delphi - SysListView32类似鼠标选择矩形

delphi - OnNewText 事件后何时重绘 VirtualTreeView?

email - 如何将图像插入电子邮件正文?

java - 从 .eml 文件获取文本的最佳方法是什么?

rest - Advanced REST Client for Chrome 中的 SSL 证书

delphi - FireMonkey 中的像素着色器模型 > 2.0

multithreading - 德尔福TThreadPool : wait for free thread slot before proceeding with code