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

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

你不能在IMAP中这样做。 跟踪Message-Id标头可能会让你到达一半,但是你必须为重复的消息ID添加各种检查(是的,它们应该是唯一的)等等。还要记住什么是基线IMAP为您提供单个邮箱的良好同步视图,而不是组合时一组邮箱的primefaces视图。 这意味着即使用户在文件夹A和B之间“移动”了一条消息,在A和B中也可以在较长时间内为脚本显示它。

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

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