近兩天用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:如果有人在使用其它郵箱時碰到類似問題,原因可能一樣,解決方案可能也類似。