邮件发送公网IP并通过openpop.dll读取邮件中的IP

一直想买一台服务器,挂挂网站数据库。周末看到自己淘汰下来的笔记本,想想不如自己折腾一台。于是开搞。。。安装系统、配置环境轻车熟路,统统搞定。网站可以发布到公网上,可以访问,远程也可以连接了,但是突然发现我路由器重启一次,公网IP 就变一次,蛋疼了。于是想弄个服务检测IP,当我的公网IP发生变化的时候通过邮件通知到我。

以下是获取公网IP 的代码:

private static string GetIP()
        {
            string myIP = "";
            try
            {
                WebRequest wr = WebRequest.Create("http://www.net.cn/static/customercare/yourip.asp");
                Stream s = wr.GetResponse().GetResponseStream();
                StreamReader sr = new StreamReader(s, Encoding.Default);
                string all = sr.ReadToEnd(); 
                int start = all.IndexOf("<CENTER>") + 8;
                int end = all.IndexOf("</CENTER>");
                myIP = all.Substring(start, end - start).Trim();
                int start1 = myIP.IndexOf("<h2>") + 4;
                int end1 = myIP.IndexOf("</h2>");
                myIP = myIP.Substring(start1, end1 - start1).Trim();
                sr.Close();
                s.Close();

                //判断IP地址是否正确
                IPAddress ip;
                if (!IPAddress.TryParse(myIP, out ip)) {
                    //不是正确的IP地址!
                    myIP =  "";
                }
            }
            catch (Exception ex)
            {
                myIP = "";
            }
            return myIP;
        }

通过QQ邮箱发送产生的IP,代码如下:

        private static void SendEmail( string mailSub ,string mailBoy)
        {
            MailMessage myMail = new MailMessage();

            myMail.From = new MailAddress("[email protected]"); //发送邮箱
            myMail.To.Add(new MailAddress("[email protected]"));//接收邮箱

            myMail.Subject = mailSub;//邮箱表标题
            myMail.SubjectEncoding = Encoding.UTF8;

            myMail.Body = mailBoy; //内容
            myMail.BodyEncoding = Encoding.UTF8;
            myMail.IsBodyHtml = true;

            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.qq.com"; //邮箱供应商的smtp服务器地址
            smtp.Credentials = new NetworkCredential("账号@qq.com", "密码");
            smtp.Send(myMail);
        }

以上都是比较好办的,但是我想让我某个程序能知道最新的IP地址,怎么办呢?于是我就想来读取我的邮箱,看到了openpop.all这个程序集发现很好用,很强大,以下实现了简单的读取操作:

public class Receive_IP_In_Emails
    {
        private static Pop3Client pop3Client = new Pop3Client();

        public static string GetNewIP()
        {
            try
            {
                if (pop3Client.Connected)
                {
                    pop3Client.Disconnect();
                }
                pop3Client.Connect("pop.163.com", 995, true);
                pop3Client.Authenticate("账号@163.com", "密码");
                var count = pop3Client.GetMessageCount();
                List<IPMODEL> ipmodels = new List<IPMODEL>();
                for (int i = 1; i <= count; i++)
                {
                    Message msg = pop3Client.GetMessage(i);

                    //根据发件人筛选
                    if (msg.Headers.From.Address == "[email protected]")
                    {
                        var item = new IPMODEL();
                        item.FROM_ADD = msg.Headers.From.Address;
                        item.SEND_DATE = msg.Headers.DateSent;
                        item.SUB = msg.Headers.Subject;
                        //Body的取值方式要看邮件是否是MultiPart
                        //msg.MessagePart.Body 在IsMultiPart为true的时候为null,为false的时候msg.MessagePart.MessageParts 为null
                        if (msg.MessagePart.IsMultiPart)
                        {
                            item.BODY = msg.MessagePart.BodyEncoding.GetString(msg.MessagePart.MessageParts[0].Body);
                        }
                        else {
                            item.BODY = msg.MessagePart.BodyEncoding.GetString(msg.MessagePart.Body);
                        }
                        ipmodels.Add(item);
                    }
                }
                //最新的邮件
                var newMeg = ipmodels.OrderByDescending(x => x.SEND_DATE).FirstOrDefault();
                if (newMeg != null)
                {
                    return newMeg.BODY;
                }
            }
            catch (Exception ex) {
                return "";
            }

            return "";
        }
    }

    public class IPMODEL {
        public DateTime? SEND_DATE { get; set; }

        public string FROM_ADD { get; set; }

        public string SUB { get; set; }

        public string BODY { get; set; }
    }

dll下载地址: https://sourceforge.net/projects/hpop/

自己在家搭一台服务器纯属娱乐,做这些功能也是存粹为了学习。以上的功能也不具备在正式场景下使用的条件,邮件多少会有点延迟,有更高效的方法解决公网IP 变化的问题,比如让运营商提供静态的公网IP地址或者动态解析。但是邮件的收发在实际的开发中还是经常会碰到的,只当记录一下吧。有时间再介绍一下openpop的主要属性和方法。

 

发布了31 篇原创文章 · 获赞 56 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/maaici/article/details/84252958