10. POP3收取邮件
1. POP3协议
POP3
,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件
。提供了SSL加密的POP3协议被称为POP3S
。
POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件
。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是PC机或 MAC。一旦邮件发送到 PC 机或MAC上,邮件服务器上的邮件将会被删除。但POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。
更多POP3协议,可参考以下文章:
a.
https://baike.baidu.com/item/POP3/175122?fr=aladdin
b.
https://blog.csdn.net/liuxiao723846/article/details/106588320/
c.
https://www.zhihu.com/question/356357769/answer/905014431
2. python中的pop3协议
收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。
python内置一个poplib
模块,实现了POP3协议,可以直接用来收邮件
。
注意到POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象
。
所以,收取邮件分两步:
第1步:
用poplib
把邮件的原始文本下载到本地;
第2步:
用email
解析原始文本,还原为邮件对象。
3. 实例
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import poplibemail = '17280xxxxx@qq.com'
password = 'uluwffderhzxxxxx' # 授权码(见9-SMTP发送邮件)
pop3_server = 'pop.qq.com' # qq的POP服务器# 解析内容, 获取编码格式
# Content-Type: text/plain; charset="utf-8"
def getCharset(msgobj):charset = msgobj.get_charset()if charset is None:content_type = msgobj.get('Content-Type', '').lower()pos = content_type.find('charset=')if pos >= 0:charset = content_type[pos + 8:].strip()return charset # 'utf-8'def decode_str(s):value, charset = decode_header(s)[0]if charset:value = value.decode(charset)return valuedef parseMessageObj(msgObj, indent=0):if indent == 0:for header in ['From', 'To', 'Subject']:value = msgObj.get(header, '')if value:if header == 'Subject':value = decode_str(value)else:hdr, addr = parseaddr(value)name = decode_str(hdr)value = u'%s <%s>' % (name, addr)print('%s%s: %s' % (' ' * indent, header, value))if msgObj.is_multipart():parts = msgObj.get_payload()for n, part in enumerate(parts):print('%spart %s' % (' ' * indent, n))print('%s--------------------' % (' ' * indent))parseMessageObj(part, indent + 1)else:content_type = msgObj.get_content_type()if content_type == 'text/plain' or content_type == 'text/html':content = msgObj.get_payload(decode=True)charset = getCharset(msgObj)if charset:content = content.decode(charset)print('%sText: %s' % (' ' * indent, content + '...'))else:print('%sAttachment: %s' % (' ' * indent, content_type))def getMessageObj():server = poplib.POP3(pop3_server) # 连接到POP3服务器server.set_debuglevel(1) # 可以打开或关闭调试信息print(server.getwelcome().decode('utf-8')) # 可选:打印POP3服务器的欢迎文字server.user(email) # 邮箱号server.pass_(password) # 授权码numMessages, sizeMessages = server.stat() # stat()返回邮件数量和占用空间print('>>>>>>>> Messages: {0}, Size: {1}'.format(numMessages, sizeMessages))resp, mails, octets = server.list() # list()返回所有邮件的编号print('>>>>>>> ', mails) # 可以查看返回的列表类似[b'1 9841', b'2 12265', ...]# 获取最新一封邮件, 注意索引号从1开始index = len(mails)resp, lines, octets = server.retr(index)# print('>>>>>> lines:', lines)# lines存储了邮件的原始文本的每一行, 可以获得整个邮件的原始文本rawContext = b'\r\n'.join(lines).decode('utf-8')print('>>>>>>> rawContext:', rawContext)# 将内容解析成Message对象msgObj = Parser().parsestr(rawContext)print('>>>>>> after parsestr():', msgObj)# 关闭服务器server.quit()return msgObjMsgObj = getMessageObj()
print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')
parseMessageObj(MsgObj)
10. POP3收取邮件相关推荐
- Python学习笔记:电子邮件,POP3收取邮件
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python学习——POP3收取邮件
SMTP用于发送邮件,如果要收取邮件呢? 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python ...
- Python POP3读取邮件
Python POP3收取邮件 前提条件 相关介绍 实验环境 读取邮件 获取邮箱授权码 主要步骤 代码实现 输出结果 原始文本信息 解析后文本信息 前提条件 熟悉Python基本语法 相关介绍 Pyt ...
- PHP使用POP3协议类收取邮件
POP3协议类收取邮件 此测试代码需要到服务器邮箱开通pop协议,获取客户端授权密码(详见163内部获取): <?php//此处查看链接状态header("Content-type:t ...
- javamail pop3模式收取邮件
pop3协议收取邮件inbox.getMessages()是一次性读取所有邮件,如果邮箱邮件过多的话,会非常耗时. 还有一个方法是Folder.getMessages(int start, int e ...
- foxmail无法连接zimbra中的POP3端口110来收取邮件
1. 问题描述: 当使用邮件客户端foxmail连接zimbra来收取邮件时,你会发现,收取邮件必须设置成采用SSL来收取, 当采用POP3默认端口110收取时总是提示密码不对,无法收取 2. 原 ...
- 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!
/* 最近写了一个自动收邮件的机器人,原来一开始偷懒"娶"了 COM 组件 JMail: <封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集), ...
- SMTP协议及POP3协议-邮件发送和接收原理(转)
本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...
- linux 自动发邮件脚本,科学网—用linux脚本自动发送和收取邮件 - 周宇的博文
1. 命令行模式下的发送邮件 1.1 安装sendemail 2.2 使用sendemail和举例 2. 命令行模式下的收取邮件 2.1 安装getmail4 2.2 配置getmail4和简单举例 ...
最新文章
- 英特尔提出了一个数学公式,以此证明自动驾驶汽车的安全性
- 【android】错误集锦及解决办法
- mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
- 第二次讲课内容(函数和快速幂)
- ASP.Net 管道模型 VS Asp.Net Core 管道 总结
- java conf_JAVA 解析、编辑nginx.conf详解
- 记录一次cookie导致登录失败的惨案
- python编写安装脚本_2. 编写安装脚本
- 男子欲刺杀游戏公司创始人被抓,还是游戏里“兔女郎”惹的祸?
- linux物理硬盘和sd的对应关系_Linux物理存储结构以及磁盘划分
- python使用缩进来体现-Python使用缩进来体现代码之间的逻辑关系。
- redis集群五种模式(纯概念)
- 算法笔记_面试题_4.树的遍历(前序/中序/后续遍历)
- Selenium中的xpath定位
- java-判断集合中的某个元素的属性是否全部相同
- 爬取百思不得姐段子图片
- 【解决方法】Mac book 外接显示器后,笔记本没声音
- OpenJudge_P1788 Pell数列(递推)
- League-X:深度学习+英雄联盟,英雄联盟小地图识别器,标定对面打野位置
- FastAPI简单示例