利用python +pyqt5,实现腾讯企业邮箱附件的批量下载

需求描述:

最近工作中,需要每天下载指定邮件到对应目录,并解压。随着这样的任务也越来越多了,就准备整理一下,通过程序来解决工作过程中出现的重复性工作。在网络中找了很多,其实可以借鉴过来直接套用,也有很多博主介绍,模式很多,希望这款能给你带来一点收获,或者可以与我沟通,进行优化。

实现效果:

①界面设计

在这里插入图片描述
通过qt creator设计出一个小框架,可以设置定时任务,开始时间、下载目录,需要下载的邮箱信息、打印下载日志等。在这里插入图片描述
②邮箱登录
邮箱登录分好多种情况要根据实际情况进行配置。首先邮箱需要开启pop协议服务
在这里插入图片描述

   #ssl连接
   self.server = poplib.POP3_SSL(self.pop3_server, 995, timeout=10)
   #非ssl模式
   self.server = poplib.POP3(self.pop3_server, 110, timeout=10)

在这里插入图片描述

    username = '*****'
    password = '******'
    pop3_server = 'pop.exmail.qq.com'
    # 连接到POP3服务器,不带SSL的:
    server = poplib.POP3(pop3_server,110, timeout=10)
    # 可以打开或关闭调试信息:
    server.set_debuglevel(0)
    # POP3服务器的欢迎文字:
    print(server.getwelcome())
    # 身份认证:
    server.user(username)
    server.pass_(password)

③代码实现

import ftplib
import poplib
import email
import os
import zipfile
from email.parser import Parser
from email.header import decode_header, 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 ziprun( savepath):
    for root, _, files in os.walk(savepath):
        for file in files:
            file_path = os.path.join(root, file)
            try:
                if file_path.endswith('.zip'):
                    with zipfile.ZipFile(file_path, 'r') as zip_ref:
                        zip_ref.extractall(savepath)
                elif file_path.endswith('.rar'):
                    with rarfile.RarFile(file_path, 'r') as rar_ref:
                        rar_ref.extractall(savepath)
                else:
                    return

                os.remove(file_path)
                print(f"解压并删除: {file_path}")
            except Exception as err:
                print(f"解压文件 {file_path} 时出错: {err}")

def get_att( msg, savepath):
    attachment_files = []
    for part in msg.walk():
        file_name = part.get_filename()
        if not file_name:
            continue

        h = Header(file_name)
        dh = decode_header(h)
        filename = dh[0][0]
        if isinstance(filename, bytes):
            filename = decode_str(filename.decode(dh[0][1] or 'utf-8'))
        if isinstance(filename, str):
            att_file_path = os.path.join(savepath, filename)
            with open(att_file_path, 'wb') as att_file:
                att_file.write(part.get_payload(decode=True))
            attachment_files.append(filename)
            print(f"下载附件: {filename}")
    return attachment_files


if __name__ == '__main__':

    username = '*****'
    password = '*****'
    pop3_server = 'pop.exmail.qq.com'
    # 连接到POP3服务器,不带SSL的:
    server = poplib.POP3(pop3_server,110, timeout=10)
    # 可以打开或关闭调试信息:
    server.set_debuglevel(0)
    # POP3服务器的欢迎文字:
    print(server.getwelcome())
    # 身份认证:
    server.user(username)
    server.pass_(password)
    savepath = 'd://data//'#self.path_qh.text()
    resp, mails, octets = server.list()
    index = len(mails)
    for i in range(index, 0, -1):
        try:
            resp, lines, octets = server.retr(i)
            msg_content = b'\r\n'.join(lines).decode('utf-8')
            msg = Parser().parsestr(msg_content)
            From = parseaddr(msg.get('from'))[1]
            To = parseaddr(msg.get('To'))[1]
            f_list = get_att(msg, savepath)
            if f_list:
                ziprun(savepath)
        except ftplib.error_temp as e:
            print(f"临时错误: {e}, 尝试重新连接或稍后再试")
        except ftplib.error_perm as e:
            print(f"权限错误: {e}, 检查文件路径或权限")
        except Exception as e:
            print(f"其他错误: {e}, 检查网络连接或服务器状态")


演示比较粗糙,具体以下信息可以在具体研究
①下载那些发件人的附件
②设置只下载当天或者近期目录
③下载到那个目录
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值