Python下载指定邮件附件

      最近工作中需要每天下载邮件到指定目录,随着这样的任务也越来越多了,就准备整理一下,通过工具来解决实际过程中出现的问题。在网络中找了很多,发现其实可以借鉴过来直接套用,也有很多博主介绍,如有侵权,可以联系我,可把链接删除,下面我们来说一下,设计过程中出现的现象。

流程:

  第一步:邮箱登录

  第二步:过滤邮箱内容

  第三步:附件下载

  第四步:解压压缩包



import configparser

import os

import poplib

import email

import time

import zipfile

from email.parser import Parser

from email.header import decode_header

from email.utils import parseaddr

import rarfile

def decode_str(s):#字符编码转换

    value, charset = decode_header(s)[0]

    if charset:

        value = value.decode(charset)

    return value

def get_att(msg):

    attachment_files = []

    for part in msg.walk():

        file_name = part.get_filename()  # 获取附件名称类型

        contType = part.get_content_type()

        if file_name:

            h = email.header.Header(file_name)

            dh = email.header.decode_header(h) # 对附件名称进行解码

            filename = dh[0][0]

            if dh[0][1]:

                filename = decode_str(str(filename, dh[0][1]))  # 将附件名称可读化

                print(filename)

                # filename = filename.encode("utf-8")

            data = part.get_payload(decode=True)  # 下载附件

            att_file = open(savepath+"\\"+ filename, 'wb')  # 在指定目录下创建文件,注意二进制文件需要用wb模式打开

            attachment_files.append(filename)

            att_file.write(data)  # 保存附件

            att_file.close()

    return attachment_files

def ziprun(savepath):

        for root, dirs, files in os.walk( savepath):

            try:

                for file in files:

                    if ".zip"  in os.path.splitext(file)[1] :

                        path =  savepath +"\\" + file

                        os.chdir( savepath)

                        zip = zipfile.ZipFile(file)  # 待解压文件

                        #zip.extractall(src_dir1)  # 解压指定文件

                        zip.extractall( savepath)

                        zip.close()

                        os.remove(path)

                    if ".rar" in os.path.splitext(file)[1]:

                        path =  savepath + "\\" + file

                        os.chdir( savepath)

                        rf = rarfile.RarFile(file)  # 待解压文件

                        rf.extractall( savepath)  # 解压指定路径

                        rf.close()

                        os.remove(path)

            except Exception as  err:

                  print(err)

# # POP3服务器、用户名、密码

# 此处密码是授权码,用于登录第三方邮件客户端

password = '*****'

username='****'

host = 'smtp.exmail.qq.com'

qihuofele = []

path = os.path.join(os.path.dirname(__file__), 'siteplace.ini').replace('\\', '/')

config = configparser.RawConfigParser()

config.read('siteplace.ini')

opts = config.options("site1")

savepath="D:\\pathname\\"

sec = config.sections()

for section in sec:

    mailinfo = config.get(section, 'mail')

    qihuofele.append(mailinfo)

# 连接到POP3服务器

server = poplib.POP3(host)

server.user(username)

server.pass_(password) # 参数是你的邮箱密码,如果出现poplib.error_proto: b'-ERR login fail',就用开启POP3服务时拿到的授权码

# stat()返回邮件数量和占用空间:

# print('Messages: %s. Size: %s' % server.stat())

# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]

resp, mails, octets = server.list()

# print(mails)

# 倒序遍历邮件

index = len(mails)

for i in range(index, 0, -1):

    try:

        # lines存储了邮件的原始文本的每一行

        resp, lines, octets = server.retr(i)

        # 邮件的原始文本:

        msg_content = b'\r\n'.join(lines).decode('utf-8')

        # 解析邮件:

        msg = Parser().parsestr(msg_content)

        msg = Parser().parsestr(msg_content)

        From = parseaddr(msg.get('from'))[1]

        To = parseaddr(msg.get('To'))[1]

        Cc = parseaddr(msg.get_all('Cc'))[1]  # 抄送人

        if From in qihuofele and ('xxjs@qq.com' in To):

            # 获取附件

            f_list = get_att(msg)

            ziprun(savepath)

    except:

        print(i)

print("文件已下载完成!")

出现问题记录:

①获取日期问题

date1 = time.strptime(msg.get("Date")[0:24], '%a, %d %b %Y %H:%M:%S') 

获取邮件时间,格式化收件时间时,会遇见获取不同日期时,返回的格式不同,如需对时间进行控制的话 则需要对格式进行判断

②遍历邮件,耗时较长

③若程序不退出,程序第一次下载后,需要重启再次下载


简书是为了记录学习的一个状态,希望大家也在这条道路上越来越棒,

每天都有新朋友加入,感觉大家的信任,有新的想法的朋友,可以关注,一起探讨!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容