简单实现Python实现邮件自动下载(python自动下载邮箱附件)

admin1482056年前0条评论

本篇文章给人人带来了对于于Python的相干知识,细致介绍了怎样应用Python语言实现邮件主动下载以及附件剖析性能,文中的示例代码解说细致,感下面一起来看一下,希望对于人人有帮助。

轻易介绍Python实现邮件主动下载的示例

最先码代码以前,咱们先来了解一下三种邮件效劳协定:

一、SMTP协定

SMTP(SimpleMailTransferProtocol),即轻易邮件传输协定。相当于中转站,将邮件发送到客户端。

二、POP3协定

POP3(PostOfficeProtocol3),即邮局协定的第3个版本,是电子邮件的第一个离线协定规范。该协定把邮件下载到内陆盘算机,不与效劳器同步,缺点是更易丢失邮件或者屡次下载相同的邮件。

三、IMAP协定

IMAP(InternetMailAccessProtocol),即交互式邮件存取协定。该协定连接短途邮箱间接操纵,与效劳器内容同步。

而后介绍一下email包

这个包的核心组件是代表电子邮件音讯的“工具模子”。应用程序主要通过在message子模块中界说的工具模子接口与这个包停止交互。应用程序能够应用此API来询问无关现有电子邮件的问题、构造新的电子邮件,或者增添或者移除了自身也应用相拥护象模子接口的电子邮件子组件。也便是说,遵循电子邮件音讯及其MIME子组件的性子,电子邮件工具模子是所有供应EmailMessageAPI的工具所形成的树状构造。

接下来咱们通细致致的代码实现一个登录邮箱客户端,下载邮件,剖析邮件附件内容的性能。

首先咱们需要界说一个邮件剖析的类,该类需要三个变量:

一、邮箱所属的imap效劳所在;

二、邮箱账号;

三、邮箱明码【注:分比方邮箱需要分比方的平安策略,比方qq邮箱需要短信考证,获取登录授权码,而不是明野蛮码去登录短途客户端】

classEmail_parse:

def__init__(self,remote_server_url,email_url,password):
#imap效劳所在
self.remote_server_url=remote_server_url
#邮箱账号
self.email_url=email_url
#邮箱明码
self.password=password
而后界说类中进口函数,登录短途,默认获取第一页所有的邮件。咱们获取邮件的主题,并打印进去【分比方邮件主题的编码能够分比方,二进制需要转码能力准确显示】

defmain_parse_Email(self):
"""进口函数,登录imap效劳"""
server=imaplib.IMAP4_SSL(self.remote_server_url,993)
server.login(self.email_url,self.password)
server.select('INBOX')
status,data=server.search(None,"ALL")
ifstatus!='OK':
raiseException('reademailerror')
emailids=data[0].split()
mail_counts=len(emailids)
print("count:",mail_counts)
#邮件的遍历是按时日从后往前,这里咱们抉择最新的一封邮件
foriinrange(mail_counts-1,mail_counts-2,-1):
status,edata=server.fetch(emailids[i],'(RFC822)')
msg=email.message_from_bytes(edata[0][1])
#获取邮件主题title
subject=email.header.decode_header(msg.get('subject'))
iftype(subject[-1][0])==bytes:
title=subject[-1][0].decode(str(subject[-1][1]))
eliftype(subject[-1][0])==str:
title=subject[-1][0]
print("title:",title)
其中,msg变量生存的便是邮件的主体,接下来因为会重复用到msg以及tilte,咱们将构造一个类函数返回msg以及title。

defget_email_title(msg):
subject=email.header.decode_header(msg.get('subject'))
iftype(subject[-1][0])==bytes:
title=subject[-1][0].decode(str(subject[-1][1]))
eliftype(subject[-1][0])==str:
title=subject[-1][0]
print("title:",title)
returntitle
剖析邮件,咱们分为两整体,邮件注释【HTML】以及附件【xlsx等】,坚定有附件,咱们就生存到流动的门路下。表格的剖析再也不赘述了,pandas之类的包足以搞定。

defget_att(msg):
"""获取附件并下载"""
filename=Email_parse.get_email_name(msg)
forpartinmsg.walk():
file_name=part.get_param("name")
iffile_name:
data=part.get_payload(decode=True)
ifdata!=None:
att_file=open('./src/'+filename,'wb')
att_file.write(data)
att_file.close()
else:
pass
邮件注释内容,咱们间接剖析html,将文本内容间接生存到.txt文件中,不便读取。

defget_text_from_HTML(msg):
"""获取邮件中的html"""
filename=Email_parse.get_email_name(msg)
current_title=Email_parse.get_email_title(msg)
print("filename:",filename,type(filename))
forpartinmsg.walk():
ifnotpart.is_multipart():
result=part.get_payload(decode=True)
result=result.decode('gbk')
f=open(f'./src/{current_title}.txt','w')
f.write(result)
f.close()
returnresult
完好代码下列:

importemail
importimaplib
fromemail.headerimportdecode_header
importpandasaspd
importdatetime

classEmail_parse:
def__init__(self,remote_server_url,email_url,password):
self.remote_server_url=remote_server_url
self.email_url=email_url
self.password=password

defget_att(msg):
filename=Email_parse.get_email_name(msg)
forpartinmsg.walk():
file_name=part.get_param("name")
iffile_name:
data=part.get_payload(decode=True)
ifdata!=None:
att_file=open('./src/'+filename,'wb')
att_file.write(data)
att_file.close()
else:
pass

defget_email_title(msg):
subject=email.header.decode_header(msg.get('subject'))
iftype(subject[-1][0])==bytes:
title=subject[-1][0].decode(str(subject[-1][1]))
eliftype(subject[-1][0])==str:
title=subject[-1][0]
print("title:",title)
returntitle

defget_email_name(msg):
forpartinmsg.walk():
file_name=part.get_param("name")
iffile_name:
h=email.header.Header(file_name)
dh=email.header.decode_header(h)
filename=dh[0][0]
ifdh[0][1]:
value,charset=decode_header(str(filename,dh[0][1]))[0]
ifcharset:
filename=value.decode(charset)
print("附件名称:",filename)
returnfilename

defmain_parse_Email(self):
server=imaplib.IMAP4_SSL(self.remote_server_url,993)
server.login(self.email_url,self.password)
server.select('INBOX')
status,data=server.search(None,"ALL")
ifstatus!='OK':
raiseException('reademailerror')
emailids=data[0].split()
mail_counts=len(emailids)
print("count:",mail_counts)
foriinrange(mail_counts-1,mail_counts-2,-1):
status,edata=server.fetch(emailids[i],'(RFC822)')
msg=email.message_from_bytes(edata[0][1])
subject=email.header.decode_header(msg.get('subject'))
iftype(subject[-1][0])==bytes:
title=subject[-1][0].decode(str(subject[-1][1]))
eliftype(subject[-1][0])==str:
title=subject[-1][0]
print("title:",title)
Email_parse.get_att(msg)
Email_parse.get_text_from_HTML(msg)

defget_text_from_HTML(msg):
filename=Email_parse.get_email_name(msg)
current_title=Email_parse.get_email_title(msg)
print("filename:",filename,type(filename))
forpartinmsg.walk():
ifnotpart.is_multipart():
result=part.get_payload(decode=True)
result=result.decode('gbk')
f=open(f'./src/{current_title}.txt','w')
f.write(result)
f.close()
returnresult

if__name__=="__main__":
remote_server_url='imap.qq.com'
email_url="*********@qq.com"
password="**********"
demo=Email_parse(remote_server_url,email_url,password)
demo.main_parse_Email()
运行效果:

轻易介绍Python实现邮件主动下载的示例

轻易介绍Python实现邮件主动下载的示例

你可能想看:

本文链接:https://addon.ciliseo.com/jian-dan-shi-xian-python-shi-xian-you-jian-zi-dong-xia-zai.html

网友评论

扫一扫二维码添加客服微信

关于我们建站招商建站服务