无法通过SSL将IdPop3连接到IdPop3Server

时间:2014-09-30 18:04:06

标签: delphi email ssl indy pop3

我在一个应用程序中有一个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;我向你们寻求帮助。

1 个答案:

答案 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()