python+POP3 批量下载邮件附件

最近新开学,接到了给老板的本科课程当助教的工作,百十来号人一学期下来得有四五次作业发进邮箱里,需要我来统计打分,想想挨个点进去下载附件的过程就头大,于是萌生了写个脚本来统计作业的想法。

其实python里收发邮件都有很方便的包,合理使用就好,可以解决绝大多数的邮件收发任务。但是这个脚本写下来还是花了不少时间,其中最大的一部分时间是花在了python的编码问题上,python2和python3的编码预设有些许的不一样,在python3中又取消了unicode这个方法,这就导致很多在python2中写的例程都没法在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()

可以使用Python内置的poplib库来链接POP3服务器,通过该库可以获取邮件的各种信息,包括邮件附件。以下是一个简单的示例代码: ```python import poplib import email # 邮件服务器的地址和端口号 host = 'pop.163.com' port = 995 # 邮箱登录信息 username = 'your_email@163.com' password = 'your_password' # 连接服务器 server = poplib.POP3_SSL(host, port) server.user(username) server.pass_(password) # 获取邮件数量和大小 num, size = server.stat() # 获取最新一封邮件的内容 resp, lines, octets = server.retr(num) # 将邮件内容转换为Message对象 msg_content = b'\r\n'.join(lines).decode('utf-8') msg = email.message_from_string(msg_content) # 遍历邮件的所有附件 for part in msg.walk(): if part.get_content_type() == 'application/octet-stream': filename = part.get_filename() # 将附件保存到本地文件 with open(filename, 'wb') as f: f.write(part.get_payload(decode=True)) # 关闭连接 server.quit() ``` 在这个示例中,我们首先使用POP3_SSL连接到邮件服务器,并使用POP3的用户名和密码进行身份验证。然后,我们使用`server.stat()`方法获取邮件数量和大小,使用`server.retr()`方法获取最新一封邮件的内容。接下来,我们将邮件内容转换为Message对象,使用`msg.walk()`方法遍历邮件的所有部分,找到类型为`application/octet-stream`的附件,并将其保存到本地文件。最后,我们关闭连接并退出。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值