我一直在Delphi下使用Indy通过gmail帐户使用TIdSMTP和TIdMessage组件发送消息。这绝对没问题。
但是,我的客户端已请求将消息保存到DRAFTS文件夹,以允许他在实际发送之前对(编程创建的)消息进行更改。
GMail API应该支持这一点,但提供的示例不是Delphi / Indy格式......我正在寻找最小的编程更改,所以我想知道Indy组件是否也可以? TIdMessage允许使用“mfDraft”标志,但这并不妨碍在使用IdSMTP1时立即发送消息。发送
答案 0 :(得分:3)
SMTP没有草稿的概念。你必须使用IMAP。
使用TIdIMAP4
登录GMail帐户,调用其SelectMailBox()
方法选择草稿文件夹,然后调用其中一种AppendMsg...()
方法将电子邮件草稿存储到根据需要使用该文件夹。
如果要在发送草稿之前对草稿进行更改,则必须从文件夹(Retrieve...()
或UIDRetrieve...()
方法之一)中检索当前草稿并根据需要进行编辑,然后从文件夹中删除当前草稿(DeleteMsgs()
或UIDDeleteMsg()
方法),并将新草稿附加到文件夹中。
要实际发送草稿,您必须从草稿文件夹中检索并删除草稿,然后使用SMTP发送草稿。
答案 1 :(得分:2)
好的,对于将来阅读此主题的人来说......这里需要的代码: (gebr和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;