邮箱附件下载
在收到很多人发的邮件时,一个一个的接收附件比较麻烦,考虑使用python实现指定日期邮件附件的下载
首先需要开启邮箱的pop协议,一般在设置里,以QQ邮箱为例,设置后会给个密码,这个就是程序访问邮箱的登录密码
需要改的东西有:
用户名
密码
文件储存路径
时间
"""
author: Shuai-jie Shen 沈帅杰
CSDN:
公众号: AgBioIT
"""
import email
import os
import poplib
import time
from email.header import decode_header
from email.parser import Parser
def decode_str(s):
"""
字符编码转换
"""
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
host = "pop.qq.com" # 邮箱域名,其他邮箱类似
server = poplib.POP3(host) # 建立链接
username = "111111@qq.com" # 用户名
password = "aaaaaaaaaaaaaaaa" # 密码IMAP/SMTP的密码
start_date = '20210429'
end_date = '20210505'
# 设置储存路径
mail_att_dir = r'C:\Users\Administrator\Desktop\att_file'
# 登录
server.user(username)
server.pass_(password)
resp, mails, octets = server.list() # 获取所有邮件编号,mails的格式为['mesg_num octets', ...]
# 倒序遍历邮件
index = len(mails)
for i in range(index, 0, -1):
# lines存储了邮件的原始文本的每一行
resp, lines, octets = server.retr(i)
# 邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 解析邮件:
msg = Parser().parsestr(msg_content)
# 获取邮件日期
date = time.strptime(msg.get('Date')[:24], '%a, %d %b %Y %H:%M:%S')
date = time.strftime('%Y%m%d', date)
# 只下载发送日期在2021年4月29日到5月5日之间的邮件附件
if date < start_date :
break
if date > end_date :
continue
# 下载附件
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])) # 将附件名称可读化
data = part.get_payload(decode=True) # 下载附件
# 创建附件存储文件夹
if not os.path.isdir(mail_att_dir ):
os.mkdir(mail_att_dir )
# 在指定目录下创建文件,注意二进制文件需要用wb模式打开
att_file = open(mail_att_dir + os.sep + filename, 'wb')
attachment_files.append(filename)
att_file.write(data) # 保存附件
att_file.close()
server.quit()
print('下载完成,去文件夹看看吧!')
邮件下载2.0
新增功能,将不同的文件放到相应的文件夹中,下载时打印读取邮件的标题,遇到不可读取的邮件直接跳过。
import email
import os
import poplib
import time
from email.header import decode_header
from email.parser import Parser
def decode_str(s):
"""
字符编码转换
"""
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
host = "pop.qq.com" # 邮箱域名,其他邮箱类似
server = poplib.POP3(host) # 建立链接
username = "111111@qq.com" # 用户名
password = "aaaaaaaaaaaaaaaa" # 密码IMAP/SMTP的密码
start_date = '20210429'
end_date = '20210505'
# 设置储存路径
mail_att_dir = r'C:\Users\Administrator\Desktop\att_file'
mail_pdf_dir = os.path.join(mail_att_dir, end_date+'pdf_file')
mail_word_dir = os.path.join(mail_att_dir, end_date+'word_file')
# 登录
server.user(username)
server.pass_(password)
resp, mails, octets = server.list() # 获取所有邮件编号,mails的格式为['mesg_num octets', ...]
# 倒序遍历邮件
index = len(mails)
for i in range(index, 0, -1):
# lines存储了邮件的原始文本的每一行
resp, lines, octets = server.retr(i)
# 邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 解析邮件:
msg = Parser().parsestr(msg_content)
try:
# 获取邮件日期
date = time.strptime(msg.get('Date')[:24], '%a, %d %b %Y %H:%M:%S')
date = time.strftime('%Y%m%d', date)
if date < start_date:
break
if date > end_date:
continue
# 下载附件
print('正在读取 ' + decode_str(msg.get('Subject')))
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])) # 将附件名称可读化
data = part.get_payload(decode=True) # 下载附件
# 创建附件存储文件夹
if os.path.splitext(filename)[-1] == '.docx' or os.path.splitext(filename)[-1] == '.doc':
if not os.path.isdir(mail_word_dir):
os.mkdir(mail_word_dir)
# 在指定目录下创建文件,注意二进制文件需要用wb模式打开
att_file = open(mail_word_dir + os.sep + filename, 'wb')
attachment_files.append(filename)
att_file.write(data) # 保存附件
att_file.close()
else:
if not os.path.isdir(mail_pdf_dir):
os.mkdir(mail_pdf_dir)
# 在指定目录下创建文件,注意二进制文件需要用wb模式打开
att_file = open(mail_pdf_dir + os.sep + filename, 'wb')
attachment_files.append(filename)
att_file.write(data) # 保存附件
att_file.close()
except:
continue
server.quit()
print('嘿!! 下载好了呦!!<( ̄︶ ̄)↗[GO!]')