2010-01-27 4 views
6

Я пытаюсь отправить сообщение электронной почты с помощью аккаунта Gmail (Delphi 7, Indy 10) с этими параметрами:Indy 10 - IdSMTP.Send() виснет при отправке сообщений из GMail счета

TIdSmtp:

Port = 587; 
UseTLS := utUseExplicitTLS; 

TIdSSLIOHandlerSocketOpenSSL:

SSLOptions.Method := sslvTLSv1; 

Все, кажется, устанавливается в порядке. Я получаю этот ответ:

Resolving hostname smtp.gmail.com. 
Connecting to 74.125.77.109. 
SSL status: "before/connect initialization" 
SSL status: "before/connect initialization" 
SSL status: "SSLv3 write client hello A" 
SSL status: "SSLv3 read server hello A" 
SSL status: "SSLv3 read server certificate A" 
SSL status: "SSLv3 read server done A" 
SSL status: "SSLv3 write client key exchange A" 
SSL status: "SSLv3 write change cipher spec A" 
SSL status: "SSLv3 write finished A" 
SSL status: "SSLv3 flush data" 
SSL status: "SSLv3 read finished A" 
SSL status: "SSL negotiation finished successfully" 
SSL status: "SSL negotiation finished successfully" 
Cipher: name = RC4-MD5; description = RC4-MD5     SSLv3 Kx=RSA  Au=RSA Enc=RC4(128) Mac=MD5 
; bits = 128; version = TLSv1/SSLv3; 

А потом он висит и не заканчивается. Электронная почта не отправляется. В чем проблема?

ответ

3

Проблема была проста. Я не был достаточно терпелив, и приложение не зависало, был длительный тайм-аут. Таймаут был результатом неправильных настроек.

1

Прежде всего, вы подтвердили, что код работает с другими почтовыми серверами?

Некоторое время назад кто-то упоминал, что у них были проблемы с некоторыми серверами, принимающими HTTP-запросы с компонентом Indy TIdHTTP. Причина в том, что они были включены Инди как часть UserAgent:

 Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)'; 

Когда они удалены Indy Library он работал. Очевидно, что с Indy появились некоторые злокачественные веб-сервисы, поэтому некоторые сайты откажутся от подключений от приложений, созданных с ним.

Я не уверен, что компонент, который вы используете, имеет какое-либо свойство UserAgent. Но если это так, исключите любые ссылки на Indy.

+1

UserAgent предназначен для HTTP-запросов, а не SMTP – glob

+0

** glob ** вы правы; В заключение я сказал: «Я не уверен, что компонент, который вы используете, имеет какое-либо свойство UserAgent» –

4

Да, я видел много проблем с indy10 и tls (обычно gmail).

первого убедитесь, что у вас есть последние библиотеки Ssl from here

я видел, прерывистые киоски и ошибки, которые были решены в кровоточащих краях версии Indy (то есть. Не-стабильный релиз). см http://www.indyproject.org/sockets/download/svn.DE.aspx

для Gmail, я обычно использую implicityTLS порт 465 ..

idSmtp := TIdSMTP.Create(nil); 
    try 
    idSmtp.IOHandler := nil; 
    idSmtp.ManagedIOHandler := true; 

    // try to use SSL 
    try 
     TIdSSLContext.Create.Free; 
     idSmtp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSmtp); 
     if (smtpSettings.port = 465) then 
     idSmtp.UseTLS := utUseImplicitTLS 
     else 
     idSmtp.UseTLS := utUseExplicitTLS; 
    except 
     idSmtp.IOHandler.Free; 
     idSmtp.IOHandler := nil; 
    end; 

    if (idSmtp.IOHandler = nil) then 
    begin 
     idSmtp.IOHandler := TIdIOHandler.MakeDefaultIOHandler(idSmtp); 
     idSmtp.UseTLS := utNoTLSSupport; 
    end; 

    // send message, etc 

    finally 
    idSmtp.Free; 
    end; 
+0

Отлично! Ваш пост помог мне. Мое приложение также зависало во время smtp.send. Я думаю, что ключ был опцией utUseImplicitTLS, но я также не понимаю, что делает этот TIdSSLContex.Create.Free. – Tamm

+0

TIdSSLContext.Create.Free создает объект и немедленно освобождает его. Это должно вызвать исключение, если объект TIdSSLContext не может быть создан. – glob

1

При тестировании Indy вы должны быть уверены, что установлен флажок «Остановить на исключениях Delphi» («Инструменты», «Параметры отладчика», «Исключения языка»).

Некоторые процедуры, в частности idSMTP.Send, «ест» (или скрывает) исключения, приводящие к зависанию.