【问题标题】:IMAP, tracking moved messages using message idIMAP,使用消息 ID 跟踪移动的消息
【发布时间】:2016-01-17 21:58:45
【问题描述】:

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

  • 是否始终设置标头中的 MessageID,可以是他们将其留空的案例或邮件服务器吗?
  • 标头中的 MessageID 值在 IMAP 文件夹中是否唯一?
  • 是否有可能在移动邮件或更改文件夹 UIDVALIDITY 时更改?
  • 在获取期间设置自定义标头怎么样?当我添加一个非标准的标头名称值对时,它会保留在邮件服务器上还是非标准的邮件heraders可能会被邮件服务器删除?应用非标准标头值是不是一个坏主意?

    IMAPMessage m;
    m.setHeader("myHeader", "myValue");
    
  • stackoverflow 中有一些建议,据说生成一个包含 messageId 和其他参数(如发件人、主题等)的哈希,这是一种安全的方法吗?如果没有提供唯一的 MessageID 或没有提供 MessageID,我们可能会发生冲突。

【问题讨论】:

  • 不,您不能指望 messageid 是唯一的或存在的。您不能添加标头,因为 imap 消息是不可变的。
  • 最好的办法是采纳您最后提到的建议 - 创建一个包含发送者、接收者、主题、日期和尽可能多的其他唯一字段的哈希。
  • 请注意,创建邮件副本非常简单(例如,IMAP COPY 命令),因此即使所有这些仍然可能导致重复。消息本身并不是唯一的。
  • 如何设置自定义标志?当邮件在文件夹之间移动时它们是否保持不变?

标签: java email imap move messageid


【解决方案1】:

你可以做三件事。

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

第二个,x-gm-msgid。这是 gmail 特有的功能,一个永远不会改变的 63 位数字。如果两条消息具有相同的 x-gm-msgid,则它们是相同的。

第三,COPYUID 响应代码告诉您有关移动的信息,但仅适用于您进行移动,而不适用于其他人。

放在一起,这些应该可以让您很好地了解用户邮箱的变化。

【讨论】:

  • message-id 并不总是唯一的。检查案例:您有一个电子邮件地址 foo@company.com。您属于一个邮件组 group@company.com。有人向您和该组发送邮件。因此,您将收到两次邮件。它们都将具有相同的消息 ID,因为消息 ID 是在发送时从发件人设置的。如果我们有两个不同邮件的相同消息 ID,则该结构不再有用。
  • @benchpresser 有本质上的不同吗?我见过不少 MUA,它们的线程算法将它们视为可互换的,只向您展示一个副本......
  • 设置自定义邮件标志并跟踪此值(用户标志)不是一个好主意吗?邮件在 Outlook、Thunderbird 等中移动时保持不变。邮件服务器通常支持吗?
  • 一些广泛使用的服务器支持每个邮箱有限数量的标志,因此如果您想在同一个邮箱中拥有数百个不同名称的标志,那将很快中断。如果您的应用使用十几个不同的标志,它会运行良好。
  • 了解限制的唯一方法是创建大量标志。创建一个临时邮箱,在其中创建一条消息,循环在消息上存储新的标志,直到其中一个 UID STORE 命令失败并返回 NO 响应,查看测试消息有多少标志,最后删除消息和邮箱。我的猜测是限制这个的服务器将是 32 或 128,减去系统定义的标志位。但是自从我查看任何源代码以来已经有几年了......
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2018-04-29
相关资源
最近更新 更多