从特定日期下载POP3标头(Python)

我正在尝试使用可用的库在python中编写pop3和imap客户端,该库将从各种服务器下载电子邮件标头(以及随后的整个电子邮件正文),并将其保存在mongodb数据库中.我面临的问题是,除了用户的常规电子邮件客户端之外,此客户端还下载电子邮件.因此,假设用户使用邮件客户端下载时可能会或可能不会在服务器上保留电子邮件,我想获取标头,但仅从特定日期收集标头,以避免每次我获取标头时都抓取整个邮箱标头.

据我所知,POP3列表调用将使我获得服务器上的所有消息,甚至包括我可能已经下载的消息. IMAP没有这个问题.

电子邮件客户端在处理POP3服务器时如何处理这种情况?

解决方法:

Outlook登录到POP3服务器并发出STAT,LIST和UIDL命令.然后,如果它确定用户没有新消息,则将其注销.在跟踪客户端和DBMail POP3服务器之间的网络流量时,我观察到Outlook会这样做.我已经看到Outlook无法使用此方法在POP3服务器上检测到新邮件.雷鸟的行为类似,但我从未见过它无法检测到新消息.

登录后,向服务器发出LIST和UIDL命令.LIST为您提供索引号(邮件在邮箱中的线性位置)和每封邮件的大小. UIDL为您提供了每个消息相同的索引号和计算出的哈希值.

对于每个用户,您可以存储LIST和UIDL给出的大小和哈希值.如果看到相同的大小和哈希值,则假定它是相同的消息.当给定消息不再出现在此列表中时,假定已将其删除并从本地内存中清除.

为了获得完全的纯净度,请记住消息列表中大小/哈希对的相对位置,以便您支持它们可能重复出现的可能性. (我对Outlook的新邮件检测失败的猜测是,有时这些值的确会重复,至少对于DBMail而言,但是Outlook即使删除它们后也会记住它们,并且永远认为它们不是新的.如果是我,我会尽量避免这种情况行为.)

脚注:请记住,标题是消息的一部分.出于这个原因,不要信任标头中的任何内容:日期,发件人,甚至服务器移交信息都容易伪造,并且不能被认为是唯一的.

上一篇:什么是POP3、SMTP和IMAP


下一篇:如何从asp.net Web表单中的特定电子邮件地址获取和读取电子邮件?