python 批量下载指定时间段的邮箱附件

爬虫相关 专栏收录该内容
2 篇文章 0 订阅

邮箱附件下载

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

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

需要改的东西有:

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

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

  • 3
    点赞
  • 2
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

沈帅杰

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值