2011-04-11 24 views
3

こちらのヒントはhereです。「SSLネゴシエーションコマンドを開始できませんでした」というメッセージをGmailに送信できません。エラー

私はlibeay32.dllとssleay32.dllをwin32フォルダに持っています。

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; 

編集:

あなたのIOHandlerのOnStatusInfoイベントにイベントハンドラを割り当てることにより、SSLステータス情報をログに記録することができます

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; 

多分これはあなたについての手掛かりを与えます交渉に失敗した。

PS:Indy 9.0.0.18にあるので、状況が変わっている可能性があります。

EDIT2:

助けない上記場合は、ファイアウォール/ smtp.gmail.comをブロックしているウイルス対策またはポート587

+0

は、ご返信いただきありがとうございます! SSLOptions.Methodを変更しても問題は解決しません!私はそれをsslvTLSv1に設定しました。 – Peacelyk

+0

ちょっとフォックス、私のウイルス対策プログラムがそのポートをブロックしたことが判明しました。あなたの投稿を編集すれば、私はそれを答えとして受け入れます! – Peacelyk

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オブジェクトを使用していますが、動的にインディコンポーネントを作成...

+0

うーん...私はまだ同じ結果を得る。問題が他の場所にあるようです。 – Peacelyk

+0

@Peacelyk:ファイアウォールやプロバイダがGmailやポート587をブロックしている可能性はありますか? Gmailがあなたの会社によってブロックされている可能性がありますか? –

+0

gmailは確実にブロックされません。ポート587についてはわかりません! – Peacelyk

関連する問題