【问题标题】:Flag and Delete GMail Messages with Delphi/Indy使用 Delphi/Indy 标记和删除 GMail 邮件
【发布时间】:2020-01-26 03:06:16
【问题描述】:

如何使用 Delphi 10.3.3/stock Indy 在 GMail 中删除和标记邮件。

以下方法不起作用(我省略了 try/finally 压缩代码的东西):

var
  imap: TIdIMAP4;
  msg: TIdMessage;
  ...
  imap := TIdIMAP4.Create(nil);
  ...
  if imap.SelectMailBox('INBOX') then
  begin
    for i := 1 to imap.MailBox.TotalMsgs do
    begin
      imap.Retrieve(i, msg);
      imap.getUID(i, UID);
      ...
      imap.UIDStoreFlags(UID, sdReplace, msg.Flags - [mfSeen]);  -> DOESNT WORK
      ...
      imap.UIDStoreFlags(UID, sdReplace, msg.Flags + [mfAnswered]);  -> DOESNT WORK
      ...
      imap.UIDDeleteMsg(UID); -> DOESNT WORK
      ...
    end;
  end;
  ...
  imap.disconnect;
  imap.free;
  ...

有没有我省略的更新语句?还是我需要在 gmail 帐户中进行特殊设置?

更新:删除现在有效,但仍未设置标志。删除显示稍有延迟,但标志仍然存在...

【问题讨论】:

    标签: delphi imap indy flags


    【解决方案1】:

    找到解决方案:是我的急躁造成的。

    标志更改会在 GMail 中反映出来最多需要几分钟时间。当我正在构建一个每 30 秒运行一次的转发器时,我将存储过去一小时左右看到的消息的 UID,并将此列表也考虑在内。

    【讨论】:

    • 我看到商店立即反映。是否有可能您正在做一些不适当的缓存?
    • Gmail 网络用户界面可能需要一些时间来反映 IMAP 所做的更改。
    • 是的,Web 界面有延迟反映,但在我设置的 delphi 守护程序中也有反映,但在下次连接时看不到它。我使用原始 Indy 组件并在非常“回合”之后断开连接。但是,使用我的 UID 列表,它可以正常工作,因为我在转发后删除了消息。
    • @MichaSchumann 如果您每 30 秒扫描一次新电子邮件,那么您没有有效地使用 IMAP。您不应在每次扫描后断开连接。只需保持连接打开并使用 IMAP 的IDLE command 即可实时接收新电子邮件,无需轮询。不过Indy does not support IDLE at this time,但是手动实现应该不难。另外,不要调用UIDStoreFlags() 两次,一次是减法,然后是加法。根据需要修改标志,然后使用单个调用。
    • 感谢您的建议。我已经认识到连接需要很多时间。我将尝试实现 IDLE。关于标志 - 我只在我的代码示例中展示了我在不同部分所做的事情,当然我只使用一个调用。
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 2023-04-08
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多