python自动下载邮件附件
【摘要】 作者介绍:目前就职于电商数据分析师,日常工作以爬虫和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)