一. 前言

曾经写过一篇利用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获取邮件信息相关推荐

  1. python学习——POP3收取邮件

    SMTP用于发送邮件,如果要收取邮件呢? 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python ...

  2. Python通过GeoIP获取IP信息(国家、城市、经纬度等)

    IP地址信息是非常重要的情报信息,通过IP可以定位到该IP所在的国家.城市.经纬度等. 获取IP信息的方式有很多,很多服务商都提供了相应的地址库或API接口服务. 如国内的ipip.net,国外的ip ...

  3. python,ffprobe获取视频信息

    背景 需要获取视频基础信息,如果分辨率.大小.播放时长等,研究发现ffprobe工具已经提供了非常全面的视频信息,用ffprobe分析视频很简单,且看我是怎么在python码中调用ffprobe来提取 ...

  4. python图片修改过、有原图、怎么得到改动的地方_微信发照片原图会泄露行踪?手把手教会你如何用 Python 通过图片获取用户信息!...

    原标题:微信发照片原图会泄露行踪?手把手教会你如何用 Python 通过图片获取用户信息! 前言 有媒体曝出,微信发原图或存在泄露位置信息的风险. 对此,腾讯微信团队微博 12 月 1 日发布声明称, ...

  5. Python网络通信~pop3接收邮件

    在 Python进阶教程m9b–网络通信–smtplib发送邮件 一文中桔子菌给大家介绍了怎么用Python发送邮件,俗话说"来而不往非礼也",有发就要有收,这篇文章将带大家熟悉下 ...

  6. 手把手教你使用Python网络爬虫获取招聘信息

    1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...

  7. python中traceback获取异常信息

    在日常工作中,我们常常会碰到异常,我们想在异常发生的时候,不但能显示异常发生的位置,还能看到异常方法被调用的堆栈信息,在python中怎么实现呢? 实际上python提供了一个traceback来实现 ...

  8. python+shell 批量获取服务器信息并且生成excel表

    我们工作中,经常需要获取服务器的一些信息,包括软件的和硬件的.例如刚刚接收的服务器,需要批量获取信息确认硬件配置是否符合我们需求,或者维护很长时间的服务器,中间变动了很多,但是服务器信息没有更改,这个 ...

  9. 手把手教你使用Python网络爬虫获取音效信息

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 一腔热血勤珍重,洒去犹能化碧涛. ...

最新文章

  1. C#中调用命令行程序开启wifi热点
  2. 【正一专栏】运动式的创建文明城市要着干嘛
  3. Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树
  4. ELK学习7_ELK文档资料:《ELK stack 权威指南/饶琛琳》勘误
  5. .NET中扩展方法和Enumerable(System.Linq)
  6. 综述:编程语言的发展趋势及未来方向
  7. linux 中断 进程,linux中断分上下部分原因
  8. Windows10系统下虚拟环境的安装与使用
  9. thaiphoon burner 使用_果粉请注意,苹果iPhone 12在日常使用时有两大隐忧
  10. 如何做带宽估计和丢包策略
  11. java.io.IOException: CreateProcess error=2, ?????????
  12. cmake设置了CMAKE_MODULE_PATH,include找不到文件
  13. 24. Swap Nodes in Pairs 1
  14. R语言数据清洗实战——高效list解析方案
  15. dotenv 是什么 怎么使用
  16. 报错Failed to load config “prettier“ to extend from.?两步解决方案
  17. 大道至简,CAN 诊断的本质,脱离cdd 和dbc ,纯手造轮子
  18. 计算机英语中bar是什么意思啊,bar是什么意思
  19. html5 立方体 鼠标滑动,,HTML5超酷3D立方体按钮效果
  20. Web 应用防火墙如何添加域名

热门文章

  1. 一篇文章 读懂产品需求文档PRD
  2. 统计学元知识(从一到全部)
  3. php 经纬度转地址
  4. web magic 爬取京东 一个爬虫实现
  5. nxp电源管理芯片:我国电源芯片的市场现状
  6. debian 10 buster 安装配置 elastic search 和 中文, 拼音分词
  7. 坚果云与服务器同步数据,#网盘每日小技巧分享# 如何在坚果云和服务器之间更好地同步数据?...
  8. Real-world Anomaly Detection in Surveillance Videos解读与实现
  9. 解决百度快照不更新的办法
  10. 透明皮肤控件设计系列(一):前言