需求描述:
最近工作中,需要每天下载指定邮件到对应目录,并解压。随着这样的任务也越来越多了,就准备整理一下,通过程序来解决工作过程中出现的重复性工作。在网络中找了很多,其实可以借鉴过来直接套用,也有很多博主介绍,模式很多,希望这款能给你带来一点收获,或者可以与我沟通,进行优化。
实现效果:
①界面设计
通过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}, 检查网络连接或服务器状态")
演示比较粗糙,具体以下信息可以在具体研究
①下载那些发件人的附件
②设置只下载当天或者近期目录
③下载到那个目录