2015-11-01 16 views
6

私は、DelphiでIndyを使用して、TIdSMTPとTIdMessageコンポーネントを使用して、Gmailアカウント経由でメッセージを送信してきました。これは絶対にうまくいく。Delphi - Indy - saving GMail draft

私のクライアントは実際に送信する前に(プログラムで作成された)メッセージに変更を加えるためにメッセージをDRAFTSフォルダに保存するように要求しました。

GMail APIはこれをサポートしていますが、提供されている例はDelphi/Indyの形式ではありません...私はIndyのコンポーネントでも可能かどうかを知りたいので、 ? TIdMessageでは "mfDraft"フラグを使用できますが、IdSMTP1.Sendを使用しているときにメッセージがすぐに送信されることはありません。

+1

関連(GEBRとWWは、ユーザー名とパスワードです):http://stackoverflow.com/questions/ 1202275/creating-messages-ie-draft-in-imap-smtp – mjn

+0

それはGmailの下書きフォルダであるべきです... – Jur

答えて

3

SMTPにはドラフトの概念はありません。代わりにIMAPを使用する必要があります。

使用TIdIMAP4は、ドラフトフォルダを選択するために、そのSelectMailBox()メソッドを呼び出して、Gmailアカウントにログインし、必要に応じてフォルダに電子メールのドラフトを保存するためにそのAppendMsg...()の方法のいずれかを呼び出します。

送信する前に下書きを変更する場合は、そのフォルダ(現在の下書き)(Retrieve...()またはUIDRetrieve...()のいずれかの方法)から現在の下書きを取得し、必要に応じて編集し、現在の下書きをフォルダ(DeleteMsgs()またはUIDDeleteMsg()メソッド)を追加し、新しい草案をフォルダに追加します。

実際にドラフトを送信するには、ドラフトフォルダからそのドラフトを取り出して削除し、SMTPを使用して送信する必要があります。将来的にこのスレッドを読んだ人のため

2

OKは、...ここに必要なコードです:

procedure DraftGMail(Info:TIdMessage; gebr,ww:string); 
var 


    IdIMAP41:TIdIMAP4; 
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; 
begin 

    IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.create; 
    try 
    IdSSLIOHandlerSocketOpenSSL1.Destination := 'imap.gmail.com:993'; 
    IdSSLIOHandlerSocketOpenSSL1.host := 'imap.gmail.com'; 
// IdSSLIOHandlerSocketOpenSSL1.MaxLineAction := maException; 
    IdSSLIOHandlerSocketOpenSSL1.Port := 993; 
    IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLversions := [sslvSSLv3]; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := []; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0; 

    IdIMAP41:= TIdIMAP4.create; 
    try 
     IdIMAP41.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 
     IdIMAP41.Host := 'imap.gmail.com'; 
     IdIMAP41.Password := ww; 
     IdIMAP41.Port := 993; 
//  IdSMTP1.SASLMechanisms := <>; 
     IdIMAP41.UseTLS := utUseImplicitTLS; 
     IdIMAP41.Username := gebr; 

     IdIMAP41.Connect; 
//  IdIMAP41.ListMailBoxes(Boxes); 
     IdIMAP41.SelectMailbox('[Gmail]/Drafts'); 
     IdIMAP41.AppendMsg('[Gmail]/Drafts',Info); 
     IdIMAP41.Disconnect; 

    finally 
     FreeAndNil(IdIMAP41); 
    end; 

    finally 
    FreeAndNil(IdSSLIOHandlerSocketOpenSSL1); 

    end; 
end; 
+0

残念ながら、このコードは英語のアカウントでのみ機能します。たとえば、オランダ語ではメールボックス名は「[Gmail]/Concepten」 – Jur

+0

@ Jur IndyのSelectMailboxがブール値を返すかどうかはわかりません。これはImap.SelectFolder( '[Gmail]/Drafts')、次にImap.SelectFolder( '[Gmail]/Concepten'); 'のようにすることができます。その場合、アカウントの言語は英語またはオランダ語に設定できます。その後、Imap.AppendMess(Imap.SelectedFolder、m.Lines);を実行することで、ドラフトや概念を再度指定する必要はありません。誰か、オランダ人であっても自分のGmailが英語のように設定されているかどうかはわかりません。だから両方をチェックする必要があります。 – Rik

関連する問題