Delphi - Indy - 保存 GMail 草稿

Delphi - Indy - saving GMail draft

我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息,使用 TIdSMTP 和 TIdMessage 组件。这绝对没问题。

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

GMail API 应该支持这个,但提供的示例不是 Delphi/Indy 格式...我正在寻找最小的编程更改,所以我想知道它是否在 Indy 组件中也可能吗? TIdMessage 允许使用 "mfDraft" 标志,但这不会阻止在使用 IdSMTP1.Send

时立即发送消息

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

使用TIdIMAP4登录GMail账户,调用其SelectMailBox()方法到select草稿文件夹,然后调用其AppendMsg...()方法之一存储根据需要将电子邮件草稿放入文件夹。

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

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

好的,对于以后阅读此主题的任何人...这是所需的代码: (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;