163邮件附件批量下载
作者:互联网
问题描述:
近期收到n多邮件,含电子表格附件;现要求用Python批量下载邮件附件。
import tkinter as tk
import poplib
from email.parser import Parser
from email.header import decode_header
# from email.utils import parseaddr
import os
import time
import sys
# 单击“下载”按钮
def download():
if en1.get() == "":
en1.insert(0, '请输入服务器地址!')
if en2.get() == "":
en2.insert(0, '请输入邮箱地址!')
if en3.get() == "":
en3.insert(0, '请输入身份认证密码!')
else:
# 链接到pop3服务器
# M = poplib.POP3("pop.163.com")
M = poplib.POP3(en1.get())
# 认证:身份认证
# M.user("******@163.com")
M.user(en2.get())
# M.pass_("****************")
M.pass_(en3.get())
# 获取邮件数量
dd = len(M.list()[1])
# print(M.list()[1])
for i in range(1, dd + 1, 1):
# 获取最新一封邮件,注意索引号从1开始
resp, lines, octets = M.retr(i)
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 解析邮件为Message对象
msg = Parser().parsestr(msg_content)
# 获取附件
f_list = get_att(msg, str(i))
# 字符编码转换
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def get_att(msg, id):
import email
attachment_files = []
# 获取当前日期字符串
time_now = time.strftime("%Y%m%d", time.localtime())
# 打印系统桌面路径
# print(os.path.join(os.path.expanduser("~"), 'Desktop'))
# 打印当前路径
# print(os.path.dirname(__file__))
# 设置路径未系统桌面路径+'/'+当前日期,为存放下载文件路径
path = os.path.join(os.path.expanduser("~"), 'Desktop') + '/' + time_now
# 以path创建文件夹,如果文件夹存在则不创建
if not os.path.exists(path):
os.makedirs(path)
# print(f'文件夹 {path} 创建完成')
# INSERT表示在光标位置插入
t1.insert('end', f'文件夹 {path} 创建完成\n')
# t1.see(fm_main.END)
t1.update()
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(f'正在下载第{id}个附件 {filename}')
# INSERT表示在光标位置插入
t1.insert('end', f'正在下载第{id}个附件 {filename}\n')
t1.update()
# filename = filename.encode("utf-8")
# 下载附件
data = part.get_payload(decode=True)
path_one = path + "/" + f'第{id}个附件 ' + filename
# 在指定目录下创建文件,注意二进制文件需要用wb模式打开
att_file = open(path_one, 'wb')
attachment_files.append(filename)
# 保存附件
att_file.write(data)
# print( f'第{id}个附件 {filename}')
att_file.close()
return attachment_files
# 退出程序
def exit_sys():
sys.exit()
if __name__ == '__main__':
fm_main = tk.Tk()
fm_main.title("邮件附件批量下载_v1.0")
fm_main.geometry('566x418')
fm_main.resizable(0, 0) # 设置窗口大小不可变
lb1 = tk.Label(fm_main, text="请输入邮件POP3服务器:").grid(row=0, column=0, sticky=tk.W)
# sticky=N + E + W,在水平、垂直方向上延伸,填满整个单元格
en1 = tk.Entry(fm_main, text='请输入POP3服务器地址')
en1.grid(row=0, column=1, sticky=tk.N + tk.E + tk.W)
lb2 = tk.Label(fm_main, text="请输入邮件地址:")
lb2.grid(row=1, column=0, sticky=tk.W)
en2 = tk.Entry(fm_main)
en2.grid(row=1, column=1, sticky=tk.N + tk.E + tk.W)
lb3 = tk.Label(fm_main, text="请输入身份认证密码:")
lb3.grid(row=2, column=0, sticky=tk.W)
en3 = tk.Entry(fm_main)
en3.grid(row=2, column=1, sticky=tk.N + tk.E + tk.W)
# columnspan=3,表示t1占用0,1二列
t1 = tk.Text(fm_main)
t1.grid(row=5, column=0, columnspan=2, sticky=tk.N + tk.E + tk.W)
b1 = tk.Button(fm_main, text='下载', command=download)
b1.grid(row=4, column=0, sticky=tk.N + tk.E + tk.W)
b2 = tk.Button(fm_main, text='退出', command=exit_sys)
b2.grid(row=4, column=1, sticky=tk.N + tk.E + tk.W)
en1.insert(0, 'pop.163.com')
en2.insert(0, '*********@163.com')
en3.insert(0, '************')
fm_main.mainloop()
程序效果如下:
标签:邮件附件,批量,get,filename,tk,path,main,fm,163 来源: https://www.cnblogs.com/lqsj2018/p/14328485.html