8

我使用 Thunderbird 通过 POP3 接收电子邮件。我已将 Thunderbird 配置为在服务器上留下电子邮件。假设有一天我使用 POP3 检索 ( RETR) 10 封电子邮件,然后我注销了一晚。一夜之间又有10条消息发送到我的邮箱。第二天早上我启动 Thunderbird 时,该STAT命令应该显示 20 条消息。然而,Thunderbird 不应该下载前 10 条消息;它应该从消息 11(或消息 11 的唯一标识符或 UID)开始。Thunderbird 将发送一个 POP3UIDL命令,然后将 UID 与 Thunderbird 昨天检索到的最后一条消息的 UID 进行比较。它会发现最后一个 UID 匹配消息 10 的 UIDL 列表,然后 Thunderbird 将RETR 11, RETR 12, 等等。

就我而言,POP3STAT命令显示我在 POP 服务器上有 5379 条消息。我已经收到了大约 5000 个。出于某种原因,Thunderbird 想要下载所有 5379 条消息,而不是从 5001 开始。我正在尝试对此进行调试,并正在寻找 Thunderbird 认为是检索到的最后一条消息的 UID。

有谁知道 Thunderbird(在 Windows 上)将最后一个 UID 存储在哪里,它将用来与 UIDL(列表)进行比较?

有没有办法手动设置它,以便我可以强制 Thunderbird 开始检索接近 5001 的位置?

4

4 回答 4

4

Thunderbird 有一个名为popstate.dat的文件,其中包含 UID、时间戳(纪元)和标志。该标志指示 Thunderbird 将对相关消息执行的操作。

显然,Thunderbird 实际上并没有像我上面描述的那样工作。我认为 Thunderbird 做了以下事情。它发送一个 POP3UIDL命令来获取存储在 POP 服务器上的 UID 列表。然后,它将此列表与存储在 中的 UID 进行比较popstate.dat。任何尚未存在的 UID 都是popstate.dat要检索的新消息。UIDL 命令先前返回了消息号和关联的 UID。然后,Thunderbird 必须RETR使用与尚未检索到的 UID 关联的消息编号执行 POP3 命令。Thunderbird 还必须查看其中的标志popstate.dat并对相关消息采取任何措施。例如,该标志d告诉 Thunderbird 删除关联的消息。这fflag 意味着 Thunderbird 只截断了消息的一部分,应该检索完整的消息。

在某些时候,Thunderbird 会popstate.dat使用新消息更新 。我认为这发生在popstate.dat所有操作完成后的批量更新中。也就是说,如果有 10 条新消息要检索,popstate.dat则在检索完所有 10 条消息后才会更新。

我认为我的问题出在服务器上。显然,我们的基础架构升级到了新版本的 POP 服务器,并在新版本上分配了新的 UID。我popstate.dat有所有旧的 UID。新的 POP 服务器的 UIDL 发送了 Thunderbird 未列出的 5000 多个 UID 的列表popstate.dat. 因此,Thunderbird 开始下载所有 5000 多条消息。如果新的 POP 服务器保留了旧的 UID,那么 Thunderbird 会看到我已经检索了 5000 多条消息中的大部分,并且会下载我没有的消息。我认为我组织中的大多数人都使用 Outlook 而不是使用 POP3,但是对 POP 服务器进行的版本更新并没有给这些用户带来问题。似乎需要额外注意以确保新服务器具有与旧服务器相同的 UID。活到老,学到老!

于 2009-02-16T22:32:10.930 回答
0

有哪个版本的服务器软件?

http://courier.sourcearchive.com/documentation/0.60.0-2/pop3dserver_8c-source.html

00718 ** 消息的 UIDL 实际上只是它的文件名,直到第一个 MDIRSEP 字符

可能您只需要将 popstate.dat 中 UIDL 的第一部分替换为新的吗?

于 2009-01-03T03:56:37.233 回答
0

Thunderbird 有一个扩展来查找重复项并删除它们。例如,基于 message-id(通常由邮件的原始发件人生成,因此不会随着您的基础架构更新而改变)。

于 2009-01-26T06:56:31.717 回答
0

也许不是 OP 正在寻找的答案,但它可能对他有帮助。我遇到过类似的问题,为了解决这些问题,我创建了一个小的 php 脚本来重建 popstate 文件。你可以在这里找到它:

https://github.com/Magentron/rebuild_thunderbird_popstate

用于重建 Thunderbird 的 popstate.dat 文件的简单 PHP 脚本。当 Thunderbird 崩溃并开始检索保存在邮件服务器上的所有邮件后,主要有用。将生成的默认文件是 popstate.dat.GENERATED。如果你把这个改成对应 Thunderbird 目录下的 popstate.dat 文件,请确保 Thunderbird 已经关闭,否则你可能会遇到更多问题。

请注意,没有尝试使它成为我写过的最好的代码......

注意:有 Windows 支持,但从未测试过!

用法

usage: rebuild_popstate.php [-d] [-i n] [-s] [-v] [-f file] server [ port ]
    -c      CRLF flag, use when talking to Windows servers
    -d      debug flag
    -f      output filename (if popstate.dat, Thunderbird needs to be closed!)
    -i      ignore the last n messages (for if you don't have them yet)
    -s      use for secure POP3 (SSL/TLS)
    -v      verbose flag
于 2021-04-29T12:20:58.223 回答