2011-04-11 53 views
3

我跟隨的提示是here向gmail發送消息失敗,並顯示「啓動SSL協商命令失敗。」錯誤

我在win32文件夾中有libeay32.dll和ssleay32.dll。

DFM文件:

object tidSMTP: TIdSMTP 
    IOHandler = tidSMTP_SSL 
    SASLMechanisms = <> 
    UseTLS = utUseExplicitTLS 
    end 
    object tidSMTP_SSL: TIdSSLIOHandlerSocketOpenSSL 
    Destination = 'smtp.gmail.com:587' 
    Host = 'smtp.gmail.com' 
    MaxLineAction = maException 
    Port = 587 
    DefaultPort = 0 
    SSLOptions.Mode = sslmUnassigned 
    SSLOptions.VerifyMode = [] 
    SSLOptions.VerifyDepth = 0 
    end 

和發送按鈕單擊事件:

procedure TForm1.btnSendClick(Sender: TObject); 
var 
    mes:TIdMessage; 
    fromAddress:TIdEmailAddressItem; 
    toAddress:TIdEMailAddressItem; 
begin 
    tidSMTP.Username := txtUsername.Text; 
    tidSMTP.Password := txtPassword.Text; 
    tidSMTP.Host := txtSMTPserver.Text;   //smtp.gmail.com 
    tidSMTP.Port := StrToInt(txtSMTPport.Text); //587 

    fromAddress := TIdEMailAddressItem.Create; 
    fromAddress.Address := txtUsername.Text; 

    toAddress := TIdEMailAddressItem.Create; 
    toAddress.Address := txtTo.Text; 

    mes := TIdMessage.Create; 
    mes.ContentType := 'text/plain'; 
    mes.From := fromAddress; 
    mes.ReceiptRecipient := toAddress; 
    mes.Subject := txtSubject.Text; 

    mes.Body := memoText.Lines; 

    tidSMTP.Connect; 
    tidSMTP.Send(mes); 
    tidSMTP.Disconnect; 
end; 

任何幫助,將不勝感激!

回答

4

將SSL方法設置爲SSL版本3(tidSMTP_SSL.SSLOptions.Method)。我認爲它默認爲SSL版本2,但GMail不支持。

SSLOptions.Method := sslvSSLv3; 

編輯:

tidSMTP_SSL.OnStatusInfo := DoOnStatusInfo; 

proceudre TForm1.DoOnStatusInfo(Msg: string); 
begin 
    // when running from IDE, message will appear in 
    // EventLog (Ctrl+Alt+V), otherwise, 
    // use DebugViewer.exe 
    OutputDebugString(PChar(Msg)); 
end; 

也許這會給你一個線索:

可以通過分配的事件處理程序到您的IOHandler的OnStatusInfo事​​件日誌中SSL狀態信息談判失敗。 PS:我在Indy 9.0.0.18上,所以事情可能已經改變了。

EDIT2:

如果上面沒有幫助,請檢查如果沒有防火牆/防毒正在阻止smtp.gmail.com或端口587

+0

謝謝您的回覆!更改SSLOptions.Method並不能解決這個問題!我把它設置爲sslvTLSv1。 – Peacelyk 2011-04-11 09:38:58

+0

嗨福克斯,事實證明,我的防病毒程序阻止該端口。編輯您的文章,我會接受它作爲答案! – Peacelyk 2011-04-11 13:12:09

1

我成功地使它像這樣工作:

procedure TForm1.btn2Click(Sender: TObject); 
var 
    email  : TIdMessage; 
    idSMTPGMail: TIdSMTP; 
    idSSLGMail : TIdSSLIOHandlerSocketOpenSSL; 
begin 
    idSSLGMail     := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    idSSLGMail.SSLOptions.Method := sslvTLSv1; 
    idSSLGMail.SSLOptions.Mode := sslmUnassigned; 

    idSMTPGMail     := TIdSMTP.Create(nil); 
    idSMTPGMail.IOHandler  := idSSLGMail; 
    idSMTPGMail.UseTLS   := utUseExplicitTLS; 

    email       := TIdMessage.Create(nil); 
    email.From.Address    := txtUsername.Text; 
    email.Recipients.EMailAddresses := txtTo.Text; 
    email.Subject     := txtSubject.Text; 
    email.Body.Text     := memoText.Text; 

    idSMTPGMail.Host  := 'smtp.gmail.com'; 
    idSMTPGMail.Port  := 587; 
    idSMTPGMail.UserName := txtUsername.Text; 
    idSMTPGMail.Password := txtPassword.Text; 

    idSMTPGMail.Connect; 
    idSMTPGMail.Send(email); 
    idSMTPGMail.Disconnect; 

    email.Free; 
    idSSLGMail.Free; 
    idSMTPGMail.Free; 
    Beep; 
end; 

我用同樣的TEDIT,TMemo,但動態創建Indy組件...

+0

嗯...我仍然得到相同的結果。似乎問題存在於其他地方。 – Peacelyk 2011-04-11 10:12:44

+0

@ Peacelyk:也許你的防火牆或提供商阻止Gmail或端口587? gmail是否被貴公司封鎖? – 2011-04-11 10:16:06

+0

gmail絕對不會阻止,不知道端口587! – Peacelyk 2011-04-11 10:39:07