下载 POP3 邮件时电脑崩溃了。那些邮件没了?

下载 POP3 邮件时电脑崩溃了。那些邮件没了?

Thunderbird 正在下载过去 15 小时内从配置为 POP3 的帐户收到的 35 封电子邮件。

电脑在中途崩溃了。

重启后,Thunderbird 本地没有这些新邮件。它认为已经完成了。它不会重新下载它们。

从此以后就可以重新下载新收到的电子邮件了。

我已将帐户设置为不在服务器上留下消息。

果然,服务器(Comcast,通过网络邮件检查)没有电子邮件。收件箱是空的。

似乎应该有一些联锁,比如,邮件服务器等待邮件客户端确认下载电子邮件消息,然后才删除该消息。

相反,似乎邮件服务器收到了 POP 请求,将所有电子邮件放入下载队列,并从收件箱中删除邮件,无论客户端是否成功下载。

我请求您找出我推理中的缺陷,希望这些丢失的电子邮件可以在某个地方被我找回。

编辑:这是在 Windows 7 桌面、A/C 壁式电源上。

答案1

似乎应该有一些联锁,比如,邮件服务器等待邮件客户端确认下载电子邮件消息,然后才删除该消息。

在标准 POP3 服务器中,删除确实是一条单独的命令。首先,客户端会RETR针对要下载的每条消息的 UID发送然后它会针对要删除的每条消息的 UID 发送DELE该请求。(下载通过同一个连接进行。)

(对于某些客户端,它是“RETR 1、RETR 2、RETR 3 ... DELE 1、DELE 2、DELE 3 ...”,对于其他客户端,它是“RETR 1、DELE 1、RETR 2、DELE 2、RETR 3、DELE 3 ...”,但这并没有真正改变 DELE 仍然是检索后发生的单独命令的事实。)

如果 POP3 服务器本身在检索后删除消息,那就不是标准的 POP3 行为。


也就是说,客户端有可能一次性发送一批命令(RETR + DELE),而实际上并没有等待每条前一条消息下载完成,这肯定是客户端的一个设计缺陷。

但更有可能的是,客户做过成功下载这些消息并将其保存到文件系统 - 但操作系统崩溃时实际上还没有将待处理的更新写入磁盘。

不幸的是,这是一个常见问题,有时崩溃后只会丢失几秒钟的数据,在其他情况下可能会丢失几分钟。(这取决于操作系统、文件系统、是交流电还是电池供电,以及程序是否手动请求数据同步或不1. )


1为什么该计划不是在将重要数据写入磁盘时使用 fsync()?这可能是出于懒惰,也可能是(至少在 Linux 上)同步操作太慢了适合日常使用。

相关内容