我们正在开发一个用Java编写的邮件客户端。它具有与Outlook或Thunderbird等相同的功能。它直接与邮件服务器通信。此外,我们的业务规则要求我们将所有消息存储在数据库中,并且消息应该始终保持同步。我知道这对IMAP来说不太合适,但是我们必须把所有的东西都保存在数据库中。问题来了,如何跟踪从文件夹A移动到文件夹B的IMAP消息?我们怎么知道呢?如果从a中删除消息,则该消息将从a中删除,并在B中重新创建,其结果是:消息的UID值被更改。我们可以依赖报头中的MessageID吗?我检查了一些邮件服务器,看到标题中的消息id保持不变。但是我在某个地方读到,messageid可以是空的,这取决于邮件服务器。
- MessageID在头总是设置,可以是情况或邮件服务器,他们留下空白?
- MessageID值在头唯一的IMAP文件夹?
- 是否有可能,它得到改变时,消息被移动或文件夹UIDVALIDITY改变?
-
在获取过程中设置自定义标头如何?当我添加非标准邮件标头名称值对时,它是否会保留在邮件服务器上,或者邮件服务器是否可能删除非标准邮件标头?这是一个坏主意应用一个非标准的头值?
IMAPMessage m; m.setHeader("myHeader", "myValue");
-
在stackoverflow中有一些建议,据说生成一个散列,包括messageId和其他参数,如发件人,主题等,这是一个安全的方法吗?如果没有提供唯一的MessageID或没有提供MessageID,我们可能会得到冲突。
你可以做三件事。
首先,问题。如果您的失败模式足够好,您可以依赖当前且唯一的消息id 。在您的示例中,如果message-id不存在并且消息被移动,那么失败是否仅仅是因为您浪费了数据库中的空间和/或下载了两次消息?这些天浪费的空间会很小。
其次,x-gm-msgid。这是gmail特有的功能,一个永远不会改变的63位数字。如果两个消息具有相同的x-gm- msgstr,则它们是相同的。
第三,COPYUID响应代码告诉你移动,但只在你移动时应用,而不是在别人移动时应用。
放在一起,这些应该可以让您很好地了解用户的邮箱是如何变化的。