Delphi - Indy - 保存Gmail草稿

6
我一直在使用Delphi下的Indy组件通过Gmail帐户发送消息,使用TIdSMTP和TIdMessage组件。这个工作非常好。
但是,我的客户要求将消息保存到草稿文件夹中,以便他在实际发送之前对(程序创建的)消息进行更改。
GMail API应该支持此功能,但提供的示例不是Delphi/Indy格式...我正在寻找最小的编程更改,因此想知道Indy组件是否也可以实现?TIdMessage允许设置“mfDraft”标志,但是当使用IdSMTP1.Send时,这并不能防止消息立即被发送。

1
相关:https://dev59.com/EXM_5IYBdhLWcg3w1G-N - mjn
应该是GMail的草稿文件夹... - Jur
2个回答

3

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

使用TIdIMAP4登录GMail帐户,调用其SelectMailBox()方法选择草稿文件夹,然后调用其AppendMsg...()方法根据需要将电子邮件的草稿存储到文件夹中。

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

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


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;

不幸的是,这段代码只适用于英语账户;例如,在荷兰账户上,邮箱名称应为“[Gmail]/Concepten”。 - Jur
@Jur 我不确定Indy的SelectMailbox是否返回布尔值。在Synapse中,它确实是这样的,你可以像这样做:if not Imap.SelectFolder('[Gmail]/Drafts') then Imap.SelectFolder('[Gmail]/Concepten');。在这种情况下,帐户的语言可能设置为英语或荷兰语。之后,你还可以这样做:Imap.AppendMess(Imap.SelectedFolder, m.Lines);,这样你就不必再提供draft或concepten了。你永远不知道有人,甚至是荷兰人,是否将他的Gmail设置为英语(就像我一样)。所以你需要检查两个。 - Rik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接