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

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

“备份邮箱全部邮件备份指定用户邮件备份指定内容邮件”
之前的文章中我们也提到 , 基础配置需要打开 POP3/SMTP/IMAP , 针对不同邮箱有不同的操作 , 并以网易 163 邮箱和 QQ 邮箱 举例说明 , 其他邮箱设置基本类似 。详情可以查看我之前的Python办公自动化系列文章 。
如果你来不及看 , 至少需要了解下面几个概念
实用小脚本,教你Python自动化备份邮箱

文章插图
 
为了体现通用性 , 这次我们再换一个邮箱讲解 , 下面的案例均以 88 完美邮箱 为例示范 , 本文主要将分为下面两个部分介绍
  • imbox 收取邮件
  • openpyxl 写入 Excel 文件
自动备份全部邮件至Excel首先来看一个最通用的 , 将邮箱中的全部邮件备份至本地 。
要解决这个需求 , 首先我们利用 keyring 库 , 通过系统密钥环将开启 IMAP/SMTP服务后获得的密码(授权码)预先在本地存储好 。首先打开命令行输入python后输入:
import keyringkeyring.set_password("88mail", "test@88.com", "password")这样 password 在本地存储好了 , 后面只需要 keyring.get_password 获取作为变量即可:
import keyringpassword = keyring.get_password('88mail', 'test@88.com')打开 88 邮箱的网页版 , 进一步确认是否配置是否完成 , 以及服务器邮箱:
实用小脚本,教你Python自动化备份邮箱

文章插图
 
用 imbox 读取邮件的代码如下:
import keyring from imbox import Imboxpassword = 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 datetimedate = '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 输出结果举例如下:


    推荐阅读