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