我在一个应用程序中有一个TIdPop3Server
,其中附加了IdServerIOHandlerSSLOpenSSL1
并检索电子邮件并将其发送到另一个应用程序中的TIdPop3
客户端(附加TIdSSLIOHandlerSocketOpenSSL
它)。当使用端口110使连接不安全时,一切都很好。但是当我尝试通过端口995使用SSL
连接时,在从客户端连接尝试失败后,我得到错误Connection Closed Gracefully
。这是我的Pop3SeverOnConnect
事件:
procedure TMainForm.Pop3ServerConnect(AContext: TIdContext);
begin
if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough :=
(AContext.Binding.Port <> 995);
showmessage('SSL connection made!');
end;
这是客户端:
procedure TMainForm.btnCheckMailBoxClick(Sender: TObject);
begin
IdSSLIOHandlerSocketOpenSSL1.PassThrough := False;
POP3Client.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
with POP3Client do begin
AuthType := patUserPass;
Host := myHost;
UserName := myUserName;
Password := myPass;
Port := myPort;
end;
try
POP3Client.Connect;
Except on e : Exception do
showmessage('error=' + e.Message);
end;
// code for retrieving message data
end;
我总是从Pop3Client.Connect
获得例外情况,就像上面已经提到的那样(服务器应用程序中的消息SSL connection made!
永远不会显示)。如果我使用另一个邮件客户端,例如Mozilla Thunderbird
,我为端口995实现了一个成功的SSL连接。所以问题应该在客户端的程序中,但是谁知道 - 这就是为什么我和#39;我向你们寻求帮助。
答案 0 :(得分:5)
在您的客户端代码中,您需要直接设置TIdPOP3.UseTLS
属性而不是TIdSSLIOHandlerSocketOpenSSL.PassThrough
属性,例如:
procedure TMainForm.btnCheckMailBoxClick(Sender: TObject);
begin
with POP3Client do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
AuthType := patUserPass;
UseTLS := utUseImplicitTLS; // <-- here
Host := myHost;
UserName := myUserName;
Password := myPass;
Port := myPort;
end;
try
POP3Client.Connect;
try
// code for retrieving message data
finally
POP3Client.Disconnect;
end;
except
on e : Exception do
ShowMessage('error=' + e.Message);
end;
end;
在您的服务器代码中,您需要摆脱ShowMessage()
。 TIdPOP3Server
是多线程的,OnConnect
事件在工作线程的上下文中触发,ShowMessage()
不是线程安全的。如果您必须显示弹出消息,请改用Windows.MessageBox()
。