python下载邮件,python实现自动发邮件
本文主要详细介绍如何使用Python语言实现邮件自动下载和附件分析。文中的样例代码解释的很详细,感兴趣的朋友可以看看。
在我们开始编码之前,让我们看一下三个邮件服务协议:
1.SMTP协议
SMTP(简单邮件传输协议),即简单邮件传输协议。它相当于一个中继站,向客户端发送邮件。
2.POP3协议
POP3(邮局协议3)是邮局协议的第三个版本,是电子邮件的第一个离线协议标准。此协议将邮件下载到与服务器不同步的本地计算机。缺点是更容易丢失邮件或者多次下载同一个邮件。
3.IMAP协议
Imap(互联网邮件访问协议)是交互式邮件访问协议。此协议连接远程邮箱以直接操作,并与服务器内容同步。
然后介绍邮件包。
这个包的中心组件是代表电子邮件的“对象模型”。应用程序主要通过消息子模块中定义的对象模型接口与这个包进行交互。应用程序可以使用这个API来询问有关现有电子邮件的问题,构造新的电子邮件,或者添加或删除使用相同对象模型接口的电子邮件子组件。也就是说,根据电子邮件及其MIME子组件的性质,电子邮件对象模型是由提供EmailMessage API的所有对象组成的树形结构。
接下来我们实现一个登录邮件客户端,下载邮件,通过特定代码分析邮件附件内容的功能。
首先,我们需要定义一个邮件解析类,它需要三个变量:
1.邮箱所属的imap服务地址;
2.电子邮件账号;
3.电子邮件密码[注意:不同的电子邮件需要不同的安全策略,例如,qq电子邮件需要短信验证以获得登录授权码,而不是明文密码来登录远程客户端]
类Email_parse:
def __init__(自身,远程服务器url,电子邮件url,密码):
# imap服务地址
self . remote _ server _ URL=remote _ server _ URL
#电子邮件账号
self.email_url=email_url
#邮箱密码
self.password=密码
然后在类中定义入口函数,远程登录,默认获取第一页的所有邮件。我们得到邮件的主题并打印出来[不同邮件主题的编码可能不同,二进制需要转码才能正确显示]
def main_parse_Email(self):
入口功能,登录到imap服务
server=imaplib。IMAP 4 _ SSL(self . remote _ server _ URL,993)
server.login(self.email_url,self.password)
server.select(收件箱)
status,data=server.search(无,全部)
如果状态!=好的 :
引发异常(“读取电子邮件错误”)
emailids=data[0]。拆分()
mail_counts=len(emailids)
打印( count: ,mail_counts)
#邮件的遍历在时间上是从后向前的。在这里,我们选择最新的电子邮件。
对于(邮件计数- 1,邮件计数- 2,-1):范围内的I
status,edata=server.fetch(emailids[i],(RFC822))
msg=email . message _ from _ bytes(edata[0][1])
#获取邮件主题标题
subject=email . header . decode _ header(msg . get( subject ))
if type(subject[-1][0])==bytes :
title=subject[-1][0]。decode(字符串(主题[-1][1]))
elif类型(主题[-1][0])==str:
标题=主题[-1][0]
print("title:", title)
其中,msg变量保存的就是邮件的主体,接下来因为会重复用到msg和tilte,我们将构造一个类函数返回msg和title。
def get_email_title(msg):subject = email.header.decode_header(msg.get(subject))
if type(subject[-1][0]) == bytes:
title = subject[-1][0].decode(str(subject[-1][1]))
elif type(subject[-1][0]) == str:
title = subject[-1][0]
print("title:", title)
return title
解析邮件,我们分为两部分,邮件正文【HTML】和附件【xlsx等】,判断有附件,我们就保存到固定的路径下。表格的解析不再赘述了,pandas之类的包足以搞定。
def get_att(msg):"""获取附件并下载"""
filename = Email_parse.get_email_name(msg)
for part in msg.walk():
file_name = part.get_param("name")
if file_name:
data = part.get_payload(decode=True)
if data != None:
att_file = open(./src/ + filename, wb)
att_file.write(data)
att_file.close()
else:
pass
邮件正文内容,我们直接解析html,将文本内容直接保存到.txt文件中,方便读取。
def get_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))
for part in msg.walk():
if not part.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()
return result
完整代码如下:
import emailimport imaplib
from email.header import decode_header
import pandas as pd
import datetime
class Email_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
def get_att(msg):
filename = Email_parse.get_email_name(msg)
for part in msg.walk():
file_name = part.get_param("name")
if file_name:
data = part.get_payload(decode=True)
if data != None:
att_file = open(./src/ + filename, wb)
att_file.write(data)
att_file.close()
else:
pass
def get_email_title(msg):
subject = email.header.decode_header(msg.get(subject))
if type(subject[-1][0]) == bytes:
title = subject[-1][0].decode(str(subject[-1][1]))
elif type(subject[-1][0]) == str:
title = subject[-1][0]
print("title:", title)
return title
def get_email_name(msg):
for part in msg.walk():
file_name = part.get_param("name")
if file_name:
h = email.header.Header(file_name)
dh = email.header.decode_header(h)
filename = dh[0][0]
if dh[0][1]:
value, charset = decode_header(str(filename, dh[0][1]))[0]
if charset:
filename = value.decode(charset)
print("附件名称:", filename)
return filename
def main_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")
if status != OK:
raise Exception(read email error)
emailids = data[0].split()
mail_counts = len(emailids)
print("count:",mail_counts)
for i in range(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))
if type(subject[-1][0]) == bytes:
title = subject[-1][0].decode(str(subject[-1][1]))
elif type(subject[-1][0]) == str:
title = subject[-1][0]
print("title:", title)
Email_parse.get_att(msg)
Email_parse.get_text_from_HTML(msg)
def get_text_from_HTML(msg):
filename = Email_parse.get_email_name(msg)
current_title = Email_parse.get_email_title(msg)
print("filename:",filename,type(filename))
for part in msg.walk():
if not part.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()
return result
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邮件自动下载的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。