使用 IMAP 获取邮件,获取已删除的邮件

Posted

技术标签:

【中文标题】使用 IMAP 获取邮件,获取已删除的邮件【英文标题】:Fetching mails with IMAP, get deleted messages 【发布时间】:2015-07-17 15:49:28 【问题描述】:

我有一个包含 5000 条消息的邮件帐户,旧的有 4 年。 我使用 Web 界面和 Thunderbird 登录该帐户。 我在 Web 界面中删除了一封非常旧的邮件。然后我在不重新登录的雷鸟上按刷新(获取邮件)。 Thunderbird 立即删除该消息。雷鸟怎么能这么快检测到被删除的消息? 我必须在java(java mail api)中实现so机制,我认为我必须获取所有邮件,并且必须将已经获取的邮件存储在本地,然后我必须逐个比较。 据我所知,消息 id 属性不安全,因此当我将一条消息移动到另一条消息时可以更改它,它们不安全。最好的方法是使用存储在标头中的消息 ID 或使用自定义缓存机制,如下所述:

Mailing with IMAP: How to detect that a message has been moved from one folder to another?

因此,我们如何能如此迅速地获知已删除或移动的消息? 以及如何检测雷鸟新电子邮件?它是否存储最后存储的消息 ID? 但是对于删除的旧消息或移动的消息,唯一的选择是将所有文件夹与本地存储进行比较,我错了吗?

我的想法,我会检查一下thunderbirds的调试模式,看看下层会发生什么。

【问题讨论】:

它将服务器上可用的 UIDS 与本地的 UIDS 进行比较,并删除不再存在的 UIDS,并使用 \Deleted 标志隐藏。 【参考方案1】:

当消息被删除时,服务器会发送一个EXISTS响应,之后客户端可以通过比较它拥有的消息的UID值来确定哪些消息被删除了给服务器上的人。见https://www.rfc-editor.org/rfc/rfc3501#section-7.3.1

【讨论】:

实际上,如果你有一个打开的文件夹连接到服务器,服务器应该发送一个主动的 FETCH 响应,表明设置了 \Deleted 标志,然后是一个 EXPUNGE 响应,表明该消息是真的没了。您可以使用MessageChangedListener 和MessageCountListener 来监听这些事件。如果您处于离线状态,您可以在在线时使用 UID 重新同步您的视图。

以上是关于使用 IMAP 获取邮件,获取已删除的邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 imap 扩展获取原始电子邮件数据?

php imap 从电子邮件地址获取

如何使用 IMAP 发送邮件?

MailKit---获取邮件

PHP 获取超过 20000 封 imap 电子邮件

如何确定是不是通过 imap base64 编码获取邮件?