【问题标题】:Delphi - Indy - saving GMail draftDelphi - Indy - 保存 GMail 草稿
【发布时间】:2016-02-01 08:39:01
【问题描述】:

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

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

GMail API 应该支持这一点,但提供的示例不是 Delphi/Indy 格式...我正在寻找最小的编程更改,所以我想知道在 Indy 组件中是否也有可能? TIdMessage 允许使用“mfDraft”标志,但这不会阻止在使用 IdSMTP1.Send 时立即发送消息

【问题讨论】:

标签: delphi smtp gmail indy gmail-api


【解决方案1】:

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 我不确定 Indy 的 SelectMailbox 是否返回布尔值。在 Synapse 中确实如此,您可以执行以下操作:if not Imap.SelectFolder('[Gmail]/Drafts') then Imap.SelectFolder('[Gmail]/Concepten');。在这种情况下,帐户的语言可以设置为英语或荷兰语。之后您也可以这样做:Imap.AppendMess(Imap.SelectedFolder, m.Lines); 这样您就不必再次提供草稿或概念。你永远不知道是否有人,甚至是荷兰人,将他的 Gmail 设置为英语(比如我)。所以你需要检查两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2023-04-08
    • 1970-01-01
    • 2018-04-14
    • 2017-09-28
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多