我有一个在端口 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 服务器(例如 yahoo
或 gmail
)发送邮件时,它出现在端口 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
属性设置为 utUseRequireTLS
或 utUseExplicitTLS
。
关于delphi - 25端口接收邮件是否可以实现SSL连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26442418/