自动抽取邮件内容

公司最近在做电子发票的归集,电子发票最终流转的末节点就是邮箱。所以我们要自动抽取邮箱中的内容,并根据标题下载附件到本地。

这个用到了一个插件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服务协议,其他邮箱默认开启。这样我们就能抽取邮件中的带发票字样标题的附件了。

posted on 2016-11-15 15:15  缘在此季  阅读(2059)  评论(0编辑  收藏  举报

导航