2010-01-27 179 views
6

我想使用Gmail帳戶,這些設置發送電子郵件(Delphi 7中,印10):印第安納波利斯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

首先,您是否驗證過該代碼是否與其他電子郵件服務器一起工作?

前段時間有人提到他們在使用Indy TIdHTTP組件接受http請求的某些服務器時遇到問題。原因是他們的Indy包括作爲用戶代理的一部分:

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

當他們去掉印圖書館它的工作。很明顯,Indy已經創建了一些惡意Web服務,所以一些站點會拒絕與它創建的應用程序的連接。

我不確定您使用的組件是否具有任何類型的UserAgent屬性。但是如果它確實如此,則將任何對Indy的引用無效。

+1

UserAgent用於HTTP請求,而不是SMTP – glob 2010-01-28 02:45:06

+0

** glob **您是正確的;我最後說「我不確定你使用的組件是否具有任何類型的UserAgent屬性」 – 2010-01-28 15:44:57

4

是的,我看到很多與indy10和tls(通常爲gmail)有關的問題。

首先確保您有最新的SSL庫from here

我見過間歇攤位和錯誤已經在印第安納波利斯的前沿版本(即非穩定版)得到了解決。看到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 2011-08-04 13:43:37

+0

TIdSSLContext.Create.Free創建一個對象並立即釋放它。如果無法創建TIdSSLContext對象,則觸發異常。 – glob 2011-08-09 07:34:11

1

測試Indy時,應確保選中「停止Delphi異常」(工具,調試器選項,語言異常)。

一些例程,特別是idSMTP.Send,'吃'(或隱藏)導致掛斷的異常。