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收取邮件相关推荐

  1. Python学习笔记:电子邮件,POP3收取邮件

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

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

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

  3. Python POP3读取邮件

    Python POP3收取邮件 前提条件 相关介绍 实验环境 读取邮件 获取邮箱授权码 主要步骤 代码实现 输出结果 原始文本信息 解析后文本信息 前提条件 熟悉Python基本语法 相关介绍 Pyt ...

  4. PHP使用POP3协议类收取邮件

    POP3协议类收取邮件 此测试代码需要到服务器邮箱开通pop协议,获取客户端授权密码(详见163内部获取): <?php//此处查看链接状态header("Content-type:t ...

  5. javamail pop3模式收取邮件

    pop3协议收取邮件inbox.getMessages()是一次性读取所有邮件,如果邮箱邮件过多的话,会非常耗时. 还有一个方法是Folder.getMessages(int start, int e ...

  6. foxmail无法连接zimbra中的POP3端口110来收取邮件

    1. 问题描述: 当使用邮件客户端foxmail连接zimbra来收取邮件时,你会发现,收取邮件必须设置成采用SSL来收取,   当采用POP3默认端口110收取时总是提示密码不对,无法收取 2. 原 ...

  7. 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!

    /* 最近写了一个自动收邮件的机器人,原来一开始偷懒"娶"了 COM 组件 JMail: <封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集), ...

  8. SMTP协议及POP3协议-邮件发送和接收原理(转)

    本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...

  9. linux 自动发邮件脚本,科学网—用linux脚本自动发送和收取邮件 - 周宇的博文

    1. 命令行模式下的发送邮件 1.1 安装sendemail 2.2 使用sendemail和举例 2. 命令行模式下的收取邮件 2.1 安装getmail4 2.2 配置getmail4和简单举例 ...

最新文章

  1. 英特尔提出了一个数学公式,以此证明自动驾驶汽车的安全性
  2. 【android】错误集锦及解决办法
  3. mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
  4. 第二次讲课内容(函数和快速幂)
  5. ASP.Net 管道模型 VS Asp.Net Core 管道 总结
  6. java conf_JAVA 解析、编辑nginx.conf详解
  7. 记录一次cookie导致登录失败的惨案
  8. python编写安装脚本_2. 编写安装脚本
  9. 男子欲刺杀游戏公司创始人被抓,还是游戏里“兔女郎”惹的祸?
  10. linux物理硬盘和sd的对应关系_Linux物理存储结构以及磁盘划分
  11. python使用缩进来体现-Python使用缩进来体现代码之间的逻辑关系。
  12. redis集群五种模式(纯概念)
  13. 算法笔记_面试题_4.树的遍历(前序/中序/后续遍历)
  14. Selenium中的xpath定位
  15. java-判断集合中的某个元素的属性是否全部相同
  16. 爬取百思不得姐段子图片
  17. 【解决方法】Mac book 外接显示器后,笔记本没声音
  18. OpenJudge_P1788 Pell数列(递推)
  19. League-X:深度学习+英雄联盟,英雄联盟小地图识别器,标定对面打野位置
  20. FastAPI简单示例

热门文章

  1. [魔方]手部极限运动
  2. linux 清屏命令(3种方式)
  3. c# 发送邮件,抄送人格式:半角逗号隔开
  4. 居中到底有多少种方法
  5. Google Earth Engine——打印 PNG 图表
  6. 学员_国培阶段性学习心得体会
  7. 【Java基础】面向对象与面向过程、编译型语言与解释型语言
  8. iOS学习笔记-108.多线程07——CGD栅栏函数、延时、一次性代码
  9. 大环境不好,找工作太难?三面阿里,幸好做足了准备,已拿offer
  10. 数据结构课程设计农夫过河