2014-09-30 4 views
3

TIdPop3Server Я имею в одно приложение на которое имеет IdServerIOHandlerSSLOpenSSL1 прикрепленную к нему и получающий электронную почту и отправляет их клиенту TIdPop3 в другом приложении (с TIdSSLIOHandlerSocketOpenSSL прилагается к нему). Все нормально, когда соединения становятся неустойчивыми с помощью порта 110. Но когда я пытаюсь использовать соединение SSL через порт 995, я получаю ошибку Connection Closed Gracefully после того, как соединение attemp с клиентом завершится с ошибкой. Это мое Pop3SeverOnConnect событие:Невозможно подключиться к IdPop3 IdPop3Server через SSL

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, я получаю успешное SSL-соединение для порта 995. Поэтому проблема должна быть где-то в процедуре клиента, но кто знает - вот почему я прошу вас, ребята, о помощи.

ответ

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().

+0

Таким образом, '' UseTLS: = utUseImplicitTLS'' делает разницу. Спасибо, опять Remy :) –

Смежные вопросы