2015-10-19 83 views
1

我们正在开发用Java编写的邮件客户端。它具有相同的功能,如Outlook或Thunderbird等,它直接与邮件服务器通信。另外,我们的业务规则要求我们将所有消息存储在数据库中,并且消息应始终保持同步。我知道这不是非常适合IMAP,但我们必须将所有内容都保存在我们的数据库中。 问题出现,如何跟踪从文件夹A移动到文件夹B的IMAP消息?我们怎样才能得到有关的信息?如果您从A中删除消息,则它将从A中删除,并在B中新创建,结果如下:消息的UID值被更改。我们可以依靠头中的MessageID吗?我检查了一些邮件服务器,看到标题中的消息ID保持不变。但是我已经阅读过某个地方,根据邮件服务器的不同,messageids可以是空的。IMAP,使用消息ID跟踪移动的消息

  • 标题中的MessageID是否始终设置,可以是情况下还是邮件服务器,它们将其保留为空?
  • 头文件中的MessageID值在IMAP文件夹中是唯一的吗?
  • 当邮件被移动或文件夹UIDVALIDITY更改时,它可能会被更改吗?
  • 如何在提取期间设置自定义标题?当我添加一个非标准标题名称值对时,它是否会保留在邮件服务器上,或者邮件服务器可能会删除非标准邮件标题对象?应用非标准标题值是不是一个好主意?

    IMAPMessage m; 
    m.setHeader("myHeader", "myValue"); 
    
  • 有计算器中的一些建议,据说这是产生包括邮件ID以及其他参数如发件人哈希,主题等,是一种安全的方法?如果没有唯一的MessageID,或者没有提供MessageID,我们可以发生冲突。

+1

不,你不能指望独特的或存在的messageids。由于imap消息是不可变的,所以不能添加标题。 – Max

+1

最好的办法就是和你在最后提到的建议一起去 - 创建一个包含发送者,接收者,主题,日期和尽可能多其他独特字段的散列。 – Fallso

+1

并且要小心,创建消息副本非常简单(例如,IMAP COPY命令),因此即使所有这些仍然会导致重复。消息本身并不是唯一的。 – Max

回答

0

有三件事你可以做。

首先,message-id。如果您的失败模式足够好,您可以依靠消息ID存在和唯一这些天。在你的情况下,如果message-id不存在并且消息被移动,那么失败只是浪费数据库中的空间和/或下载消息两次?这些天浪费的空间将会很小。

二,x-gm-msgid。这是一个特定于gmail的功能,一个从未改变的63位数字。如果两条消息具有相同的x-gm-msgid,则它们是相同的。第三,COPYUID响应代码告诉你关于移动的信息,但只适用于你移动的时候,而不是其他人的移动。

放在一起,这些应该给你一个相当好的理解用户的邮箱如何改变。

+0

message-id并不总是唯一的。检查案例:您有一个电子邮件地址[email protected]。您属于邮件组[email protected]。并且有人向你发送一封邮件给这个组。因此,您将收到邮件两次。它们将具有相同的消息ID,因为在发送时从发送者设置消息ID。如果我们有两个不同邮件的相同消息ID,则结构不再有用。 – benchpresser

+0

@benchpresser是那些实质上的不同?我见过不少MUA的线程算法将它们视为可互换并向您展示一个副本...... – arnt

+0

设置自定义邮件标志并跟踪此值(userflag)不是一个好主意吗?当邮件在Outlook中移动时,它仍然是一样的,thunderbird等邮件服务器通常支持它吗? – benchpresser