python自动下载邮件附件

举报
诡途 发表于 2021/11/24 10:48:57 2021/11/24
【摘要】 作者介绍:目前就职于电商数据分析师,日常工作以爬虫和DBA数据库管理为主,业务场景模型搭建为辅!自16年至今一直从事数据相关工作,从最初的表哥到现在的大数据、数据挖掘、机器学习,一直不断成长!日常活跃于CSDNSlogan: 科技成就商业未来,数据看透问题本质CSDN:https://blog.csdn.net/qq_35866846微信公众号:诡途 一、项目背景继上一次的 群聊机器人开发 ...

作者介绍:目前就职于电商数据分析师,日常工作以爬虫和DBA数据库管理为主,业务场景模型搭建为辅!自16年至今一直从事数据相关工作,从最初的表哥到现在的大数据、数据挖掘、机器学习,一直不断成长!日常活跃于CSDN

Slogan: 科技成就商业未来,数据看透问题本质
CSDN:https://blog.csdn.net/qq_35866846
微信公众号:诡途

在这里插入图片描述

一、项目背景

继上一次的 群聊机器人开发 之后的工作流程再优化,上次研究完群聊机器人之后,开发了三个机器人替我处理表格并自动发出去。其中有一项工作的数据源来源于邮件,还需要我自己手动下载,放入指定位置才可以处理!虽然比之前方便了很多,但是还是想更方便些。(自己淘汰自己的路上越走越远o(╥﹏╥)o),于是想着能不能用代码下载,研究了半天还终于整出来了,而且还是两种方法!

二、有授权码的场景

准备工作,QQ邮箱开通授权码流程在这里插入图片描述

# 导入库——qq邮箱测试,其他邮箱略有差异
import poplib,email,datetime,time,traceback,sys,telnetlib,zipfile,os,shutil
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
​
# 输入邮件地址, 口令和POP3服务器地址:
email_user='xxxxxx@qq.com'
# 此处密码是授权码,用于登录第三方邮件客户端
password='你自己的授权码'
pop3_server='pop.qq.com'# 授权码登录邮箱
def email_login(email_user,password,pop3_server):
    # 连接到POP3服务器,有些邮箱服务器需要ssl加密,可以使用poplib.POP3_SSL
    telnetlib.Telnet('pop.qq.com',995)
    server=poplib.POP3_SSL(pop3_server,995,timeout=10)
#     server=poplib.POP3(pop3_server,110,timeout=10)
    # 可以打开或关闭调试信息
#     server.set_debuglevel(1)# 身份认证:
    server.user(email_user)
    server.pass_(password)
    
    # 返回邮件数量和占用空间:
    print('Messages: %s. Size: %s'%server.stat())
    
    # list()返回所有邮件的编号:
    resp,mails,octets = server.list()
    
    return mails,server
    
 def decode_str(str_in):
    """字符编码转换"""
    value, charset = decode_header(str_in)[0]
    if charset:
        value = value.decode(charset)
    return value
   
 def save_att_file(save_path):
    """附件下载函数"""
    for part in msg.walk():
        file_name = part.get_filename()
    #     contentType = part.get_content_type()
        attachment_files =[]
        if file_name:
            file_name = decode_str(file_name)
            data =  part.get_payload(decode=True)
            att_file = open(os.path.join(save_path,file_name), 'wb')
            attachment_files.append(file_name)
            att_file.write(data)
            att_file.close()
            print(f"附件 {file_name} 下载完成")def main(yesterday):
    # 遍历所有邮件
    for i in range(1,len(mails)+1):
        resp,lines,octets = server.retr(i)
        msg_content=b'\r\n'.join(lines).decode()# 解析邮件:
        msg = Parser().parsestr(msg_content)
        From = parseaddr(msg.get('from'))[1]#发件人
        To = parseaddr(msg.get('To'))[1]#收件人
        Cc = parseaddr(msg.get_all('Cc'))[1]#抄送人
        Subject = decode_str(parseaddr(msg.get('Subject'))[1])#主题# 获取邮件时间,格式化收件时间
        date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S')
        # 邮件时间格式转换
        date2 = time.strftime("%Y-%m-%d",date1)print(f'发件人:{From};收件人:{To};抄送人:{Cc};主题:{Subject};收件日期:{date2}')# 主题和日期验证所需邮件
        if ("TM在售" in Subject)&(date2 == yesterday):
            save_att_file(save_path)
      
# 今天日期
today = datetime.date.today()
# 昨天日期
yesterday = (today - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
save_path = os.getcwd()# 登录获取邮件列表
mails,server = email_login(email_user,password,pop3_server)

# 下载主程序
main(yesterday)

三、无授权码的场景

鉴于企业邮箱没有给开授权码权限,以及业务流程限制不允许使用私人邮箱,又研究了下直接使用win32com直接驱动outlook客户端

注:使用前提,本机配置好了outlook,即至少登录过一次,因为我只配置了一个邮箱账户,没有测试多账户情况

# 导入库
import win32com.client
import os
​
def download_email_att(yesterday):
    # 创建outlook客户端链接
    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")# "6" 是指文件夹的索引,在本例中,表示收件箱。可以把那个号码改成参考号
    inbox = outlook.GetDefaultFolder(6)# 获取收件箱列表
    messages = inbox.Items
    # # 获取当前最新邮件
    # message = messages.GetFirst()
    # # 获取邮件主题
    # subject = message.Subject
    # # 获取邮件正文
    # body = message.Body# 倒序读取最新30封邮件 ——因为邮件过多,完全遍历耗时过久
    for i in range(len(messages),len(messages)-30,-1):
        message = messages(i)
        subject = message.Subject
        date = message.senton.date()
    #     print(subject,date)
        if ("TM在售" in subject)&(str(date) == yesterday):
    #         print(subject,date)
            # 获取附件信息
            attachments = message.Attachments
            num_attach = len([x for x in attachments])
            for x in range(1, num_attach + 1):
                attachment = attachments.Item(x)
                # 保存附件到save_path下
                attachment.SaveASFile(os.path.join(save_path, attachment.FileName))
                print(f"附件 {attachment}下载完成")
            break  # 找到指定邮件打断循环# 今天日期
today = datetime.date.today()
# 昨天日期
yesterday = (today - datetime.timedelta(days=1)).strftime('%Y-%m-%d')            
# 附件保存路径
save_path = os.getcwd()
download_email_att(yesterday)

科技成就商业未来,数据看透问题本质!
我是诡途,感谢阅读,欢迎转发分享点赞!
文章仅供学习交流,转载请注明来源!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。