在端口25上收到邮件时是否可以实现SSL连接

时间:2014-10-18 17:12:03

标签: delphi email ssl smtp indy

我有一个TIdSMTPServer在端口25和465上运行,它的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(使用implicit SSL)时,一切都很好。但是当另一个smtp服务器(例如yahoogmail)发送邮件时,它会在端口25上出现并且在OnConnect事件中被阻止。所以我问是否有可能发布像STARTTLS这样的东西并用SSL以某种方式加密端口25上的连接,或者有办法告诉对方我想在端口465上用SSL进行通信(在这两种情况下使用我的证书,连接总是直接的 - 没有用户名/密码验证)?

1 个答案:

答案 0 :(得分:1)

在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会话,您不能从服务器端执行此操作。 IF 客户端希望在端口25上使用SSL / TLS,它将通过EHLO命令查询服务器的功能,然后向您的STARTTLS命令发送服务器,如果它在STARTTLS回复中报告EHLOTIdSMTPServer为您处理所有这些,您唯一需要做的就是将SSLIOHandler分配给服务器并将TIdSMTPServer.UseTLS属性设置为utUseRequireTLSutUseExplicitTLS。< / p>