Python+POP3实现批量下载邮件附件
本文介绍利用Python和POP3协议实现批量下载邮箱附件的自动化脚本。针对助教统计作业场景,脚本可指定日期范围筛选邮件,自动解析并保存附件至指定目录。文中重点解决了Python 2与3版本间的编码差异问题,提供了完整的代码示例及注意事项,帮助开发者高效处理邮件数据处理任务。
新学期伊始,我承担了本科课程助教的职责。面对百余名学生一学期内提交的四五次作业,这些文件均通过邮件发送,需要逐一统计并打分。考虑到手动逐个登录邮箱下载附件的工作量巨大且繁琐,我决定编写一个自动化脚本来处理这些作业文件的统计工作。
Python库中提供了便捷的收发邮件模块,合理运用即可应对大多数邮件处理需求。然而,编写此脚本仍耗费了大量时间,主要难点在于Python的编码处理。Python 2与Python 3在编码预设上存在差异,且Python 3移除了unicode方法,导致许多基于Python 2编写的示例代码无法直接在Python 3环境中运行。
经过代码调整,该脚本能够从邮箱中检索指定日期范围内的邮件,并将其中的附件提取并保存至指定的本地目录。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import poplib
import email
import datetime
import time
import os
import xlrd
import xlwt
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
# 输入邮件地址, 口令和POP3服务器地址:
email = 'xxxxxxxx@qq.com'
password = 'xxxxxxxxxxx'
pop3_server = 'pop.qq.com'
def decode_str(s):#字符编码转换
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def get_att(msg):
import email
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]))#将附件名称可读化
print(filename)
#filename = filename.encode("utf-8")
data = part.get_payload(decode=True)#下载附件
att_file = open('E:\\L\\zy\\307\\' + filename, 'wb')#在指定目录下创建文件,注意二进制文件需要用wb模式打开
attachment_files.append(filename)
att_file.write(data)#保存附件
att_file.close()
return attachment_files
# 连接到POP3服务器,有些邮箱服务器需要ssl加密,对于不需要加密的服务器可以使用poplib.POP3()
server = poplib.POP3_SSL(pop3_server)
server.set_debuglevel(1)
# 打印POP3服务器的欢迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(email)
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):
#倒序遍历邮件
resp, lines, octets = server.retr(i)
# lines存储了邮件的原始文本的每一行,
#邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
#解析邮件:
msg = Parser().parsestr(msg_content)
#获取邮件时间
date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S') #格式化收件时间
date2 = time.strftime("%Y%m%d", date1)#邮件时间格式转换
if (date2<'20180306')|(date2>'20180314'):
continue
f_list = get_att(msg)#获取附件
#print_info(msg)
server.quit()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









