使用PHP imap移动邮件并清除\Seen标记,单独生效但组合操作失效
问题成因
你的猜测完全正确,标记未读不生效的核心原因是操作顺序错误:
imap_mail_move执行后,原文件夹内的对应邮件会被立刻标记为待删除状态,你后续在原文件夹连接下对旧UID执行的修改标记操作会被IMAP服务器直接忽略- 邮件移动到目标文件夹后会生成全新的UID,原文件夹的旧UID已经失效,无法对应到目标文件夹的新邮件,自然也无法修改它的标记
解决方法
调整操作顺序,先在原文件夹完成未读标记修改,再执行移动操作即可:
// 第一步:原文件夹下先清除已读标记,此时UID仍然有效 imap_clearflag_full($inbox, $uniqueID, '\\Seen', ST_UID); // 第二步:执行邮件移动操作 imap_mail_move($inbox, $uniqueID, 'to_be_processed', CP_UID); // 最后执行expunge清理原文件夹待删除的邮件 imap_expunge($inbox);
如果你确实需要先移动再修改标记,可以在移动完成后切换到目标文件夹,查询到邮件的新UID后再执行清除已读标记的操作,不过这种方式实现复杂度更高,优先推荐调整操作顺序的方案。
邮件标记为已读的触发节点
使用PHP IMAP扩展操作时,邮件默认会在你调用imap_body、imap_fetchbody这类读取邮件正文内容的接口时被自动标记为已读。如果你不需要触发自动标记,可以在调用上述读取接口时添加FT_PEEK参数,就能避免读取时自动标记已读。
内容的提问来源于stack exchange,提问作者senecaTheMeek
相关产品推荐
相关产品推荐

