Delphi - Indy - 保存GMail草稿

问题描述:

我一直在Delphi下使用Indy通过gmail帐户发送消息,使用TIdSMTP和TIdMessage组件。这工作绝对好。Delphi - Indy - 保存GMail草稿

但是,我的客户请求将消息保存到DRAFTS文件夹,以允许他在实际发送消息之前对(编程创建的)消息进行更改。

GMail API应该支持这个,但是提供的例子不是Delphi/Indy格式的......我在寻找最少的编程修改,所以我想知道它是否可能在Indy组件中? TIdMessage允许使用“mfDraft”标志,但这并不妨碍在使用IdSMTP1时立即发送消息。发送

+1

相关:http://*.com/questions/ 1206275 /创建消息,即草稿在gmail-with-imap-smtp – mjn

+0

它应该是GMail草稿文件夹... – Jur

SMTP没有草稿的概念。您必须改用IMAP。

使用TIdIMAP4登录到Gmail帐户,调用其SelectMailBox()方法选择草稿文件夹,然后调用它的AppendMsg...()方法之一的电子邮件草稿保存到文件夹需要。

如果要在发送草稿之前对草稿进行更改,则必须从文件夹(Retrieve...()UIDRetrieve...()方法之一)中检索当前草稿,并根据需要进行编辑,然后从草稿中删除当前草稿文件夹(DeleteMsgs()UIDDeleteMsg()方法),并将新草稿追加到文件夹中。

要实际发送草稿,您必须从草稿文件夹中检索并删除草稿,然后使用SMTP发送它。

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