我有一个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进行通信(在两种情况下都使用我的证书,连接始终是直接的-没有用户名/密码验证)?
在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会话与否,你不能这样做,从服务器端。如果客户端要在端口25上使用SSL / TLS,它将通过EHLO
命令查询服务器的功能,然后STARTTLS
如果服务器STARTTLS
在EHLO
答复中报告,则将命令发送到服务器。TIdSMTPServer
为您处理所有这些操作,您唯一要做的就是为服务器分配一个SSLIOHandler并将TIdSMTPServer.UseTLS
属性设置为utUseRequireTLS
或utUseExplicitTLS
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句