【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地

场景假设:

在进行一次培训后,需要收到学员提交的邮件信息,但是由于人员较多,而且每次点开文件保存到当地步骤较为繁琐,人为操作浪费时间还存在着操作失误的可能性,这样就产生进行批量的邮件附件的提取并保存在本地的需求(比如教师、公职人员等)

注意:

1)需要【python办公自动化(19)】和【python办公自动化(20)】的基础

2)以及文件处理相应的基础知识

3)因为读取文件需要联网,所以要保证网络的稳定性

测试前准备好材料

首先准备好不同的文件格式:图片、文档、代码、网页、表格等

第一次发送的内容有:
在这里插入图片描述
第二次发送的内容有:
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第1张图片
文件的类型关于视频类的也可以放入,但是考虑到视频文件比较大,上传比较慢,就没有加入;

发送邮件的操作,进行了两次,防止一次的偶然性(模拟现实中多人发送邮件的情景),下面就开始正式的进行代码操作

代码实现过程

步骤一、前期准备
import keyring
from imbox import Imbox
import os
import shutil
import yagmail
os.chdir(r'C:\Users\86177\Desktop\test')
#password = keyring.get_password("yagmail","[email protected]")
#print(password)

该部分代码实现的功能是:相关库的导入以及程序运行路径的设置,还可以进行测试邮箱的密码是否已经设置完毕,否则无法进行邮件中内容(附件)的读取

步骤二、获取邮件的全部附件信息
password = keyring.get_password("yagmail","[email protected]")
with Imbox('imap.163.com','[email protected]',password) as imbox:
    all_inbox_messages = imbox.messages(unread = True)
    for uid,message in all_inbox_messages:
    	print(message.attachments)
    	print("------------------")

输出的结果为:
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第2张图片
从上可以看出,输出的结果是把每次发送邮件的附件以列表的方式进行存储,而附件中每个具体的文件都是由字典存储信息的,文件的名称与字典中的‘filename’键对应,文件的内容是和字典中的‘content’键对应。

步骤三、创建文件夹,指定文件的存储位置
if message.subject == '附件提取测试':
     if not os.path.exists('图片'):
         os.mkdir('图片')
     if not os.path.exists('文本'):
         os.mkdir('文本')
     if not os.path.exists('文档'):
         os.mkdir('文档')
     if not os.path.exists('代码'):
         os.mkdir('代码')
     if not os.path.exists('表格'):
         os.mkdir('表格')

代码讲解:一般要批量获取某些邮件的附件,肯定是针对于某种主题,而没有必要将全部邮件的附件提取出来,这样的话浪费时间不说,还浪费空间,最重要的是没有意义。所以针对于某个主题,进行附件的提取才是真正的需求,然而有时候,附件里面可能有不同类型的文件,需要我们提取出来时候自动分好类别,这时候要要创建不同的文件夹进行存储文件

步骤四、刷选目标文件、根据不同的文件后缀名分类,并转移文件
if message.attachments:
    for attachment in message.attachments:
        with open(attachment['filename'], 'wb') as f:
            f.write(attachment['content'].getvalue())
            f.close()
            if attachment['filename'].endswith(('.png')) or attachment['filename'].endswith(('.jpg')):
                shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/图片/')
            if attachment['filename'].endswith(('.pdf')) or attachment['filename'].endswith(('.docx')):
                shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/文档/')
            if attachment['filename'].endswith(('.py')):
                shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/代码/')
            if attachment['filename'].endswith(('.txt')):
                shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/文本/')
            if attachment['filename'].endswith(('.xlsx')) or attachment['filename'].endswith(('.xls')):
                shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/表格/')

代码讲解:并不是每个满足主题的邮件都是有内容的,为了防止报错,这里选择有附件的邮件进行操作。由步骤二的输出可知,所有的附件都是以字典的格式存放在列表里面,然后以文件的名称为路径,将文件提取出来,最后按照不同的后缀名进行分类归档,并转移文件到指定的文件夹下面

步骤五、定时任务
import time 
import schedule                     
schedule.every(1).minutes.do(job)

start = time.perf_counter()
while True:
    schedule.run_pending()
    end = time.perf_counter()
    time.sleep(1)
    print("程序运行时间:{:.2f}s".format(end -start))

代码讲解:为了节省时间,可以设置定时任务,比如每天早上8点或者晚上8点进行邮件附件的转移(这里为了调试成功,将时间设置成为了1分钟,关于定时任务的开启,可以回顾【python办公自动化(19)】和【python办公自动化(20)】里面的内容),另外为了显示系统运行的动态过程,可以设置一个计时,可视化程序的输出,免得系统输出界面一直处于空白的状态,而不清楚系统是否真的在运行

全部代码和输出结果

import keyring
from imbox import Imbox
import os
import shutil
import yagmail
os.chdir(r'C:\Users\86177\Desktop\test')
#password = keyring.get_password("yagmail","[email protected]")
#print(password)


def job():
    password = keyring.get_password("yagmail","[email protected]")
    with Imbox('imap.163.com','[email protected]',password) as imbox:
        all_inbox_messages = imbox.messages(unread = True)
        for uid,message in all_inbox_messages:
            
            
            if message.subject == '附件提取测试':
                if not os.path.exists('图片'):
                    os.mkdir('图片')
                if not os.path.exists('文本'):
                    os.mkdir('文本')
                if not os.path.exists('文档'):
                    os.mkdir('文档')
                if not os.path.exists('代码'):
                    os.mkdir('代码')
                if not os.path.exists('表格'):
                    os.mkdir('表格')
            if message.attachments:
                for attachment in message.attachments:
                    with open(attachment['filename'], 'wb') as f:
                        f.write(attachment['content'].getvalue())
                        f.close()
                        if attachment['filename'].endswith(('.png')) or attachment['filename'].endswith(('.jpg')):
                            shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/图片/')
                        if attachment['filename'].endswith(('.pdf')) or attachment['filename'].endswith(('.docx')):
                            shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/文档/')
                        if attachment['filename'].endswith(('.py')):
                            shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/代码/')
                        if attachment['filename'].endswith(('.txt')):
                            shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/文本/')
                        if attachment['filename'].endswith(('.xlsx')) or attachment['filename'].endswith(('.xls')):
                            shutil.move(attachment['filename'],'C:/Users/86177/Desktop/test/表格/')


import time 
import schedule                     
schedule.every(1).minutes.do(job)

start = time.perf_counter()
while True:
    schedule.run_pending()
    end = time.perf_counter()
    time.sleep(1)
    print("程序运行时间:{:.2f}s".format(end -start))

代码运行前:test文件夹下只存有保存以上全部代码的test.py文件,如下
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第3张图片
运行代码后:系统输出框输出如下
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第4张图片
可以看出系统提取全部附件到目标文件夹总共用时大概为30s,最后test文件夹的文件如下,其中未被指定归档的会直接转移到程序运行的路径下面
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第5张图片
下面是个文件夹下的文件,第一个是表格文件夹
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第6张图片
其次是代码文件夹
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第7张图片
其次是图片文件夹
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第8张图片
其次是文本文件夹
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第9张图片
最后是文档文件夹
【python办公自动化(21)】利用python的imbox库批量获取邮件中的附件并保存本地_第10张图片
至此利用python的imbox库进行邮件附件批量读取并保存本地的项目介绍就到此为止了

你可能感兴趣的:(python办公自动化,python,读取邮件,附件批量处理,imbox库,定时任务)