邮箱附件下载

在收到很多人发的邮件时,一个一个的接收附件比较麻烦,考虑使用python实现指定日期邮件附件的下载

首先需要开启邮箱的pop协议,一般在设置里,以QQ邮箱为例,设置后会给个密码,这个就是程序访问邮箱的登录密码

python接受邮件附件 python邮件附件下载_python接受邮件附件

需要改的东西有:

用户名
密码
文件储存路径
时间

"""
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!]')