Python实现IMAP协议接收并解析邮件内容

**前言:**昨天接到这个任务,然后搜索了很多资料和博客去看,这些资料链接我会放在本文后面

一、开通IMAP服务

我以网页邮箱(163邮箱为例

1、登陆网易邮箱并找到设置

2、进入开通页面

3、按照指引步骤来并记住设备密码(授权码),一定要记住,一定要备份

二、编写Python代码

1、登陆邮箱

#-*- encoding: utf-8 -*-
import email,sys
from imapclient import IMAPClient
from bs4 import BeautifulSoup
#服务器网址
hostname = 'imap.163.com'
#用户名即邮箱账号
username = '邮箱账号'
#授权码不是邮箱原密码
passwd = '你的授权码'
#链接服务器
server = IMAPClient(hostname, ssl= True)
#登陆
try:#登陆账号server.login(username, passwd)# 上传客户端身份信息server.id_({"name": "IMAPClient", "version": "2.1.0"})#导航目录的列表,'INBOX','草稿箱'、'已发送'等dictList = server.list_folders()# print(dictList)#对收件箱只读info = server.select_folder('INBOX', readonly = True)
except server.Error:print('Could not login')sys.exit(1)

2、获取收件箱里面的邮件以及内容解析

#获取邮件列表
result = server.search()
for uid in result:massageList = server.fetch(uid,['BODY[]'])mailBody = massageList[uid][b'BODY[]']#邮件内容解析最里面那层是按字节来解析邮件主题内容,这个过程生成Message类型try :#我看其他博主的都是拿到str类型的,如果这个时候拿到邮件的类型是str就用这个email_content = email.message_from_string(mailBody)except TypeError:#但压力在我这,我没拿到str类型的,拿到的是bytes字节类型的,那就用字节解析吧email_content = email.message_from_bytes(mailBody)#如果想知道字符集的可以在这先输出一下,查看结果里面的字符集是'utf-8'还是什么# print(email_content)#标题subject = email.header.make_header(email.header.decode_header(email_content['SUBJECT']))#发件人mail_from = email.header.make_header(email.header.decode_header(email_content['From']))#收件日期envlope = (server.fetch(uid,['ENVELOPE']))[uid][b'ENVELOPE']dates = envlope.date# 获取内容的type编码方式maintype = email_content.get_content_maintype()if maintype == 'multipart':for part in email_content.get_payload():#获取邮件中的文本if part.get_content_maintype() == 'text':#取出正文内容并去掉前后的换行符、空格mail_content = part.get_payload(decode=True).strip()elif maintype == 'text':mail_content = email_content.get_payload(decode=True).strip()    #用对应的字符集去解码try:#解码显示中文,如果utf-8不行用gbk或者其他mail_content = mail_content.decode('gbk')except UnicodeDecodeError:try: #拿到的内容是html格式的mail_content = mail_content.decode('utf-8')except UnicodeDecodeError:print('decode error')sys.exit(1)

3、取出来的内容进行html解析并写入txt

#写进txt
#记得写上编码方式为'gb18030',不然写入txt会报错
with open(f'D:\IMAP\{uid}.txt','w+',encoding="gb18030") as f:
f.write(f'From:{mail_from}'+'\n')
f.write(f'Subject:{subject}'+'\n')
f.write(f'Date:{dates}'+'\n')
f.write(f'正文内容:'+'\n')
#用BeautifulSoup库的HTML解析器来解析邮件文本,并去掉多余的换行符
f.write((BeautifulSoup(mail_content,'html.parser').get_text().strip()).replace('\n\n', '')+'\n')

4、完整代码如下

#-*- encoding: utf-8 -*-
import email,sys
from imapclient import IMAPClient
from bs4 import BeautifulSoup
#服务器网址
hostname = 'imap.163.com'
#用户名即邮箱账号
username = '邮箱账号'
#授权码不是邮箱原密码
passwd = '你的授权码'
#链接服务器
server = IMAPClient(hostname, ssl= True)
#登陆
try:#登陆账号server.login(username, passwd)# 上传客户端身份信息server.id_({"name": "IMAPClient", "version": "2.1.0"})#导航目录的列表,'INBOX','草稿箱'、'已发送'等dictList = server.list_folders()# print(dictList)#对收件箱只读info = server.select_folder('INBOX', readonly = True)
except server.Error:print('Could not login')sys.exit(1)
#获取邮件列表
result = server.search()
for uid in result:massageList = server.fetch(uid,['BODY[]'])mailBody = massageList[uid][b'BODY[]']#邮件内容解析最里面那层是按字节来解析邮件主题内容,这个过程生成Message类型try :email_content = email.message_from_string(mailBody)except TypeError:email_content = email.message_from_string(str(email.message_from_bytes(mailBody)))# print(email_content)#标题subject = email.header.make_header(email.header.decode_header(email_content['SUBJECT']))#发件人mail_from = email.header.make_header(email.header.decode_header(email_content['From']))#收件日期envlope = (server.fetch(uid,['ENVELOPE']))[uid][b'ENVELOPE']dates = envlope.date# 获取内容的type编码方式maintype = email_content.get_content_maintype()if maintype == 'multipart':for part in email_content.get_payload():#获取邮件中的文本if part.get_content_maintype() == 'text':#下载mail_content = part.get_payload(decode=True).strip()elif maintype == 'text':mail_content = email_content.get_payload(decode=True).strip()    try:#解码显示中文,如果utf-8不行用gbk或者其他mail_content = mail_content.decode('gbk')except UnicodeDecodeError:try: mail_content = mail_content.decode('utf-8')except UnicodeDecodeError:print('decode error')sys.exit(1)#写进txtwith open(f'D:\IMAP\{uid}.txt','w+',encoding="gb18030") as f:f.write(f'From:{mail_from}'+'\n')f.write(f'Subject:{subject}'+'\n')f.write(f'Date:{dates}'+'\n')f.write(f'正文内容:'+'\n')f.write((BeautifulSoup(mail_content,'html.parser').get_text().strip()).replace('\n\n', '')+'\n')
# print('From: ', mail_from)
# print('Subject: ', subject)
# print('Date:',dates)
# print('-'*10, 'mail content', '-'*10)
# print(mail_content.replace('<br>', '\n'))
# print('-'*10, 'mail content', '-'*10)
#退出登陆
server.logout()

三、其他参考链接

1、Python实现IMAP协议接收和解析邮件内容

2、什么是IMAP协议

3、python_imap收取邮件 + 邮件内容解析

4、Python IMAP/POP3收取并解析邮件

article/details/114489568)

3、python_imap收取邮件 + 邮件内容解析

4、Python IMAP/POP3收取并解析邮件

5html文本写入txt

Python实现IMAP协议接收并解析邮件内容相关推荐

  1. 【iMessage苹果家庭推源码】软件安装使用IMAP协议接收邮件

    推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...

  2. java pop3 接收邮件_JavaMail使用POP3协议接收并解析电子邮件

    JavaMail使用POP3协议接收并解析电子邮件 代码片段:public static void main(String[] args) throws Exception { receive(); ...

  3. spring boot 中使用 POP3协议读取并解析邮件

    spring boot 中使用 POP3协议读取并解析邮件 1.邮箱授权 QQ邮箱授权,打开 "设置" 切换到 "账户" 找到下图中设置,开启 "PO ...

  4. 活用Koomail的IMAP协议功能同步Gmail邮件

        Gmail是Google推出的邮箱服务,现在已经成为非常流行好用的邮箱之一.我们除了通过传统的webmail方式以及使用邮件客户端的POP3协议来收发外,还可以用Gmail提供的免费Imap协 ...

  5. java Mail imap协议获取到得邮件文件夹名称

    java Mail imap协议获取到得邮件文件夹名称 Imap协议 QQ imap.qq.com 端口:143 获取得邮件 Folder[] list 中 1.其他文件夹 2.INBOX 3.Sen ...

  6. javamail解析邮件内容中含有图片

    有时候邮件正文中含有图片,这类邮件正文该如何保存?话不多说,直接上代码: 大概的实现思想就是:邮件内容中包含图片,则将正文中的图片上传到文件储存服务器(OOS)上,然后将[原图片地址]替换成[上传到O ...

  7. imap java 接收_javamail实现邮件接收功能IMap和pop3方式

    /** * IMAP方式 * */ import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; ...

  8. python3接收、解析邮件

    邮件接收 python3可以使用poplib.POP3进行邮件接收,具体如下: import poplib from email.parser import Parserdef get_email(e ...

  9. (详细总结)python爬取 163收件箱邮件内容,收件箱列表的几种方法(urllib, requests, selenium)

    需求:最近有一个需求,需要将163邮箱收件箱里面的所有邮件的内容全部copy下来,整理到一个word里面,不多也就28页的邮件(不要问我为什么有这需求,不告诉你),自己手动去ctrl+ cv 的话,估 ...

最新文章

  1. mysql AB 的基本搭建
  2. 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )
  3. Disgruntled Judge UVA - 12169
  4. Linux系统proc详解
  5. .NET之生成数据库全流程
  6. c语言类静态数据成员函数,鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员)...
  7. 场景文字检测OD与字符识别OCR概述
  8. php日期转时间戳,指定日期转换成时间戳
  9. 基于安卓android studio的电影订票选座APP设计 前台后台
  10. 股票回测Web应用开发
  11. HTML5中的SVG是什么?
  12. 机器学习与深度学习常见面试题(上)
  13. CPU信息查询与CPU测试方法总结
  14. Linux守护进程编写
  15. jsp027ssm洗衣店管理系统
  16. 知音微服务平台网上订烟_96368手机订烟统一订单下载|96368统一订单平台(湖南烟草统一订单)下载v1.3.6 安卓版_ 2265安卓网...
  17. USES_CONVERSION宏定义
  18. matlab滤波实验,Refined Lee滤波实验MATLAB程序.docx
  19. 如何写一个简单java接口的例子(内容详细,适合初学者)
  20. CSAPP Lab5实验记录 ---- Shell Lab(实验分析 + 完整代码)

热门文章

  1. 2022新版手机软件库游戏库下载系统源码/附教程
  2. android zbar使用
  3. HBase Region原理总结归纳
  4. 2020完美世界Java笔试之礼物盒子
  5. java组件及事件处理(9)--监听器ActionListener
  6. 开展新闻营销为什么大企业不选择新闻发稿平台?
  7. 内存共享CreateFileMapping用法
  8. 欧拉、龙蜥、OpenCloudOS开源社区超前活跃,NextArch、PHP基金会相继成立|开源月报 Vol. 01...
  9. 台式计算机显卡最高温度多少,台式机如何判断显卡温度过高
  10. 那些iOS上好用却不为人知的APP,让你的iPhone好用数倍!