一般来说,如果现实中你有这样一种需求“假如你是褥羊毛的羊毛党,你某日发现了一个app有一个活动,通过邮箱注册账号激活可以领5元红包,而恰恰你手上又有一批邮箱可用,那么批量获取邮箱中的激活链接去激活则是你一个很大工作量的内容”,现在问题已经出现了,那么我在这里给大家提供一些解决方案思路和结果。

首先我想到的是通过一些爬虫技术模拟登录进入邮箱获取邮件内容,我想一般人的解决思路也都是这样的吧。但是这样有一系列的难题,本事爬虫也不会,网上找了一下案例多是别人发的部分代码,而且相互转载的特别多(题外话,真正的一个需求解决方案我建议拆分到各个技术点去上网查是最优办法,而不是一开始直接网上找),这里这种思路我就不继续说一下去了,我之前也在网上找了一些别人php些的模拟登录邮箱,可能时间比较久了,现在根本没法用,故放弃。

其次还有找到一种可以满足需求的办法,IMAP协议获取邮件内容,这种方法前提邮箱设置过一些权限,比如:

 

不过问题不大,一般邮箱协议默认有的,我这里现在有一个栗子是,获取hotmail邮箱的激活链接的,代码如下

 [HttpPost]
        public IActionResult GetLink([FromBody] JObject value)
        {
            try
            {
                string link = "";
                string mail = value["mail"].Value<string>();
                string pwd = value["pwd"].Value<string>();
                IList<string> emailLst = new List<string>();
                using (ImapClient client = new ImapClient("imap-mail.outlook.com", 993, mail, pwd, AuthMethod.Login, true))
                {

                    IEnumerable<uint> uids = client.Search(SearchCondition.All(), "junk");
                    // 也可以使用通过其它条件进行检索你的邮件
                    if (uids.Count() > 0)
                    {
                        System.Net.Mail.MailMessage msg = client.GetMessage(uids.Single(), true, "junk");
                        string body = msg.Body;

                        Regex reg = new Regex(@"((https?|ftp|file))[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]", RegexOptions.IgnoreCase);

                        var mc = reg.Match(body);
                        if (mc.Success)
                        {
                            link = mc.Groups[0].ToString();
                        }
                    }
                }
                return Ok(new { success = true, data = link });
            }
            catch (Exception ex)
            {
                return Ok(new { success = false, data = ex.Message });
            }
        }

 

 看上面代码,核心的方法就是  ImapClient,具体用法大家要看一下官方文档,这里提供一些解决思路并简单结合栗子说明一下用法

ImapClient参数可以看到,第一个是host名称,第二个是端口号,

 

 这里不懂的人提供一个获取这些信息的方法,下载一个foxmail客户端,登录邮箱,查看系统设置中服务器就可以看到上面的信息,具体为什么这些东西有什么用,查看imap协议,本人不求甚解并不了解这些东西具体原因,

再回到参数介绍上面来,后面的参数都是固定的,邮箱名称,密码,最后面两固定的这么写就可以。

 IEnumerable<uint> uids = client.Search(SearchCondition.All(), "junk"); 获取邮件uid

方法参数,第一个参数就是设定获取邮件那一部分,我这里直接写的ALL,后面一个参数就是指定获取那个文件的邮件,比如收信箱,发信箱,垃圾箱,草稿等待,我这里获取的垃圾箱(junk),说明一下,各种邮箱有些文件对应的字符串是不一样的,比如hotmail的垃圾箱是junk,gamil的是spam,这里是个坑,我也是摸石头过河试出来的,所以特别说明一下。

 client.GetMessage(uids.Single(), true, "junk");
根据uid获取邮件内容,

差不多就这几行代码就可以了,在实现需求以后回头想想如果最早用爬虫来实现效果的话,估计代码量复杂度要翻好几倍。归根结底,技术终究只是给需求提供最佳解决办法的工具嘛,这篇文章是给大家一个思路参考和问题解决方案,如果你有自动获取邮件这么个需求的话,希望你一定要搜到这篇文章,
posted on 2019-09-06 17:10  懒胖gg  阅读(794)  评论(0编辑  收藏  举报