您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

实用小脚本,教你Python自动化备份邮箱

时间:2021-04-20 10:52:14  来源:早起Python  作者:自动化工作组

来源:早起Python/ target=_blank class=infotextkey>Python

作者:自动化工作组

大家好,我是早起。

在之前的文章中我们已经了解如何对自己的邮箱做一些代码操作前的基础配置,以及通过 Python 代码收发、读取邮件。本文将进一步讲解如何利用Python备份邮件,主要将涉及三种不同的形式

“备份邮箱全部邮件备份指定用户邮件备份指定内容邮件”

之前的文章中我们也提到,基础配置需要打开 POP3/SMTP/IMAP,针对不同邮箱有不同的操作,并以网易 163 邮箱和 QQ 邮箱 举例说明,其他邮箱设置基本类似。详情可以查看我之前的Python办公自动化系列文章。

如果你来不及看,至少需要了解下面几个概念

实用小脚本,教你Python自动化备份邮箱

 

为了体现通用性,这次我们再换一个邮箱讲解,下面的案例均以 88 完美邮箱 为例示范,本文主要将分为下面两个部分介绍

  • imbox 收取邮件
  • openpyxl 写入 Excel 文件

自动备份全部邮件至Excel

首先来看一个最通用的,将邮箱中的全部邮件备份至本地。

要解决这个需求,首先我们利用 keyring 库,通过系统密钥环将开启 IMAP/SMTP服务后获得的密码(授权码)预先在本地存储好。首先打开命令行输入python后输入:

import keyring
keyring.set_password("88mail", "test@88.com", "password")

这样 password 在本地存储好了,后面只需要 keyring.get_password 获取作为变量即可:

import keyring
password = keyring.get_password('88mail', 'test@88.com')

打开 88 邮箱的网页版,进一步确认是否配置是否完成,以及服务器邮箱:

实用小脚本,教你Python自动化备份邮箱

 

用 imbox 读取邮件的代码如下:

import keyring 
from imbox import Imbox
password = keyring.get_password('88mail', 'test@88.com')

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    # 获取全部邮件
    all_inbox_messages = imbox.messages() # 获取全部邮件
    for uid, message in all_inbox_messages:
        print(uid) # 邮件编号
        print(message.sent_from) # 发件人
        print(message.subject)  # 邮件主题
        print(message.date) # 日期
        print(message.body['plain']) # 邮件文本格式正文
        print(message.attachments) # 附件

关于上面的代码有几个地方需要注意一下:

  • Imbox('imap.qq.com', 'xxx@qq.com', password, ssl=True) 这行代码中需要填写服务器、用户名邮箱、密码、SSL加密
  • 循环体中 uid 参数是每封邮件的编号,邮件编号十分重要,可以用于邮件的标记和删除
  • message.sent_from 返回一个包裹字典的列表,这个字典有两个键:name 和 email,name 即用户名(或昵称),email 是发件人的邮箱
  • message.date 获取的字符串内容如 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)' ,一个 GMT 格式的时间,我们需要将它转化为正常的日期(年月日)+时间(时分秒),也就是将 GMT 时间格式的字符串转换成datetime 类型,可以通过下面的代码:
import datetime

date = 'Tue, 3 Nov 2020 08:08:16 +0800 (GMT+08:00)'
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'

print(datetime.datetime.strptime(date, GMT_FORMAT))
# 2020-11-03 08:08:16

同样需要注意的是

  1. message.body['plain'] 正文以字符串列表形式返回
  2. message.attachments 输出结果举例如下:
[{'content-type': 'Application/x-zip-compressed', 'size': 1160851, 'content': <_io.BytesIO object at 0x046A7B68>, 'filename': 'xxxx.zip'}]

也是一个字典列表,一个附件为一个字典,包括 content-type size content filename 4 个键,即类型、大小、内容、文件名。若无附件则返回空列表。

有了上面的知识我们就可以重新把邮件的关键信息都解析成字符串形式方便存储:

import keyring 
from imbox import Imbox
import datetime

password = keyring.get_password('88mail', 'test@88.com')

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    all_inbox_messages = imbox.messages() # 获取全部邮件
    for uid, message in all_inbox_messages:
        name = message.sent_from[0]['name'] # 发件人姓名
        email = message.sent_from[0]['email'] # 发件人邮箱
        title = message.subject

        GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
        email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
        email_date = email_datetime.strip()[0] # 发送日期
        email_time = email_datetime.strip()[1] # 发送时间

        text = message.body['plain'] # 文本格式正文
        attachment_lst = []
        attachments = ''
        if message.attachments:
            for attachment in message.attachments:
                attachment_lst.append(attachment['filename'])
            attachments = ', '.join(attachment_lst)
        print(uid, name, email, title, email_date, email_time)
        print(text, attachments if attachments else '无')

接着利用 openpyxl 写入上述信息即可,首先在程序开头创建好表头,明确存储的信息:

from openpyxl import Workbook

workbook = Workbook() # 创建新工作簿
sheet = workbook.active
heading = ['邮件名', '发件人姓名', '发件人邮箱', '发送日期', '发送时间', '邮件正文', '附件']
sheet.append(heading)

后面随着邮件的遍历将内容写入表格即可。案例一的完整代码如下:

import keyring
from imbox import Imbox
import datetime
from openpyxl import Workbook

workbook = Workbook() # 创建新工作簿
sheet = workbook.active
heading = ['邮件名', '发件人姓名', '发件人邮箱', '发送日期', '发送时间', '邮件正文', '附件']
sheet.append(heading)

password = keyring.get_password('88mail', 'test@88.com')

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    all_inbox_messages = imbox.messages() # 获取全部邮件
    for uid, message in all_inbox_messages:
        name = message.sent_from[0]['name'] # 发件人姓名
        email = message.sent_from[0]['email'] # 发件人邮箱
        title = message.subject

        GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
        email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
        email_date = email_datetime.strip()[0] # 发送日期
        email_time = email_datetime.strip()[1] # 发送时间

        text = message.body['plain'] # 文本格式正文
        attachment_lst = []
        attachments = ''
        if message.attachments:
            for attachment in message.attachments:
                attachment_lst.append(attachment['filename'])
            attachments = ', '.join(attachment_lst)
        sheet.append([title, name, email, email_date, email_time, text, attachments])

workbook.save('xxxxx.xlsx')

备份指定用户邮件至本地

现在来看进阶一点的需求,备份指定用户的邮件,比如

备份收件箱中所有小明(xiaoming@qq.com)发来的邮件至 Excel,然后删除这些邮件

其实如果顺利理解了案例一,那么这个案例就特别简单了 从上面的案例中我们知道,通过下面的代码就可以获取发件人邮箱:

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    all_inbox_messages = imbox.messages() 
    for uid, message in all_inbox_messages:
        email = message.sent_from[0]['email'] # 发件人邮箱

那么只需要在这个基础上判断 if email == 'xiaoming@qq.com' 就可以往后执行相应代码了。另外,删除邮件是基于邮箱编号 uid 的,代码为 imbox.delete(uid) ,具体代码举例:

for uid, message in all_inbox_messages: 
    if 满足某种条件的邮件: 
        imbox.delete(uid)

那么,我们综合上述两个知识点以及案例一的知识延伸,就很好写出案例二的代码了:

import keyring
from imbox import Imbox
import datetime
from openpyxl import Workbook

workbook = Workbook() 
sheet = workbook.active
heading = ['邮件名', '发件人姓名', '发件人邮箱', '发送日期', '发送时间', '邮件正文', '附件']
sheet.append(heading)

password = keyring.get_password('88mail', 'test@88.com')

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    all_inbox_messages = imbox.messages() 
    for uid, message in all_inbox_messages:
        email = message.sent_from[0]['email'] 
        if email == 'xiaoming@qq.com': # 在此处判断发件人
            name = message.sent_from[0]['name']
            title = message.subject
            GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
            email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
            email_date = email_datetime.strip()[0]
            email_time = email_datetime.strip()[1]
            text = message.body['plain']
            attachment_lst = []
            attachments = ''
            if message.attachments:
                for attachment in message.attachments:
                    attachment_lst.append(attachment['filename'])
                attachments = ', '.join(attachment_lst)
            sheet.append([title, name, email, email_date, email_time, text, attachments])
            imbox.delete(uid) # 在此处删除符合要求的邮件 
            
workbook.save('xxxxx.xlsx')

备份指定内容邮件

上一个需求是备份指定用户的邮件,现在也可以备份包含指定内容的邮件,例如

备份收件箱中标题含有 “奖金” 的邮件至 Excel,然后红旗标记这些邮件

基本思路跟案例二类似,不过多展开讲,只复习两个知识点。要判断标题是否有“奖金”二字:

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    all_inbox_messages = imbox.messages() 
    for uid, message in all_inbox_messages:
        title = message.subject
        if '奖金' in title:
            pass

红旗标记邮件也删除邮件一样,也是基于邮箱编号 uid 的,具体代码举例:

for uid, message in all_inbox_messages: 
    if 满足某种条件的邮件: 
        imbox.mark_flag(uid)

故案例三的完整代码如下:

import keyring
from imbox import Imbox
import datetime
from openpyxl import Workbook

workbook = Workbook() 
sheet = workbook.active
heading = ['邮件名', '发件人姓名', '发件人邮箱', '发送日期', '发送时间', '邮件正文', '附件']
sheet.append(heading)

password = keyring.get_password('88mail', 'test@88.com')

with Imbox('imap.88.com', 'test@88.com', password, ssl=True) as imbox: 
    all_inbox_messages = imbox.messages() 
    for uid, message in all_inbox_messages:
        title = message.subject  
        if '奖金' in title: # 判断标题是否含指定内容
            name = message.sent_from[0]['name']
            email = message.sent_from[0]['email'] 
            GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0800 (GMT+08:00)'
            email_datetime = str(datetime.datetime.strptime(message.date, GMT_FORMAT))
            email_date = email_datetime.strip()[0]
            email_time = email_datetime.strip()[1]
            text = message.body['plain']
            attachment_lst = []
            attachments = ''
            if message.attachments:
                for attachment in message.attachments:
                    attachment_lst.append(attachment['filename'])
                attachments = ', '.join(attachment_lst)
            sheet.append([title, name, email, email_date, email_time, text, attachments])
            imbox.mark_flag(uid) # 在此处标记符合要求的邮件 
            
workbook.save('xxxxx.xlsx')

以上就是通过Python实现邮件管理自动化的三个实用案例,完整代码都已经给出,感兴趣的读者可以自行尝试!



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  Tags: Python  点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  Tags: Python  点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  Tags: Python  点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  Tags: Python  点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  Tags: Python  点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  Tags: Python  点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  Tags: Python  点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  Tags: Python  点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  Tags: Python  点击:(28)  评论:(0)  加入收藏
假设某日我开了一家空调公司,暂且就叫他天强空调安装设备公司吧,假装自己有公司,接了一单大生意,就是给甘肃省的各个高校安装空调(其实这边的气候基本用不到空调,就是假想一下),那么...【详细内容】
2022-07-01  Tags: Python  点击:(33)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条