背景:最近在做一個小工具,讀取PO3協議郵件服務器的指定人員的郵件,東西做出來了,弄了一個While死循環,20秒執行一次,
結果運行了3天,周一來IT人員找上門來了,你的電腦什么情況,怎么一個小時下載流量達到1個G多,而且都是PO3協議的,哈哈,哈哈
心理很想呵呵,但是還得如實跟他解釋了一下情況,然后立刻把程序停止了。
接下來我就是找問題啦,最后找到了原因是因為我每次都是循環讀取郵箱中的180條郵件,這180條中還有好多有幾十兆附件的,哈哈
解決辦法和問題原因:
問題就出現這循環讀取以及讀取過的內容里面,因為PO3協議不支持讀取未讀的郵件,或是說標記郵件為已讀的。所以我當時只能從所有郵件中不斷重復循環讀取,
直到有新的需要的郵件進來,處理一下,繼續循環。后來我找到了一個辦法,POP3協議有一個UID的東西,每個郵件都是唯一的,每次都獲取到郵箱所有郵件的UID,
然后保存到本地,下次用本地的和這個對比,有新的UID進來,只針對這個新的UID進行郵件讀取,這樣所有事就都解決了,流量也很小很小了。
我這里使用的是MailKit.dll,
開源的項目,在項目中用nuget一下DLL下載下來,nuget命令去官網看吧。
粘貼出來主要代碼:
IList<string> msgUids = client.GetMessageUids(); IList<string> notReadUids = new List<string>(); foreach (var item in msgUids) { if (!alreadySentMsgId.Contains(item)) { notReadUids.Add(item); sw.WriteLine(item); //記錄沒有讀取過的郵件的UID } } if (notReadUids.Count != 0) //如果有未讀過的郵件才進行讀取及解析 { IList<MimeMessage> notReadMessages = client.GetMessages(notReadUids); }
