java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别
最近在做郵件提醒抄送企業微信消息系統,就目前而言,無論是pop3還是imap都沒有一個好的方法只接收新郵件,基本只能依靠收件箱列表message自行判斷,下面給出幾種思路并作對比。
//收件箱 folder = store.getFolder("INBOX"); //權限 folder.open(Folder.READ_ONLY);1 緩存(redis)計數方案
這是最為直觀的一種方式,基本思想是,在redis中對處理過新郵件的數目作原子加標記cacheTotal,定時掃描收件箱中所有郵件數目total, total與cacheTotal的差值即為新郵件數目,當然也很容易獲取到新郵件的數組下標。
- 優點:直觀,簡單
- 缺點:粗暴,可能因為郵件歸檔,redis異常等原因,造成誤讀,風險較大
2 采用flag判斷是否是新郵件
flag是郵件對象message的一種標識,需要設置:
- 需要使用imap協議,Store store = session.getStore("imap");
- 設置folder需要讀寫權限, folder.open(Folder.READ_WRITE);
但獲取flag注意一點:在第一行,如果你調用了getMessages(),在第二次運行程序時就不會出現新郵件!因為調用了getMessages(),它就把新郵件讀成了舊郵件。 運行結果:第一次運行,輸出的flag:javax.mail.Flags@10,再次運行就全是0了。
- 優點:flag在能獲取有效值的情況下,可精確判定是新郵件唯一標識
- 缺點:(1)限定是imap協議,pop3不可行(2)flag不能穩定獲取,對于需要分批次拉取新郵件的需求不能滿足
3 采用【郵箱名+UID】方式接收新郵件
UID是賬戶的每一封郵件的標識,不同于MessageID,MessageID是發送郵件的時候生成的唯一ID,也有可能發送沒有你的接收郵箱自己生成,或者是javamail生成的,取messageid需要下載郵件的頭造成效率緩慢,所以只需要存儲uid;以POP3為例:
UID唯一性的前提是在同一個賬戶里,也就是說在不同賬戶下UID還是可能又相同的,這在數據庫持久化時得注意,故采用【郵箱名+UID】得方式存儲。還有就是session如果不帶有用戶和服務器信息, 就這樣生成一個公用的就可以了 :
- 優點:(1)能精準識別新郵件(2)pop3,imap均可支持
- 缺點:(1)還行吧
總結
以上是生活随笔為你收集整理的java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的列表和元组_百度资讯搜索
- 下一篇: java栅格法全局路径规划,基于A*的全