Python处理邮件内容和提取邮件里的url地址
最近在搞一个邮箱验证账号注册和登录的模块。总结一下。就当记载。文章中涉及到域名和邮箱等都经过处理。
需求是这样子的,注册某个网站的账号,然后注册需要邮件内容激活,登录的时候如果不是常用设备的话也需要认证,而两种认证方式给出的认证方式是不一样的。一种是直接通过发放激活链接给你,就是纯网址,这个好处理,直接用str或者text就能从邮件内容里将原始的url地址提取出来了。但是登录的话就是一个锚文本链接,这个如果还用str或者text方式提取的话,就会出现一个问题,就是提取出来的url里的"&"它会变成"&",在浏览器地址栏中输入的话,就会出错。所以用str或者text方式提取出来的,还得还原一下地址栏能用的网址。用模块html就行了。所有问题搞定。
思路:1->登录邮箱;
2->获取最新邮件(获取最新邮件的理由是,激活和认证的同时,应该不会那么巧有其他邮件发过来,所以我觉得,这种足够满足需求了);
3->解析邮件内容,用imap和pop取回来的邮件我嫌太麻烦,用国人大神开发的zmail解析邮件内容只需几个步骤。
首先获取邮件的html内容
将html内容解析成str
把str内容单独提取出来,在本地建一个html页面
通过bs4解析这个本地html的内容
提取自己想要的内容,在这里是链接地址
提取激活链接的代码:
1 import zmail
2 from bs4 import BeautifulSoup
3 import lxml
4
5 '''
6 #一个模块专门处理xxx新注册用户的邮箱验证问题
7 #思路:
8 1,首先通过zmail登录到邮箱
9 2,因为注册都是即时的,验证邮件应该也是即时的
10 3,收取最新收到的邮件
11 4,获取最新邮件的content_html内容
12 5,将content_html内容转换成str格式方便处理
13 6,将str格式的html文档使用bs4解析
14 7,通过bs4解析出来的内容是一个列表
15 8,读取列表里的文本内容,这样子也不会丢失格式
16 #坑:
17 1,邮箱里的链接内容如果通过直接读取,是会更改的,比如说=就会变成amp等,所以要通过text读取
18
19
20 '''
21 class GetTheVerifyLink():
22 def __init__(self, emailAccount, pwd):
23 #初始化用户名和密码
24 self.emailAccount = emailAccount
25 self.pwd = pwd
26
27 def login_to_server(self):
28 '''
29 #尝试登录邮箱服务器
30 '''
31 try:
32 connect = zmail.server(self.emailAccount, self.pwd)
33 print("登录成功!")
34 except:
35 print("登录失败!请检查")
36 #将connect对象返回到调用它的代码行
37 return connect
38
39 def get_the_latest_mail(self):
40 '''
41 #通过判定最新邮件的发件人是不是有xxx来判定是不是我们要的邮件
42 '''
43 mail = self.login_to_server().get_latest()
44 #开始判定
45 sender = mail['From'] #获取发件人
46 subject = mail['Subject'] #获取邮件主题
47 content_text = mail['Content_text'] #获取邮件内容
48 content_text_str = ''.join(content_text) #将邮件内容转换为str,不转换也行,不转换请看下面
49 # content_text_str = ''.join(content_text[0]) #获取列表的一个元素,将它转换成str,因为它只有一个元素
50 if '@xxx' in sender and 'verify your e-mail address' in subject and 'https://www.xxx/xx/xxx' in content_text_str:
51 print("这是我们需要的邮件!")
52 return mail
53 else:
54 print("这不是我们需要的邮件,请登录邮箱手动删除并保持amazon认证邮件最新!")
55
56 def get_the_mail_content_html(self):
57 content_html = self.get_the_latest_mail()['content_html']
58 if content_html:
59 return content_html
60 else:
61 print("获取content_html内容邮件失败!")
62
63 def tranfer_content_html_to_str(self):
64 content_html_to_str = ''.join(self.get_the_mail_content_html())
65 if content_html_to_str:
66 print("将邮件的content_html转换成str成功!")
67 return content_html_to_str
68 else:
69 print("将邮件的content_html内容转换成str失败!")
70
71 def get_the_verify_link(self):
72 soup = BeautifulSoup(self.tranfer_content_html_to_str(), 'lxml')
73 verify_link_list = soup.select(r'body > p:nth-child(3) > a:nth-child(1)')
74 for verify_link in verify_link_list:
75 verify_link = verify_link.text
76 return verify_link
77
78 # emailAccount = 'xxx@xxx.com'
79 # pwd = 'xxxx!'
80 #
81 # gt = GetTheVerifyLink(emailAccount,pwd)
82 # # latest_mail = gt.get_the_latest_mail()
83 # # print(latest_mail)
84 # verify_link = gt.get_the_verify_link()
85 # print(verify_link)
提取登录连接的代码:
1 import zmail
2 from bs4 import BeautifulSoup
3 import lxml
4 import html
5
6 class xxxSignInConfirm():
7 def __init__(self, username, password):
8 self.username = username
9 self.password = password
10
11 def login_to_server(self):
12 try:
13 server = zmail.server(self.username, self.password)
14 print("E-mail Login success!")
15 except:
16 print("E-mail login Failed!")
17 return server
18
19 def get_the_latest_mail(self):
20 '''
21 #通过判定最新邮件的发件人是不是有xxx.com来判定是不是我们要的邮件
22 '''
23 mail = self.login_to_server().get_latest()
24 #开始判定
25 sender = mail['From'] #获取发件人
26 subject = mail['Subject'] #获取邮件主题
27 content_text = mail['Content_text'] #获取邮件内容,获取文本的邮件内容主要是用在接下来的if语句里的
28 content_text_str = ''.join(content_text) #将邮件内容转换为str,不转换也行,不转换请看下面
29 # content_text_str = ''.join(content_text[0]) #获取列表的一个元素,将它转换成str,因为它只有一个元素
30 if 'security' in subject:
31 print("这是我们需要的邮件!")
32 return mail
33 else:
34 print("这不是我们需要的邮件,请登录邮箱手动删除并保持amazon认证邮件最新!")
35
36 def get_the_mail_content_html(self):
37 mail = self.get_the_latest_mail()
38 content_html = mail['Content_html']
39 if content_html:
40 return content_html
41 else:
42 print("获取content_html内容邮件失败!")
43
44 def transfer_content_html_to_str(self):
45 content_html_to_str = ''.join(self.get_the_mail_content_html())
46 if content_html_to_str:
47 print("将邮件的content_html转换成str成功!")
48 return content_html_to_str
49 else:
50 print("将邮件的content_html内容转换成str失败!")
51
52 def get_the_sign_in_verify_link(self):
53 soup = BeautifulSoup(self.transfer_content_html_to_str(), 'lxml') #利用bs4解析html的邮件内容
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 signlinkelement = signInconfirmLinks[0]
56 signlinkstr = str(signlinkelement) #转换成str
57 # print(signlinkstr)
58 afind = signlinkstr.find('"') #查找字符串中<a href="https//xxxxxxxx.com/"</a>的第一个引号
59 # print(afind)
60 bfind = signlinkstr[afind + 1:].find('"') #找出第二个引号的位置
61 # print(bfind)
62 signlinkamp = signlinkstr[afind + 1: afind + 1 + bfind] #在两个引号之间就是我们需要的链接地址,切片切出来
63 # print(signlinkamp) #打印一下提取出来的地址,是我们想要的,只是&变成了&
64 verify_link = html.unescape(signlinkamp) #使用html还原真实网址
65 return verify_link
66
67 username = 'xxxx@xxx.com'
68 pwd = 'xxxx'
69 ac = AmazonSignInConfirm(username, pwd) #实例化
70
71
72 verify_link = ac.get_the_sign_in_verify_link()
73 print(verify_link) #打印,符合预期
两段代码基本上是相同的,除了最后一个类方法处理方式有点不同的话。记录是记录,也希望有志同道合的人,给出更完美的解决方案。
Python处理邮件内容和提取邮件里的url地址的更多相关文章
- MVC验证12-使用DataAnnotationsExtensions对整型、邮件、最小值、文件类型、Url地址等验证
原文:MVC验证12-使用DataAnnotationsExtensions对整型.邮件.最小值.文件类型.Url地址等验证 本文体验来自http://dataannotationsextension ...
- zabbix邮件内容乱码与邮件内容为附件解决办法
在zabbix的实际使用过程中,在收到邮件预警的时候,我们会发现邮件内容是乱码的,在手机端收到的是附件,而且附件下载后的文件类型是打不开的.这样我们不知道我们是哪个服务器的哪项服务出了问题,接下来我们 ...
- 【转】【Python】Python发送邮件(常见四种邮件内容)
在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调 ...
- python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...
- Python发送邮件(常见四种邮件内容)
Python发送邮件(常见四种邮件内容) 转载 2017年03月03日 17:17:04 转自:http://lizhenliang.blog.51cto.com/7876557/1875330 ...
- 【Python系列】Python自动发邮件脚本-html邮件内容
缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月, ...
- 利用Python imaplib和email模块 读取邮件文本内容及附件内容
python使用imap接收邮件的过程探索 https://www.cnblogs.com/yhlx/archive/2013/03/22/2975817.html #! encoding:utf8 ...
- 【python】使用python发送文本内容邮件
下面提供了一个使用python做的发送文本内容的邮件代码,能够在邮件内容中设置文字颜色,大小,换行等功能. #auther by zls #_*_coding:utf-8_*_ import sys ...
- 今天玩一下python得邮件解析吧,查看邮件内容小儿科,我们下载邮件的附件
直男,直接上代码. 自己看打印的内容 主要功能如下: #如果邮件内容存在链接则返回链接,若不存在则直接下载邮件附件 import imapclient,re import pyzmail #提取邮件里 ...
随机推荐
- Ubuntu16.04配置静态ip
1.安装好ubuntu16.04虚拟机之后,首先按照下图的步骤进行: 首先需要打开虚拟网络编辑器,点击VMnet8的虚拟网卡,如果没有这个网卡,只需在编辑虚拟机设置里面将网络适配器类型改为NAT模式, ...
- CSS色调旋转滤镜
一 关于filter 首先看一下官方对于CSS的filter属性的定义: CSS属性将模糊或颜色偏移等图形效果应用于元素.滤镜通常用于调整图像,背景和边框的渲染. 本文主要讲的是filter中的一个属 ...
- linux系统下oracle表空间占用情况
1.我们先查询表空间的占用情况,使用sql如下: select upper(f.tablespace_name) "表空间名", d.tot_grootte_mb "表空 ...
- Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载
☞ ░ 前往老猿Python博文目录 ░ 一.简介 MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切.拼接.标题插入).视频合成(也称非线性编辑).视频处理或创建高 ...
- Python+爬虫+xlwings发现CSDN个人博客热门文章
☞ ░ 前往老猿Python博文目录 ░ 一.引言 最近几天老猿博客的访问量出现了比较大的增长,从常规的1000-3000之间波动的范围一下子翻了将近一倍,粉丝增长从日均10-40人也增长了差不多一倍 ...
- 第9.11节 Python中IO模块文件打开读写操作实例
为了对前面学习的内容进行一个系统化的应用,老猿写了一个程序来进行文件相关操作功能的测试. 一. 测试程序说明 该程序允许测试人员选择一个文件,自己输入文件打开模式.写入文件的位置以及写入内容,程序按照 ...
- 第9.10节 Python中IO模块其他文件操作属性和方法简介
本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...
- 第8.31节 Python中使用__delattr__清除属性数据
一. 引言 在前面几节我们介绍了__ getattribute__方法和__setattr__方法,分别实现了实例属性的查询和修改(含定义即新增),作为Python中数据操作必不可少的三剑客get.s ...
- Go微服务实践之增删改查
从此篇文章开始,我们来陆续介绍 go-zero 开发一个项目所需要的组件和开发实践. 首先我们从 model 层开始,来说说go-zero 的API以及封装细节.首先 model 层连接的API集中在 ...
- Kubernetes 教程:在 Containerd 容器中使用 GPU
原文链接:https://fuckcloudnative.io/posts/add-nvidia-gpu-support-to-k8s-with-containerd/ 前两天闹得沸沸扬扬的事件不知道 ...