2015-11-01 78 views
6

我一直在Delphi下使用Indy通過gmail帳戶發送消息,使用TIdSMTP和TIdMessage組件。這工作絕對好。Delphi - Indy - 保存GMail草稿

但是,我的客戶請求將消息保存到DRAFTS文件夾,以允許他在實際發送消息之前對(編程創建的)消息進行更改。

GMail API應該支持這個,但是提供的例子不是Delphi/Indy格式的......我在尋找最少的編程修改,所以我想知道它是否可能在Indy組件中? TIdMessage允許使用「mfDraft」標誌,但這並不妨礙在使用IdSMTP1時立即發送消息。發送

+1

相關:http://stackoverflow.com/questions/ 1206275 /創建消息,即草稿在gmail-with-imap-smtp – mjn

+0

它應該是GMail草稿文件夾... – Jur

回答

3

SMTP沒有草稿的概念。您必須改用IMAP。

使用TIdIMAP4登錄到Gmail帳戶,調用其SelectMailBox()方法選擇草稿文件夾,然後調用它的AppendMsg...()方法之一的電子郵件草稿保存到文件夾需要。

如果要在發送草稿之前對草稿進行更改,則必須從文件夾(Retrieve...()UIDRetrieve...()方法之一)中檢索當前草稿,並根據需要進行編輯,然後從草稿中刪除當前草稿文件夾(DeleteMsgs()UIDDeleteMsg()方法),並將新草稿追加到文件夾中。

要實際發送草稿,您必須從草稿文件夾中檢索並刪除草稿,然後使用SMTP發送它。

2

OK,任何人閱讀此線程在未來...這裏是需要的代碼: (兄弟公司和ww是用戶名和密碼)

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

不幸的是,此代碼僅適用於英文帳戶;例如,在荷蘭accoutn郵箱名稱應該是「[Gmail]/Concepten」 – Jur

+0

@Jur我不確定Indy的SelectMailbox是否返回布爾值。在Synapse中,你可以做這樣的事情:'if if Imap.SelectFolder('[Gmail]/Drafts'),然後是Imap.SelectFolder('[Gmail]/Concepten');'。在這種情況下,帳戶的語言可以設置爲英語或荷蘭語。之後,你也可以這樣做:'Imap.AppendMess(Imap.SelectedFolder,m.Lines);'所以你不必再提供草稿或概念。你永遠不知道是否有人,甚至是荷蘭人,他的Gmail設置爲英語(像我一樣)。所以你需要檢查兩者。 – Rik