自動抽取郵件內容


公司最近在做電子發票的歸集,電子發票最終流轉的末節點就是郵箱。所以我們要自動抽取郵箱中的內容,並根據標題下載附件到本地。

這個用到了一個插件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服務協議,其他郵箱默認開啟。這樣我們就能抽取郵件中的帶發票字樣標題的附件了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM