Python实战技巧(1)Python字典类型数据如何递归地通过点‘.’的方式访问

Python实战技巧(2)Python的pdb调试代码方法详解

Python实战技巧(3)多版本兼容安装部署(py27,py34,py35,py36,py37,py38,py39)

Python实战技巧(4)正式在pypi网站发布包的流程详解

Python实战技巧(5)Python版本兼容性测试工具tox实战详解

Python实战技巧(6)Miniconda+Pipenv安装部署开发环境实战详解

Python实战技巧(7)Pycharm如何远程调试远程执行

Python实战技巧(8)Python调用C语言

Python实战技巧(9)Python发送邮件

Python实战技巧(10)Python解析邮件

Python实战技巧(11)使用python收发邮件时需要的邮箱授权码如何获取

(1)使用python编写如下的读取并解析邮件的类库
import re
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddrclass Email(object):def __init__(self):self.__subject = ""self.__from_addr = ""self.__from_name = ""self.__to_name = ""self.__to_addr = ""self.__context = ""self.__html = ""self.__date = ""@propertydef subject(self):return self.__subject@subject.setterdef subject(self, subj):self.__subject = subj@propertydef from_addr(self):return self.__from_addr@from_addr.setterdef from_addr(self, from_addr):self.__from_addr = from_addr@propertydef from_name(self):return self.__from_name@from_name.setterdef from_name(self, from_name):self.__from_name = from_name@propertydef context(self):return self.__context@context.setterdef context(self, ctx):self.__context = ctx@propertydef to_name(self):return self.__to_name@to_name.setterdef to_name(self, to_name):self.__to_name = to_name@propertydef to_addr(self):return self.__to_addr@to_addr.setterdef to_addr(self, to_addr):self.__to_addr = to_addr@propertydef date(self):return self.__date@date.setterdef date(self, date):self.__date = dateclass ReadEmail(object):def __init__(self, mail_server):self.__pop_server = mail_serverself.__username = ""self.__password = ""self.__pop = Nonedef get_latest_n_email(self, n=1, subject="", from_addr="", from_name=""):resp, mails, octets = self.__pop.list()index = len(mails)results = []count = 0for i in range(index, 0, -1):resp, lines, octets = self.__pop.retr(i)msg_content = b'\r\n'.join(lines).decode('utf-8')msg_obj = Parser().parsestr(msg_content)obj = Email()email_subject = self.__decode_header_msg(msg_obj["subject"])if subject.strip() and subject.strip() != email_subject and not re.search(subject.strip(), email_subject):continueobj.subject = email_subjectemail_from_name, email_from_addr = parseaddr(msg_obj["From"])email_from_name = self.__decode_header_msg(email_from_name)email_from_addr = self.__decode_header_msg(email_from_addr)if from_name.strip() and from_name.strip() != email_from_name and not re.search(from_name, email_from_name):continueif from_addr.strip() and from_addr.strip() != email_from_addr and not re.search(from_addr, email_from_addr):continueobj.from_name = email_from_nameobj.from_addr = email_from_addremail_to_name, email_to_addr = parseaddr(msg_obj["To"])email_to_name = self.__decode_header_msg(email_to_name)email_to_addr = self.__decode_header_msg(email_to_addr)obj.to_name = email_to_nameobj.to_addr = email_to_addremail_date = self.__decode_header_msg(msg_obj["Date"])obj.date = email_datecontext = []if msg_obj.is_multipart():for part in msg_obj.get_payload():ctx = self.__decode_body(part)if ctx:context.append(ctx)else:ctx = self.__decode_body(msg_obj)if ctx:context.append(ctx)if context:obj.context = "\n".join(context)count += 1results.append(obj)if count >= n:return resultsreturn resultsdef login(self, username, password):self.__username = usernameself.__password = passwordself.__pop = poplib.POP3(self.__pop_server)self.__pop.set_debuglevel(1)self.__pop.user(username)self.__pop.pass_(password)def __decode_header_msg(self, header):value, charset = decode_header(header)[0]if charset:value = value.decode(charset)return valuedef __decode_body(self, part):content_type = part.get_content_type()txt = ""if content_type == "text/plain" or content_type == 'text/html':content = part.get_payload(decode=True)charset = part.get_charset()if charset is None:content_type_get = part.get('Content-Type', '').lower()position = content_type_get.find('charset=')if position >= 0:charset = content_type_get[position + 8:].strip()if charset:txt = content.decode(charset)return txt
(2)直接使用上述封装库
# 使用pop邮箱服务器实例化一个对象,如下为163的pop邮箱服务器
read_email = ReadEmail("pop.163.com")
# 登录邮箱,密码使用授权码,需要到邮箱设置里点击授权,并将授权码拷贝至此
read_email.login("hitredrose@163.com", "LRRDUVxxxxHNYHEMLK")
# 获取emails对象列表,按照时间顺序倒序获取,同时可以设置过滤条件,过滤条件可以通过邮件标题,发件人名,发件人邮箱过滤,支持正则表达式过滤,返回结果是一个列表,如果没有满足条件的为空列表,如果n设置多个,则返回满足条件的n封邮件,每一封邮件即为一个对象,通过对象属性可以获取到邮件的发送人、发送人邮箱,收件人,收件人邮箱,时间,邮件标题,邮件文本内容,还可以获取回复邮件html格式的邮件内容,此时的属性即为html
# 如下为获取最新的,邮件标题中有‘测试’字样的一封邮件
emails = read_email.get_latest_n_email(n=1, subject="测试")
for obj in emails:print(obj.from_name)print(obj.from_addr)print(obj.to_name)print(obj.to_addr)print(obj.date)print(obj.subject)print(obj.context)

执行结果如下:

打开邮件如下,内容一致

Python实战技巧(10)Python解析邮件相关推荐

  1. Python实战技巧(11)使用python收发邮件时需要的邮箱授权码如何获取

    Python实战技巧(1)Python字典类型数据如何递归地通过点'.'的方式访问 Python实战技巧(2)Python的pdb调试代码方法详解 Python实战技巧(3)多版本兼容安装部署(py2 ...

  2. Python实战技巧系列

    Python实战技巧(1)Python字典类型数据如何递归地通过点'.'的方式访问 Python实战技巧(2)Python的pdb调试代码方法详解 Python实战技巧(3)多版本兼容安装部署(py2 ...

  3. Python实战技巧(9)Python发送邮件

    Python实战技巧(1)Python字典类型数据如何递归地通过点'.'的方式访问 Python实战技巧(2)Python的pdb调试代码方法详解 Python实战技巧(3)多版本兼容安装部署(py2 ...

  4. Python实战|如何使用Python调用大华SDK实现视频监控

    Python实战|如何使用Python调用大华SDK实现视频监控 在当今社会,安全问题越来越受到人们的关注.而视频监控作为一种非常有效的手段,越来越得到人们的重视和使用.大华科技是国内著名的视频监控设 ...

  5. 实战技巧:Python爬取OEM 12C上的告警信息并推送至微信企业号

    关注我们获得更多精彩 作者 | 徐美兰 ,邮政软件开发工程师,广东.湖南邮政金融数据中心任职多年,擅长Oracle数据库性能诊断与调优,对基于Python的数据分析与挖掘开发具有浓厚兴趣. 编者说明: ...

  6. 线上python课程一般多少钱-专业Python实战课程|学习Python需要多少钱?

    Python应该是大家都比较熟悉的编程语言了,也是一门高级的编程语言,Python解释器本身几乎可以在所有操作系统之中进行运行,是一种面向对象的语言. 随着人工智能时代的带来,Python作为人工智能 ...

  7. Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...

  8. 【Python 实战基础】Python 中 PyQt6 的 QPen 介绍

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 PyQt6 QPen 三.菜鸟实战 一.实战场景 实战场景:Python 中 PyQt6 的 QPen 介绍 二.主要知识点 文件读写 基础语法 ...

  9. python实战系列之python变量

    变量与数据类型 变量 编程语言中为了能够更好的处理数据,都需要使用一些变量.Python 语言的变量可以是各种不同的数据类型,使用变量的时候不需要声明直接使用就可以. 变量命名规则 Python 3 ...

最新文章

  1. boost::sort模块实现支持不同分布的随机数生成器的测试程序
  2. android UDP通信
  3. atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...
  4. 人与人之间需要最基本的信任
  5. 性能测试--jmeter如何发送post请求【4】
  6. nginx负载均衡原理(理解篇)
  7. EDA技术实用教程 | 复习七 | 异步清零和同步清零的时序设计
  8. mysql卸载不干净 linux,CentOS下如何完全卸载MySQL?解决卸载不干净的问题
  9. 微信小程序测试版部署
  10. python微信加人_python实现微信自动加好友
  11. hihocoder #1828 : Saving Tang Monk II(BFS)
  12. 作为一个iOS攻城狮不得不了解的网络知识
  13. 世界杯ing~这不来个实时数据可视化?(结尾附源码)
  14. C#之CAD二次开发(8) 图形阵列
  15. //菱形,内藏十字架
  16. 《数据结构与算法基础 严蔚敏版》第三章 堆栈与队列
  17. python修改文件格式为jpg_利用python将webp文件转化为jpg文件,将png文件修改为jpg,图像重命名...
  18. NOIP学习之函数与过程抽象:91.质数的和与积
  19. 自建私有云与公有云托管对比_共享托管和云托管的比较以及如何选择
  20. Android内核模式下对当前进程的cred结构的获取方式

热门文章

  1. 第三回 山有木兮木有枝,心说君兮君不知
  2. 2022年自学Python的万能神器,超有用
  3. 虚拟机共享文件夹不显示
  4. 502粘到手上变硬了怎么办_运动鞋开胶了用了502胶水来粘切变硬了怎么 – 手机爱问...
  5. jQuery学习:事件处理(绑定事件 解绑事件 事件委派/委托))
  6. 朝作猛虎行,暮作猛虎吟。C和C++的区别和联系
  7. 笔记本电脑彻底删除硬盘数据
  8. Spring 中的切点表达式介绍
  9. 关于MKL库的多线程设置
  10. Keras框架下的猫狗识别(一)