公司最近在做電子發票的歸集,電子發票最終流轉的末節點就是郵箱。所以我們要自動抽取郵箱中的內容,並根據標題下載附件到本地。
這個用到了一個插件openpop插件,所有內容,包括標題都是強類型的,所以我們可以很方便的操作郵件中的東西。
直接上代碼看看吧
public static void ReadPop3(string email, string uid, string psd) { string service = string.Empty; int portnub = 110; using (Pop3Client client = new Pop3Client()) { if (client.Connected) { client.Disconnect(); } if (email.Contains("qq") || email.Contains("QQ")) { service = "pop.qq.com"; portnub = 995; client.Connect(service, portnub, true); } else if (email.Contains("sina")) { service = "pop.sina.com"; portnub = 110; } // Connect to the server, false means don't use ssl if (!client.Connected) { client.Connect(service, portnub, false); } client.Authenticate(uid, psd); //email count int messageCount = client.GetMessageCount(); //i = 1 is the first email; 1 is the oldest email for (int i = 1; i<= messageCount; i++) { Message message = client.GetMessage(i); string sender = message.Headers.From.DisplayName; string from = message.Headers.From.Address; string subject = message.Headers.Subject; DateTime Datesent = message.Headers.DateSent; MessagePart messagePart = message.MessagePart; string body = " "; if (messagePart.IsText) { body = messagePart.GetBodyAsText(); } else if (messagePart.IsMultiPart) { MessagePart plainTextPart = message.FindFirstPlainTextVersion(); if (plainTextPart != null) { // The message had a text/plain version - show that one body = plainTextPart.GetBodyAsText(); } else { // Try to find a body to show in some of the other text versions List<MessagePart> textVersions = message.FindAllTextVersions(); if (textVersions.Count >= 1) body = textVersions[0].GetBodyAsText(); else body = "<<OpenPop>> Cannot find a text version body in this message."; } } List<MessagePart> list = message.FindAllAttachments(); if (list.Count > 0) { for (int j = 0; j < list.Count; j++) { Random rnd = new Random(); int iRandNumber = rnd.Next(0, 1000000); string name = DateTime.Now.ToString("yyyyMMddHHMMss") + iRandNumber.ToString(); string str3 = Directory.GetCurrentDirectory(); string sPath = str3 + "\\" + DateTime.Now.ToString("yyyyMM"); if (!Directory.Exists(sPath)) { Directory.CreateDirectory(sPath); } string SaveAsFileImagePath = sPath + "\\" + name + ".pdf"; FileStream fs = new FileStream(SaveAsFileImagePath, FileMode.CreateNew); list[j].Save(fs); } } } } }
看起來確實很方便,插件從nuget中直接找到,openpop就可以了。
郵件采集主要用到了第三方插件,我們可以從nuget中下載到,openpop這個插件,他可以通過pop3協議把遠程服務器上的郵件下載到本地,還能分析里面的內容,並且是強對象類型,方便操作。
目前除了qq郵箱出於安全考慮(qq郵箱密碼和qq號密碼一樣,所以出於安全考慮,騰訊默認不允許開啟pop服務協議,在郵箱中設置開啟之后,他會生成一個隨機key作為qq郵箱密碼),默認沒有打開pop服務協議,其他郵箱默認開啟。這樣我們就能抽取郵件中的帶發票字樣標題的附件了。