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

Java 使用IMAP邮寄:如何检测邮件已从一个文件夹移动到另一个文件夹?,java,imap,jakarta-mail,mailing,Java,Imap,Jakarta Mail,Mailing,通过使用JavaMail API和IMAP,我想了解邮件已从文件夹a移动到文件夹b。我如何在不添加侦听器的情况下做到这一点?我的意思是,我想在登录帐户并打开文件夹时发现邮件的更改 问题是,如果您在文件夹a中有3封id为12和3的邮件,并且您将id为3的邮件移动到文件夹B中,则邮件的id将更改,并且我们在文件夹B中有一封id为1的邮件 我的目标是将邮件服务器中的消息结构与我自己的本地服务器同步。我必须自己保存所有消息信息、标志等。因此,在每次登录时,我必须发现对邮件服务器中存储的邮件所做的所有更改

通过使用JavaMail API和IMAP,我想了解邮件已从文件夹a移动到文件夹b。我如何在不添加侦听器的情况下做到这一点?我的意思是,我想在登录帐户并打开文件夹时发现邮件的更改

问题是,如果您在文件夹a中有3封id为12和3的邮件,并且您将id为3的邮件移动到文件夹B中,则邮件的id将更改,并且我们在文件夹B中有一封id为1的邮件

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

我可以通过以下方式获得新邮件或未读邮件:

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

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

2个月前阅读的邮件已被移动到另一个文件夹

我的想法是

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

您可以尝试使用rfc822头信息,它包含一个消息id,如blablabla@mail.gmail.com当邮件被移动到文件夹中时,不应更改。但是你必须抓取用户的所有邮件头才能同步,至少我不知道如何检索移动的邮件

你不能在IMAP中这样做。跟踪
邮件Id
标题可能会让您半途而废,但您必须添加各种各样的检查,如重复邮件Id(是的,它们应该是唯一的)等。同时请记住,基线IMAP为您提供的是一个与单个邮箱同步良好的视图,组合时不是一组邮箱上的原子视图。这意味着,即使用户在文件夹a和B之间“移动”了一条消息,它也很可能在a和B中对您的脚本可见更长的时间


一些IMAP服务器添加了非标准字段,您可以
获取
,这些字段包含消息负载的加密散列。尽管如此,这些仍然是非标准的。

正准备回答这个问题。消息ID正是要使用的正确字段。。。当然,wil必须考虑邮件被复制到多个文件夹中,并且不是所有邮件都有邮件ID(草稿…?),也不是所有邮件都有
邮件ID
头,遗憾的是,该头不能保证唯一。当涉及到互联网协议和RFC时,您不能依赖于
SHOULD
的措辞。但本页说明:消息ID在大多数情况下是唯一的,但并非在所有情况下都是唯一的。特别是自动发件人通常生成相同的ID,或者您根本没有ID(我也看到过空的ID-邮件ID:)当使用thunderbird时,当我从另一个工具创建文件夹并将非常旧的邮件移动到新文件夹时,thunderbird在单击文件夹时会立即获得新文件夹和新邮件。thunderbird是否知道,通过从start获取所有邮件并应用某种比较,或者邮件服务器是否提供特定信息,例如x从a移动到b?我使用一个包含2000条邮件的邮件帐户对其进行了测试。当我将一封非常旧的邮件从其文件夹移动到另一个文件夹(不同于thunderbird的邮件客户端工具,一种基于web的qmail引擎,squirrel mail)时,当我单击thunderbird上的文件夹时,移动的邮件消失。雷鸟怎么能这么快学会呢?你问过如何检测“移动”。IMAP仅提供有关“邮件A从邮箱X中消失”和“邮件B出现在邮箱Y中”的信息。没有简单可靠的方法来检测A==B。在某些情况下,
UIDPLUS
扩展可以提供帮助,但它远不是一个完整的解决方案。电子邮件客户端只是发现邮件已消失在文件夹中。当您连接到它时,它通过获取一个
UID
列表来实现这一点。当您查看新文件夹时,当它获得该文件夹的
UID
列表时,它会将其重新下载到新文件夹中。
Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));