我正在尝试使用可用的libs在python中编写pop3和imap客户端,它们将从各种服务器下载电子邮件标题(以及随后的整个电子邮件正文)并将它们保存在mongodb数据库中。我面临的问题是,除了用户的常规电子邮件客户端之外,此客户端还会下载电子邮件。因此,假设用户在使用他的邮件客户端下载时可能会或可能不会在服务器上留下电子邮件,我想要获取标题但只是从特定日期收集它们,以避免每次获取时都占用整个邮箱头。
据我所知,POP3列表调用将获取服务器上的所有消息,即使是那些我可能已经下载过的消息。 IMAP没有这个问题。
在处理POP3服务器时,电子邮件客户端如何处理这种情况?
答案 0 :(得分:3)
Outlook登录到POP3服务器并发出STAT
,LIST
和UIDL
命令;然后,如果它确定用户没有新消息则退出。我在客户端和我的DBMail POP3服务器之间跟踪网络流量时观察到Outlook正在执行此操作。我看到Outlook无法使用此方法检测POP3服务器上的新消息。 Thunderbird表现相似,但我从未见过它无法检测到新消息。
登录后向服务器发出LIST
和UIDL
命令。LIST
为您提供索引号(邮箱中邮件的线性位置)和每封邮件的大小。 UIDL
为每条消息提供相同的索引号和计算的哈希值。
对于每个用户,您可以存储LIST
和UIDL
给出的大小和哈希值。如果您看到相同的大小和哈希值,则假设它是相同的消息。当此列表中不再显示给定消息时,假定已将其删除并从本地内存中清除。
要获得完整的纯度,请记住消息列表中大小/哈希对的相对位置,以便您可以支持它们重复的可能性。 (我对Outlook的新消息检测失败的猜测是,有时这些值会重复,至少对于DBMail而言,但Outlook会在删除后记住它们,并且永远认为它们不是新的。如果是我,我会尽量避免这种情况行为)。
脚注:请记住标题是邮件的一部分。出于这个原因,不要相信标题中的任何内容:日期,发件人,甚至服务器切换信息都可以轻易伪造,并且不能被认为是唯一的。