我有一个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服务器(例如yahoo
或gmail
)发送邮件时,它会在端口25上出现并且在OnConnect
事件中被阻止。所以我问是否有可能发布像STARTTLS
这样的东西并用SSL以某种方式加密端口25上的连接,或者有办法告诉对方我想在端口465上用SSL进行通信(在这两种情况下使用我的证书,连接总是直接的 - 没有用户名/密码验证)?
答案 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
回复中报告EHLO
。 TIdSMTPServer
为您处理所有这些,您唯一需要做的就是将SSLIOHandler分配给服务器并将TIdSMTPServer.UseTLS
属性设置为utUseRequireTLS
或utUseExplicitTLS
。< / p>