使用 IMAP 发送邮件:如何检测邮件已从一个文件夹移动到另一个文件夹?

Posted

技术标签:

【中文标题】使用 IMAP 发送邮件:如何检测邮件已从一个文件夹移动到另一个文件夹?【英文标题】:Mailing with IMAP: How to detect that a message has been moved from one folder to another? 【发布时间】:2013-04-22 08:31:33 【问题描述】:

使用 JavaMail API 和 IMAP,我想知道一条消息已从文件夹 a 移动到 b。我怎么能在不添加听众的情况下做到这一点?我的意思是我想在登录帐户并打开文件夹时发现消息的变化。

问题是,如果您在文件夹 a 中有 3 条 id 为 1 2 和 3 的消息,并且您将 id 为 3 的消息移动到文件夹 B,则消息的 id 会更改,并且我们在文件夹 B 中有一条 id 为 1 的消息.

我的目标是将邮件服务器中的消息结构与我自己的本地服务器同步。我必须自己保留所有消息信息、标志等。所以每次登录时,我都必须发现对存储在邮件服务器中的消息所做的所有更改。

我可以通过以下方式收到新邮件或未读邮件:

Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.RECENT), true));

或通过

Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));

但我不仅对新邮件感兴趣,我还想知道对旧邮件所做的更改,例如我想了解一下:

2 个月前已阅读的邮件已移至另一个文件夹。

我的想法是,

因为 uids 改变了,我不能用它来识别邮件。 我想我必须使用诸如主题发件人接收日期之类的邮件信息,构建它们的哈希值并比较每次登录时消息的哈希值。但会导致性能问题。

【问题讨论】:

【参考方案1】:

您无法在 IMAP 中执行此操作。跟踪 Message-Id 标头可能会让您成功一半,但您必须添加各种检查极端情况,例如重复的消息 ID(是的,它们应该是唯一的)等。还有请记住,基线 IMAP 为您提供的是对单个邮箱的良好同步视图,而不是在组合时对一组邮箱的原子视图。这意味着即使用户在文件夹 A 和 B 之间“移动”了一条消息,它也很可能在 A 和 B 中对于您的脚本可见更长时间。

一些 IMAP 服务器添加了非标准字段,您可以使用 FETCH 包含消息负载的加密哈希。不过,这些仍然是非标准的。

【讨论】:

使用thunderbird时,当我从另一个工具创建一个文件夹并将一个非常旧的消息移动到新文件夹时,当单击文件夹时,thunderbird会立即获取新文件夹和新消息。雷鸟是否知道通过从开始获取所有消息并应用某种比较,或者邮件服务器是否提供特定信息,例如 x 从 a 移动到 b? 我用一个包含 2000 条消息的邮件帐户对其进行了测试。当我将一封非常旧的邮件从其文件夹移动到另一个文件夹时(除了雷鸟之外的不同邮件客户端工具、基于 Web 的 qmail 引擎、松鼠邮件),当我单击雷鸟上的文件夹时,移动的邮件消失了。雷鸟怎么能这么快学会呢? 您询问了如何检测“移动”。 IMAP 仅提供有关“邮件 A 从邮箱 X 消失”和“邮件 B 出现在邮箱 Y”的信息。没有简单可靠的方法来检测 A == B。UIDPLUS 扩展在某些情况下可以提供帮助,但它远不是一个完整的解决方案。 一个电子邮件客户端刚刚发现邮件在一个文件夹中消失了。它通过在您连接到它时获取UID 列表来实现这一点。当您查看该文件夹时,它将在新文件夹中重新下载它,当它获得该文件夹的UID 列表时。【参考方案2】:

您可以尝试使用 rfc822-header 信息,它包含一个 message-id,例如 blablabla@mail.gmail.com,当邮件移动到文件夹中时,它不应该改变。但是你必须抓取用户的所有邮件头来同步这个,至少我不知道有一种方法来检索移动的邮件

【讨论】:

正要回答这个问题。 Message-ID 正是使用的正确字段...当然,必须将邮件复制到多个文件夹中,并且并非所有邮件都有 Message-ID(草稿...? ) 并非所有消息都有Message-Id 标头,遗憾的是,不能保证此标头是唯一的。对于 Internet 协议和 RFC,您不能依赖 SHOULD 措辞。 但此页面显示:***.com/questions/219343/… Message-ID 在大多数情况下是唯一的,但并非在所有情况下都是唯一的。尤其是自动发件人通常会生成相同的 ID,或者您根本没有(我也见过空的 - Message-ID:)

以上是关于使用 IMAP 发送邮件:如何检测邮件已从一个文件夹移动到另一个文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

使用 phpmailer 发送的邮件不会转到“已发送”IMAP 文件夹

如何用IMAP协议收取未读邮件

outlook邮箱怎么设置IMAP

如何使用此 IMAP 库发送电子邮件

如何使用 mailkit/mimekit IMAP 下载/保存所有收件箱/发送的电子邮件?

发啥我手机发送电子邮件发不出去呢?他老是提示“网络服务器错误”,请高手指点。手机该怎样设置?