从特定日期开始下载POP3邮件头(Python)

3
我正在尝试使用现有的Python库编写POP3和IMAP客户端,从不同的服务器下载电子邮件头(随后是整个电子邮件正文),并将它们保存在MongoDB数据库中。我面临的问题是,该客户端会下载用户常规邮件客户端之外的电子邮件。因此,假设用户在使用邮件客户端下载时可能会或可能不会将电子邮件留在服务器上,我想获取邮件头,但仅从特定日期收集它们,以避免每次获取邮件头时抓取整个邮箱。

据我所知,POP3列表调用将获取服务器上的所有消息,即使我可能已经下载了这些消息。IMAP没有这个问题。

当处理POP3服务器时,电子邮件客户端如何处理这种情况?
1个回答

3
Outlook登录到POP3服务器并发出STAT、LIST和UIDL命令;然后,如果它判断用户没有新邮件,则退出登录。当我跟踪客户端和我的DBMail POP3服务器之间的网络流量时,我观察到Outlook会这样做。使用这种方法,我曾见过Outlook无法检测到POP3服务器上的新邮件。Thunderbird的行为类似,但我从未见过它无法检测到新邮件。
登录后向服务器发出LIST和UIDL命令。LIST给出了每个消息的索引号(在邮箱中的线性位置)和大小。UIDL为每条消息提供相同的索引号和计算出的哈希值。
对于每个用户,您可以存储由LIST和UIDL给出的大小和哈希值。如果看到相同的大小和哈希值,则假定它是相同的消息。当某个消息不再出现在此列表中时,假定它已被删除,并从本地内存中清除。
为了完整起见,请记住消息列表中大小/哈希对的相对位置,以便支持它们可能重复的可能性。(我猜测Outlook无法检测到新邮件的原因是,至少对于DBMail,有时这些值确实会重复,但Outlook即使在它们被删除后也会记住它们,并且永远认为它们不是新的。如果是我,我会尽量避免这种行为。)
注:请记住,邮件头部分也是消息的一部分。因此,不要相信头部中的任何内容:日期、发件人甚至服务器交接信息都可以轻松伪造,不能假定它们是唯一的。

谢谢!这是我所能期望的最完整和出色的答案。 - Harel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接