Indy 10 - IdSMTP.Send () зависает при отправке сообщений из учетной записи GMail - PullRequest
6 голосов
/ 27 января 2010

Я пытаюсь отправить электронное письмо, используя учетную запись gmail (Delphi 7, Indy 10) со следующими параметрами:

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;

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

Ответы [ 4 ]

4 голосов
/ 28 января 2010

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

сначала убедитесь, что у вас установлены последние библиотеки ssl отсюда

Я видел периодические сбои и ошибки, которые были устранены в новейшей версии 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;
3 голосов
/ 17 марта 2010

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

1 голос
/ 24 июля 2010

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

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

1 голос
/ 27 января 2010

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

Некоторое время назад кто-то упомянул, что у него были проблемы с определенными серверами, принимающими http-запросы с компонентом Indy TIdHTTP. Причиной было то, что они включили Indy как часть useragent:

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

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

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

...