python使用POP3获取邮件信息
一. 前言
曾经写过一篇利用python库SMTP发送邮箱以控制电脑的文章, 文章链接点击这里
现在回头看, 有很多做的不完美的地方, 其中最重要的点是无法主动控制电脑, 只能被动地等待程序触发某个条件, 然后利用SMTP返回信息.
刚好现在是期末, 所以使用新的邮箱控制法. 该方法的核心是通过POP3登录邮箱, 获取当前的最新邮件, 根据该邮件的内容对程序产生命令, 到达主动控制的目的.
二. POP3
POP3是一种用于接收电子邮件的协议, 我使用的python3.7版本自带pop3操作库, 库的名字为poplib. python官网中给出了有关于poplib的文档和API信息点击这里.
poplib有两个类, 本文用到了pop3类. 下面列出会用到的函数方法:
方法 | 描述 |
---|---|
POP3.set_debuglevel(level) | 调试输出 |
POP3.getwelcome() | 返回POP3服务器发送的问候字符串 |
POP3.capa() | 查询服务器功能 |
POP3.user(user_name) | 发送用户命令,响应应指示要求输入密码 |
POP3.pass_(password) | 发送密码,响应包括邮件数和邮箱大小。注意:服务器上的邮箱被锁定,直到quit()被调用为止 |
POP3.apop(user_name, secret) | 使用更安全的APOP身份验证登录到POP3服务器 |
POP3.stat() | 获取邮箱状态。结果是2个整数的元组 |
POP3.list([which]) | 请求消息列表 |
POP3.retr(which) | 检索整个消息号 |
POP3.dele(which) | 标志的消息号,其为删除。在大多数服务器上,实际上直到QUIT才执行删除操作 |
POP3.quit() | 签核:提交更改,解锁邮箱,断开连接 |
POP3.top(which, howmuch) | 检索消息首部 |
三. 代码编写
根据上文描述可得, 首先需要连接到POP3服务器, 可以使用POP3.user()和POP3.pass_()方法.
from poplib import POP3email = "xxx@xxx.com"
password = "xxxx" #密码, 使用邮箱的授权码
pop3_server = "pop.qq.com" #示例使用的qq的POP3服务器, 按需求更改server = POP3(pop3_server) #连接到POP3服务器
server.user(email) #身份认证邮箱地址
server.pass_(password) #身份认证,邮箱密码
即可连接到POP3服务器
然后获取邮箱信息:
emailNum, size = server.stat()
print ("Messages: %s. size: %s" % (emailNum, size)) #返回邮箱的数量和占用空间
resp, mails, octets = server.list() #返回所有邮箱的编号
index = len(mails) #获取最新的一封邮件, 索引从1开始resp, lines, octets = server.top(index,0) #只获取邮箱的头msg_content = b'\r\n'.join(lines).decode('utf-8') #每一行加入换行,并转化为UTF-8类型
msg = Parser().parsestr(msg_content) #把邮件内容解析成Message对象server.quit() #关闭连接
如何获取了邮箱的状态, 并且将第一封邮件转化了可处理的Message对象
之后进行下一步的解析操作:
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddrvalue = ['','','']
def print_info(msg):global value i = 0for header in ['From', 'To', 'Subject']: #解析邮件头value[i] = msg.get(header, '')if value[i]:if header == 'Subject': #解析主题value[i] = decode_str(value[i])else:hdr, addr = parseaddr(value[i])name = decode_str(hdr)value[i] = u'%s <%s>' % (name, addr)i = i+1def decode_str(s):value, charset = decode_header(s)[0]if charset:value = value.decode(charset)return value
这两个函数即可将文件的Subject, From, For进行转码显示.
最后贴上整个代码:
from poplib import POP3
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr#################################邮箱信息###########################
email = "xxx@xxx.com"
password = "xxx"
pop3_server = "pop.qq.com"
server = POP3(pop3_server) #连接到POP3服务器################################邮箱解析############################
value = ['','','']
def printMsg(msg):global value i = 0for header in ['From', 'To', 'Subject']: #解析邮件头value[i] = msg.get(header, '')if value[i]:if header == 'Subject': #解析主题value[i] = decode_str(value[i])else:hdr, addr = parseaddr(value[i])name = decode_str(hdr)value[i] = u'%s <%s>' % (name, addr)i = i+1def decode_str(s):value, charset = decode_header(s)[0]if charset:value = value.decode(charset)return value
####################################################################
#server.set_debuglevel(1) #开闭调试信息
#print (server.getwelcome().decode('utf-8')) #打印欢迎信息
server.user(email) #身份认证邮箱地址
server.pass_(password) #身份认证,邮箱密码emailNum, size = server.stat()
print ("Messages: %s. size: %s" % (emailNum, size)) #返回邮箱的数量和占用空间
resp, mails, octets = server.list() #返回所有邮箱的编号
index = len(mails) #获取最新的一封邮件, 索引从1开始resp, lines, octets = server.top(index,0) #只获取邮箱的头msg_content = b'\r\n'.join(lines).decode('utf-8') #每一行加入换行,并转化为UTF-8类型
msg = Parser().parsestr(msg_content) #把邮件内容解析成Message对象printMsg(msg)
print (value)#server.dele(index) #可以根据索引号从服务器删除邮件
server.quit() #关闭连接
四. 结尾
利用POP3接收邮件的作用有很多, 比如像我当前使用的, 利用POP3接收发来的邮件信息, 解析后执行邮件命令. 可以用于远程关机, 远程拍照等各种应用. 欢迎各位一起讨论.
python使用POP3获取邮件信息相关推荐
- python学习——POP3收取邮件
SMTP用于发送邮件,如果要收取邮件呢? 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python ...
- Python通过GeoIP获取IP信息(国家、城市、经纬度等)
IP地址信息是非常重要的情报信息,通过IP可以定位到该IP所在的国家.城市.经纬度等. 获取IP信息的方式有很多,很多服务商都提供了相应的地址库或API接口服务. 如国内的ipip.net,国外的ip ...
- python,ffprobe获取视频信息
背景 需要获取视频基础信息,如果分辨率.大小.播放时长等,研究发现ffprobe工具已经提供了非常全面的视频信息,用ffprobe分析视频很简单,且看我是怎么在python码中调用ffprobe来提取 ...
- python图片修改过、有原图、怎么得到改动的地方_微信发照片原图会泄露行踪?手把手教会你如何用 Python 通过图片获取用户信息!...
原标题:微信发照片原图会泄露行踪?手把手教会你如何用 Python 通过图片获取用户信息! 前言 有媒体曝出,微信发原图或存在泄露位置信息的风险. 对此,腾讯微信团队微博 12 月 1 日发布声明称, ...
- Python网络通信~pop3接收邮件
在 Python进阶教程m9b–网络通信–smtplib发送邮件 一文中桔子菌给大家介绍了怎么用Python发送邮件,俗话说"来而不往非礼也",有发就要有收,这篇文章将带大家熟悉下 ...
- 手把手教你使用Python网络爬虫获取招聘信息
1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...
- python中traceback获取异常信息
在日常工作中,我们常常会碰到异常,我们想在异常发生的时候,不但能显示异常发生的位置,还能看到异常方法被调用的堆栈信息,在python中怎么实现呢? 实际上python提供了一个traceback来实现 ...
- python+shell 批量获取服务器信息并且生成excel表
我们工作中,经常需要获取服务器的一些信息,包括软件的和硬件的.例如刚刚接收的服务器,需要批量获取信息确认硬件配置是否符合我们需求,或者维护很长时间的服务器,中间变动了很多,但是服务器信息没有更改,这个 ...
- 手把手教你使用Python网络爬虫获取音效信息
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 一腔热血勤珍重,洒去犹能化碧涛. ...
最新文章
- C#中调用命令行程序开启wifi热点
- 【正一专栏】运动式的创建文明城市要着干嘛
- Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树
- ELK学习7_ELK文档资料:《ELK stack 权威指南/饶琛琳》勘误
- .NET中扩展方法和Enumerable(System.Linq)
- 综述:编程语言的发展趋势及未来方向
- linux 中断 进程,linux中断分上下部分原因
- Windows10系统下虚拟环境的安装与使用
- thaiphoon burner 使用_果粉请注意,苹果iPhone 12在日常使用时有两大隐忧
- 如何做带宽估计和丢包策略
- java.io.IOException: CreateProcess error=2, ?????????
- cmake设置了CMAKE_MODULE_PATH,include找不到文件
- 24. Swap Nodes in Pairs 1
- R语言数据清洗实战——高效list解析方案
- dotenv 是什么 怎么使用
- 报错Failed to load config “prettier“ to extend from.?两步解决方案
- 大道至简,CAN 诊断的本质,脱离cdd 和dbc ,纯手造轮子
- 计算机英语中bar是什么意思啊,bar是什么意思
- html5 立方体 鼠标滑动,,HTML5超酷3D立方体按钮效果
- Web 应用防火墙如何添加域名
热门文章
- 一篇文章 读懂产品需求文档PRD
- 统计学元知识(从一到全部)
- php 经纬度转地址
- web magic 爬取京东 一个爬虫实现
- nxp电源管理芯片:我国电源芯片的市场现状
- debian 10 buster 安装配置 elastic search 和 中文, 拼音分词
- 坚果云与服务器同步数据,#网盘每日小技巧分享# 如何在坚果云和服务器之间更好地同步数据?...
- Real-world Anomaly Detection in Surveillance Videos解读与实现
- 解决百度快照不更新的办法
- 透明皮肤控件设计系列(一):前言