Indy 10 - IdSMTP.Send()在从GMail帐户发送邮件时挂起

时间:2010-01-27 08:51:06

标签: delphi smtp gmail delphi-7 indy

我正在尝试使用这些设置使用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 个答案:

答案 0 :(得分:4)

是的,我在indy10和tls(通常是gmail)中看到了很多问题。

首先确保您拥有最新的ssl库from here

我已经看到在indy的最新版本(即非稳定版本)中已经解决的间歇性失速和错误。见http://www.indyproject.org/sockets/download/svn.DE.aspx

对于gmail,我通常在端口465上使用implicityTLS ..

  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;

答案 1 :(得分:3)

问题很简单。我没有耐心,应用程序没有挂起,有很长的超时。超时是错误设置的结果。

答案 2 :(得分:1)

首先,您确认代码是否正在与其他电子邮件服务器一起使用?

前段时间有人提到他们在使用Indy TIdHTTP组件接受http请求的某些服务器时出现问题。原因是他们将Indy作为使用者的一部分包括在内:

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

当他们删除了 Indy Library 时,它就有效了。显然,Indy创建了一些恶意Web服务,因此一些站点将拒绝使用它创建的应用程序的连接。

我不确定您使用的组件是否具有任何类型的UserAgent属性。但如果确实如此,则取消对Indy的任何引用。

答案 3 :(得分:1)