2

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

4

2 回答 2

4

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

一些 IMAP 服务器添加了非标准字段,您可以在FETCH其中包含消息有效负载的加密哈希。但是,这些仍然是非标准的。

于 2013-04-29T06:28:26.130 回答
2

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

于 2013-04-28T18:26:37.653 回答