基于Python3 下载邮箱附件,并解压到指定文件夹


 
 
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- encoding: gbk -*-

# 目前只测试过网易163邮箱,qq邮箱时间格式与163有所不同需要更改时间格式那部分的代码


import poplib
import email
import datetime
import time
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import traceback
import sys
import telnetlib
import zipfile
import os
import shutil
# from email.utils import parseaddr
 
 


class c_step4_get_email:
    """创建一个处理邮箱附件下载和解压的类"""
    # @staticmethod     
    def decode_str(str_in):
        """字符编码转换"""
        value, charset = decode_header(str_in)[0]
        if charset:
            value = value.decode(charset)
        return value
 
    # @staticmethod
    def get_att(msg_in, str_day_in):
        """解析邮件,获取附件"""
        # import email
        attachment_files = []
        for part in msg_in.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 = c_step4_get_email.decode_str(str(filename, dh[0][1]))
                    print(filename)
                    # filename = filename.encode("utf-8")
                # 下载附件
                data = part.get_payload(decode=True)
                # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
                att_file = open('C:\\Users\\Administrator\\Desktop\\银联对账zip文件临时存放文件夹' + '\\' + filename, 'wb')
                attachment_files.append(filename)
                att_file.write(data)  # 保存附件
                att_file.close()
        return attachment_files
 
    # @staticmethod
    def run_ing():
        """登陆邮箱"""
        # 输入邮件地址, 口令和POP3服务器地址:
        email_user = '******@163.com'
        # 此处密码是授权码,用于登录第三方邮件客户端
        password = '******'
        pop3_server = 'pop.163.com'
        # 日期赋值
        day = datetime.date.today()
        str_day = str(day).replace('-', '')
        print(str_day)
        # 连接到POP3服务器,有些邮箱服务器需要ssl加密,可以使用poplib.POP3_SSL
        try:
            telnetlib.Telnet('pop.163.com', 995)
            server = poplib.POP3_SSL(pop3_server, 995, timeout=10)
        except:
            time.sleep(5)
            server = poplib.POP3(pop3_server, 110, timeout=10)
        # 可以打开或关闭调试信息
        server.set_debuglevel(1)
        # 打印POP3服务器的欢迎文字:
        print(server.getwelcome().decode('utf-8'))
        # 身份认证:
        server.user(email_user)
        server.pass_(password)
        # 返回邮件数量和占用空间:
        print('Messages: %s. Size: %s' % server.stat())
        # list()返回所有邮件的编号:
        resp, mails, octets = server.list()
        # 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
        print(mails)
        index = len(mails)
        # 倒序遍历邮件
        # for i in range(index, 0, -1):
        # 顺序遍历邮件
        a = 1
        while a == 1:
            global number
            for i in range(number, index+1):
                resp, lines, octets = server.retr(i)
                # lines存储了邮件的原始文本的每一行,
                # 邮件的原始文本:
                msg_content = b'\r\n'.join(lines).decode('unicode_escape')
                # 解析邮件:
                msg = Parser().parsestr(msg_content)
                From = parseaddr(msg.get('from'))[1]           # 发件人
                To = parseaddr(msg.get('To'))[1]               # 收件人
                Cc = parseaddr(msg.get_all('Cc')) [1]             # 抄送人
                Subject = parseaddr(msg.get('Subject'))[1]        #主题
                print('from:%s,to:%s,Cc:%s,Subject%s:'%(From,To,Cc,Subject))
                if From == 'operator_gd@unionpay.com':         # 判断是否来自指定邮箱
                    # 获取邮件时间,格式化收件时间
                    date1 = time.strptime(msg.get("Date")[0:24], '%a, %d %b %Y %H:%M:%S')
                    # 邮件时间格式转换
                    date2 = time.strftime("%Y%m%d", date1)
                    if date2 < str_day:
                        # 倒叙用break
                        # break
                        # 顺叙用continue
                        continue
                    else:
                        # 获取附件
                        c_step4_get_email.get_att(msg, str_day)
                        a += 1
                else:
                    number += 1
                    # c_step4_get_email.run_ing()

                
        server.quit()

    def un_zip(file_name):
        """解压单个文件"""
        zip_file = zipfile.ZipFile(file_name)           #读取zip文件
        for names in zip_file.namelist():
            zip_file.extract(names,local)               #解压
        zip_file.close()
        if os.path.exists(file_name):                 #用os中rename 重命名的方法剪贴zip文件
            os.rename(file_name,zip_path + file_name[48:])
        print(file_name,'解压成功')

    def un_zip_Tree(path):                        
        """解压文件夹中的zip文件"""
        if not os.path.exists(path):                    # 如果本地文件夹不存在,则创建它
            os.makedirs(path)
        for file in os.listdir(path):                   #listdir()返回当前目录下清单列表
            Local = os.path.join(path, file)             #os.path.join()用于拼接文件路径
            if os.path.isdir(file):                      # 判断是否是文件
                if not os.path.exists(Local):           #对于文件夹:如果本地不存在,就创建该文件夹
                    os.makedirs(Local)
                un_zip_Tree(path)
            else:  # 是文件
                if os.path.splitext(Local)[1] == '.zip': #os.path.splitext(Remote)[1]获取文件扩展名,判断是否为.zip文件
                    c_step4_get_email.un_zip(Local)      #解压文件
                    
 
if __name__ == '__main__':
    origin = sys.stdout
    number = 1
    zip_path = 'C:\\Users\\Administrator\\Desktop\\'
    local = 'C:\\Users\\Administrator\\Desktop\\'         # 此处看实际解压到的存储路径
    path = 'C:\\Users\\Administrator\\Desktop\\'          # 此处看实际存储压缩文件的路径
    # 简单的日志处理  将日志写入到log.txt
    f = open('E:\python_project\log.txt', 'w')
    sys.stdout = f
    try:
        c_step4_get_email.run_ing()
    except Exception as e:
        s = traceback.format_exc()
        print(e)
        tra = traceback.print_exc()
    sys.stdout = origin
    c_step4_get_email.un_zip_Tree(path)
    f.close()
 

下载附件部分原文地址:https://blog.csdn.net/u012209894/article/details/82384987/
解压部分原文地址:https://www.cnblogs.com/testxiaobai/p/10515443.html
经过自己做了小修改实现自己的功能

生成exe文件命令:pyinstaller -F 脚本名.py


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM