近两天用Python调用poplib模块从邮箱下载邮件附件做数据处理,发现了一个意外情况,pop3的stat()返回的邮件数跟预期有很大差距。邮箱里明明有1500+邮件,stat()和list()返回的数量却只有800+。网上搜了一圈,发现有碰到类似情况的,但没有提到原因及解决方案。不得已,自己做了一下研究,最终解决了问题,分享如下。
场景:126.com的邮箱
1)首先,代码能下载部分邮件附件,说明不存在代码本身问题;
2)其次,查看了pop3的协议介绍,确认使用stat()和list()方法没有问题,并且没有其它替代方案;
3)观察访问到的邮件,发现都是特定日期之后的,那个日期之前邮箱里虽然也有邮件但是没有访问;
4)按照3)的发现作出猜测,是否邮件服务商做了限制只能下载特定时长的邮件?为验证想法,登录邮箱Web界面,从最新的邮件倒推800+封,发现日期截止在1个月前,猜测得到证实;
5)查看邮箱相关设置,发现有126邮箱的POP3/IMAP/SMTP设置下有个“默认收取最近30天的邮件”选项是打钩的,还有一个选项是“收取全部邮件”,果断修改为“收取全部邮件”;
6)重新执行python代码,stat()跟list()的返回符合预期;
7)重新改回“默认收取最近30天的邮件”,第一次处理完了全部存货,以后只收取最近30天可以减少后续的数据处理量量,提高处理效率,也为服务方节省资源。
Note:如果有人在使用其它邮箱时碰到类似问题,原因可能一样,解决方案可能也类似。