最近在搞一个邮箱验证账号注册和登录的模块。总结一下。就当记载。文章中涉及到域名和邮箱等都经过处理。

需求是这样子的,注册某个网站的账号,然后注册需要邮件内容激活,登录的时候如果不是常用设备的话也需要认证,而两种认证方式给出的认证方式是不一样的。一种是直接通过发放激活链接给你,就是纯网址,这个好处理,直接用str或者text就能从邮件内容里将原始的url地址提取出来了。但是登录的话就是一个锚文本链接,这个如果还用str或者text方式提取的话,就会出现一个问题,就是提取出来的url里的"&"它会变成"&",在浏览器地址栏中输入的话,就会出错。所以用str或者text方式提取出来的,还得还原一下地址栏能用的网址。用模块html就行了。所有问题搞定。

思路:1->登录邮箱;

   2->获取最新邮件(获取最新邮件的理由是,激活和认证的同时,应该不会那么巧有其他邮件发过来,所以我觉得,这种足够满足需求了);

   3->解析邮件内容,用imap和pop取回来的邮件我嫌太麻烦,用国人大神开发的zmail解析邮件内容只需几个步骤。

      首先获取邮件的html内容

      将html内容解析成str

      把str内容单独提取出来,在本地建一个html页面

      通过bs4解析这个本地html的内容

      提取自己想要的内容,在这里是链接地址

提取激活链接的代码:

  1. 1 import zmail
  2. 2 from bs4 import BeautifulSoup
  3. 3 import lxml
  4. 4
  5. 5 '''
  6. 6 #一个模块专门处理xxx新注册用户的邮箱验证问题
  7. 7 #思路:
  8. 8 1,首先通过zmail登录到邮箱
  9. 9 2,因为注册都是即时的,验证邮件应该也是即时的
  10. 10 3,收取最新收到的邮件
  11. 11 4,获取最新邮件的content_html内容
  12. 12 5,将content_html内容转换成str格式方便处理
  13. 13 6,将str格式的html文档使用bs4解析
  14. 14 7,通过bs4解析出来的内容是一个列表
  15. 15 8,读取列表里的文本内容,这样子也不会丢失格式
  16. 16 #坑:
  17. 17 1,邮箱里的链接内容如果通过直接读取,是会更改的,比如说=就会变成amp等,所以要通过text读取
  18. 18
  19. 19
  20. 20 '''
  21. 21 class GetTheVerifyLink():
  22. 22 def __init__(self, emailAccount, pwd):
  23. 23 #初始化用户名和密码
  24. 24 self.emailAccount = emailAccount
  25. 25 self.pwd = pwd
  26. 26
  27. 27 def login_to_server(self):
  28. 28 '''
  29. 29 #尝试登录邮箱服务器
  30. 30 '''
  31. 31 try:
  32. 32 connect = zmail.server(self.emailAccount, self.pwd)
  33. 33 print("登录成功!")
  34. 34 except:
  35. 35 print("登录失败!请检查")
  36. 36 #将connect对象返回到调用它的代码行
  37. 37 return connect
  38. 38
  39. 39 def get_the_latest_mail(self):
  40. 40 '''
  41. 41 #通过判定最新邮件的发件人是不是有xxx来判定是不是我们要的邮件
  42. 42 '''
  43. 43 mail = self.login_to_server().get_latest()
  44. 44 #开始判定
  45. 45 sender = mail['From'] #获取发件人
  46. 46 subject = mail['Subject'] #获取邮件主题
  47. 47 content_text = mail['Content_text'] #获取邮件内容
  48. 48 content_text_str = ''.join(content_text) #将邮件内容转换为str,不转换也行,不转换请看下面
  49. 49 # content_text_str = ''.join(content_text[0]) #获取列表的一个元素,将它转换成str,因为它只有一个元素
  50. 50 if '@xxx' in sender and 'verify your e-mail address' in subject and 'https://www.xxx/xx/xxx' in content_text_str:
  51. 51 print("这是我们需要的邮件!")
  52. 52 return mail
  53. 53 else:
  54. 54 print("这不是我们需要的邮件,请登录邮箱手动删除并保持amazon认证邮件最新!")
  55. 55
  56. 56 def get_the_mail_content_html(self):
  57. 57 content_html = self.get_the_latest_mail()['content_html']
  58. 58 if content_html:
  59. 59 return content_html
  60. 60 else:
  61. 61 print("获取content_html内容邮件失败!")
  62. 62
  63. 63 def tranfer_content_html_to_str(self):
  64. 64 content_html_to_str = ''.join(self.get_the_mail_content_html())
  65. 65 if content_html_to_str:
  66. 66 print("将邮件的content_html转换成str成功!")
  67. 67 return content_html_to_str
  68. 68 else:
  69. 69 print("将邮件的content_html内容转换成str失败!")
  70. 70
  71. 71 def get_the_verify_link(self):
  72. 72 soup = BeautifulSoup(self.tranfer_content_html_to_str(), 'lxml')
  73. 73 verify_link_list = soup.select(r'body > p:nth-child(3) > a:nth-child(1)')
  74. 74 for verify_link in verify_link_list:
  75. 75 verify_link = verify_link.text
  76. 76 return verify_link
  77. 77
  78. 78 # emailAccount = 'xxx@xxx.com'
  79. 79 # pwd = 'xxxx!'
  80. 80 #
  81. 81 # gt = GetTheVerifyLink(emailAccount,pwd)
  82. 82 # # latest_mail = gt.get_the_latest_mail()
  83. 83 # # print(latest_mail)
  84. 84 # verify_link = gt.get_the_verify_link()
  85. 85 # print(verify_link)

提取登录连接的代码:

  1. 1 import zmail
  2. 2 from bs4 import BeautifulSoup
  3. 3 import lxml
  4. 4 import html
  5. 5
  6. 6 class xxxSignInConfirm():
  7. 7 def __init__(self, username, password):
  8. 8 self.username = username
  9. 9 self.password = password
  10. 10
  11. 11 def login_to_server(self):
  12. 12 try:
  13. 13 server = zmail.server(self.username, self.password)
  14. 14 print("E-mail Login success!")
  15. 15 except:
  16. 16 print("E-mail login Failed!")
  17. 17 return server
  18. 18
  19. 19 def get_the_latest_mail(self):
  20. 20 '''
  21. 21 #通过判定最新邮件的发件人是不是有xxx.com来判定是不是我们要的邮件
  22. 22 '''
  23. 23 mail = self.login_to_server().get_latest()
  24. 24 #开始判定
  25. 25 sender = mail['From'] #获取发件人
  26. 26 subject = mail['Subject'] #获取邮件主题
  27. 27 content_text = mail['Content_text'] #获取邮件内容,获取文本的邮件内容主要是用在接下来的if语句里的
  28. 28 content_text_str = ''.join(content_text) #将邮件内容转换为str,不转换也行,不转换请看下面
  29. 29 # content_text_str = ''.join(content_text[0]) #获取列表的一个元素,将它转换成str,因为它只有一个元素
  30. 30 if 'security' in subject:
  31. 31 print("这是我们需要的邮件!")
  32. 32 return mail
  33. 33 else:
  34. 34 print("这不是我们需要的邮件,请登录邮箱手动删除并保持amazon认证邮件最新!")
  35. 35
  36. 36 def get_the_mail_content_html(self):
  37. 37 mail = self.get_the_latest_mail()
  38. 38 content_html = mail['Content_html']
  39. 39 if content_html:
  40. 40 return content_html
  41. 41 else:
  42. 42 print("获取content_html内容邮件失败!")
  43. 43
  44. 44 def transfer_content_html_to_str(self):
  45. 45 content_html_to_str = ''.join(self.get_the_mail_content_html())
  46. 46 if content_html_to_str:
  47. 47 print("将邮件的content_html转换成str成功!")
  48. 48 return content_html_to_str
  49. 49 else:
  50. 50 print("将邮件的content_html内容转换成str失败!")
  51. 51
  52. 52 def get_the_sign_in_verify_link(self):
  53. 53 soup = BeautifulSoup(self.transfer_content_html_to_str(), 'lxml') #利用bs4解析html的邮件内容
  54. 54 signInconfirmLinks = soup.select(r'body > div:nth-child(3) > div:nth-child(4) > table:nth-child(2) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(5) > td:nth-child(1) > a:nth-child(1)')
  55. 55 signlinkelement = signInconfirmLinks[0]
  56. 56 signlinkstr = str(signlinkelement) #转换成str
  57. 57 # print(signlinkstr)
  58. 58 afind = signlinkstr.find('"') #查找字符串中<a href="https//xxxxxxxx.com/"</a>的第一个引号
  59. 59 # print(afind)
  60. 60 bfind = signlinkstr[afind + 1:].find('"') #找出第二个引号的位置
  61. 61 # print(bfind)
  62. 62 signlinkamp = signlinkstr[afind + 1: afind + 1 + bfind] #在两个引号之间就是我们需要的链接地址,切片切出来
  63. 63 # print(signlinkamp) #打印一下提取出来的地址,是我们想要的,只是&变成了&amp;
  64. 64 verify_link = html.unescape(signlinkamp) #使用html还原真实网址
  65. 65 return verify_link
  66. 66
  67. 67 username = 'xxxx@xxx.com'
  68. 68 pwd = 'xxxx'
  69. 69 ac = AmazonSignInConfirm(username, pwd) #实例化
  70. 70
  71. 71
  72. 72 verify_link = ac.get_the_sign_in_verify_link()
  73. 73 print(verify_link) #打印,符合预期

两段代码基本上是相同的,除了最后一个类方法处理方式有点不同的话。记录是记录,也希望有志同道合的人,给出更完美的解决方案。

Python处理邮件内容和提取邮件里的url地址的更多相关文章

  1. MVC验证12-使用DataAnnotationsExtensions对整型、邮件、最小值、文件类型、Url地址等验证

    原文:MVC验证12-使用DataAnnotationsExtensions对整型.邮件.最小值.文件类型.Url地址等验证 本文体验来自http://dataannotationsextension ...

  2. zabbix邮件内容乱码与邮件内容为附件解决办法

    在zabbix的实际使用过程中,在收到邮件预警的时候,我们会发现邮件内容是乱码的,在手机端收到的是附件,而且附件下载后的文件类型是打不开的.这样我们不知道我们是哪个服务器的哪项服务出了问题,接下来我们 ...

  3. 【转】【Python】Python发送邮件(常见四种邮件内容)

    在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调 ...

  4. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)

    简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...

  5. Python发送邮件(常见四种邮件内容)

    Python发送邮件(常见四种邮件内容) 转载 2017年03月03日 17:17:04   转自:http://lizhenliang.blog.51cto.com/7876557/1875330 ...

  6. 【Python系列】Python自动发邮件脚本-html邮件内容

    缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月, ...

  7. 利用Python imaplib和email模块 读取邮件文本内容及附件内容

    python使用imap接收邮件的过程探索 https://www.cnblogs.com/yhlx/archive/2013/03/22/2975817.html #! encoding:utf8 ...

  8. 【python】使用python发送文本内容邮件

    下面提供了一个使用python做的发送文本内容的邮件代码,能够在邮件内容中设置文字颜色,大小,换行等功能. #auther by zls #_*_coding:utf-8_*_ import sys ...

  9. 今天玩一下python得邮件解析吧,查看邮件内容小儿科,我们下载邮件的附件

    直男,直接上代码. 自己看打印的内容 主要功能如下: #如果邮件内容存在链接则返回链接,若不存在则直接下载邮件附件 import imapclient,re import pyzmail #提取邮件里 ...

随机推荐

  1. [工具推荐]制作基于Dash的本地文档方便搜索文档api和内容

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近在看es的文档,发现查起api来真的很麻烦,很多现在开源的文档都没有查询 ...

  2. Linux安装MySQL5.7(CentOS)

    1.下载解压 1.1 MySql 5.7.26下载地址: https://dev.mysql.com/downloads/mysql/5.7.html#downloads 1.2 解压 tar -xv ...

  3. PC 端轮播图的实现

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  4. 剑指Offer_WEEK01

    剑指 Offer 03. 数组中重复的数字 思路:将数组进行排序,这样数组是一个有序的序列,然后判断两个相邻的数是否相等,是则返回相同的数 class Solution { public: int f ...

  5. Java数据结构(十)—— 树

    树 树的概念和常用术语 常用术语 节点 根节点 父节点 子节点 叶子节点:没有子节点的节点 节点的权:节点的值 路径:节点A到节点B的路径 层 子树 树的高度:最大层数 森林:多颗子树构成森林 二叉树 ...

  6. Linux(Ubuntu16.04)下的MediaWiki的部署启动

    一.服务器部分 使用XAMPP配置MediaWiki部署所需要的环境. 1. 查看服务器的版本与位数: sudo lsb_release -a      //查看系统版本 uname -a       ...

  7. CentOS6.5上增加中文字体库,确保前端WEB可以正常显示

    1 下载字体 可以在网上下载,也可以在 windows 目录下(C:\Windows\Fonts)找到对应字体,这里是从另一套系统上 copy simsun.ttf 文件. 2 查看当前系统中已安装的 ...

  8. D. Numbers on Tree(构造)【CF 1287】

    传送门 思路: 我们需要抓住唯一的重要信息点"ci",我的做法也是在猜想和尝试中得出的,之后再验证算法的正确性. 我们在构造中发现,如果树上出现了相同的数字,则会让树的构造变得不清 ...

  9. 帆软用工具测试超链接打开弹窗(iframe嵌套),解决js传参带中文传递有乱码问题

    1.新建超链接 随意点击一个单元格右击,选择 超级链接 2.在弹出的窗口中选择JavaScript脚本 如图: 其中红框框出的是几个要点   ,左边的就不讲了,右上角的参数cc是设置了公式remote ...

  10. fist-第四天冲刺随笔

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...