2014-10-12 7 views
-2

Im пытается отправить почту, используя этот код:Отправка почты с помощью Indy и SMTP

With IdMessage1 Do Begin 
    Recipients.EMailAddresses := '[email protected]'; 
    From.Address    := '[email protected]'; 
    From.Name     := edit_from.Text; 
    CCList.EMailAddresses  := ''; 
    BccList.EMailAddresses := ''; 
    Priority     := mpNormal; 
    Subject     := edit_subject.Text; 
    Body.Add(memo_body.Lines.Text); 
End; 

With IdSMTP1 Do Begin 
    Host  := 'smtp.gmail.com'; 
    Username := '[email protected]'; 
    Password := '*****'; 
    IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self); 
    Port  := 465; 
    UseTLS := utUseImplicitTLS; 

    Try 
    Connect; 
    Except 
    End; 

    If Not Connected Then Begin 
    Showmessage('Error'); 
    Exit; 
    End; 

    Try 
    Send(IdMessage1); 
    Finally 
    Disconnect; 
    End; 
End; 

Он отлично работает на моем компьютере, но когда я протестировать его на других машинах «ERROR» (Ошибка в If блоке позапрошлой Try блок) будет поднят ... Где проблема?

+3

Вы установили библиотеки OpenSSL на другие компьютеры? –

+3

Что такое «ERROR»? –

+2

Ошибка, вероятно, говорит вам, что библиотеки DLL отсутствуют. И вы никогда не должны задавать вопрос об ошибке в вашем коде, не сообщая нам сообщение об ошибке/код. –

ответ

1

Это не правильный способ обработки ошибок с помощью Indy. Это должно быть больше, как это вместо:

With IdSMTP1 Do Begin 
    IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self); 
    UseTLS := utUseImplicitTLS; 
    Host  := 'smtp.gmail.com'; 
    Username := '[email protected]'; 
    Password := '*****'; 
    Port  := 465; 

    Try 
    Connect; 
    Try 
     Send(IdMessage1); 
    Finally 
     Disconnect; 
    End; 
    Except 
    Showmessage('Error'); 
    Exit; 
    End; 
End; 

Send() и Disconnect() может не так легко, как Connect() может. Если вы хотите Connect() быть в своем собственном try/except блоке, то, по крайней мере, не использовать Connected для подтверждения того, удалось Connect():

Try 
    Connect; 
Except 
    Showmessage('Error connecting'); 
    Exit; 
End; 

Try 
    Try 
    Send(IdMessage1); 
    Finally 
    Disconnect; 
    End; 
Except 
    Showmessage('Error sending'); 
    Exit; 
End; 

Это, как говорится, исключение говорит вам, что на самом деле не удалось, так что не игнорировать его , Если бы вы отображается его содержимое, вы бы имели лучшее представление о том, что терпел неудачу, например:

Except 
    on E: Exception do 
    Begin 
    ShowMessage(Format('Error!'#10'[%s] %s', [E.ClassName, e.Message])); 
    Exit; 
    End; 
End; 

Наиболее вероятным виновником является то, что вы не развернуть библиотеки DLL OpenSSL с вашим приложением. Вы можете скачать их с OpenSSL's website или от Indy's Fulgan mirror.

+0

Я использовал исключение, и я получил сообщение «Ошибка сокета # 11001 - Хост не найден» – Armin

+0

Тогда подсистема DNS вашей машины сталкивается с проблемой разрешения smtp.gmail.com на IP-адрес. Это вне Индии. Сам Indy отлично работает с GMail, когда он способен подключиться. –

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