python接收邮件,读取邮件使用什么协议
最近由于工作需要,对参会的代表发给我的姓名、电话、公司、行程车次等信息进行统计处理形成联系单,我的思路是:可以计算机编程语言利用持久性有机污染物协议自动收取邮件,熊猫数量对发来的数据进行处理并导出至Excel/MySQL数据库。
收取邮件就是编写一个么么哒作为客户端,从单色显示适配卡(单色显示适配器)把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是持久性有机污染物协议,目前版本号是3,俗称POP3。
POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和简单邮件传输协议协议很像,SMTP发送的也是经过编码后的一大段文本。
要把POP3收取的文本变成可以阅读的邮件,还需要用电子邮件模块提供的各种类来解析原始文本,变成可阅读的邮件对象。
所以,用计算机编程语言的府绸模块收取邮件分两步:第一步是用POP3协议把邮件获取到本地,第二步是用电子邮件模块把原始邮件解析为消息对象,然后,用适当的形式把邮件内容展示给用户。
收取邮件
导入弹出式菜单
导入电子邮件
导入系统
从email.parser导入解析器
从email.header导入解码_标题
从email.utils导入parseaddr
定义解码字符串:
value,charset=decode _ header[0]
如果字符集:
值=值.解码(字符集)
返回值
def guess_charset(消息):
# 先从味精对象获取编码:
charset=msg.get_charset()
如果字符集为无:
# 如果获取不到,再从内容类型字段获取:
内容类型=消息。get( Content-Type , ).下部()
pos=内容类型。find( charset=)
如果pos=0:
charset=content_type[pos 8:]条状()
返回字符集
def get _ email _ headers(消息):
# 邮件的从,到,主题存在于根对象上:
标题={}
对于[发件人,收件人,主题,日期]中的标题:
value=msg.get(header,)
如果值:
if header==Date :
标题[日期]=值
if header==Subject :
# 需要解码科目字符串:
subject=decode_str(值)
标题[主题]=主题
否则:
# 需要解码电子邮件地址:
hdr,addr=parseaddr(value)
name=decode_str(hdr)
value=u%s %s %(名称,地址)
if header==From :
发件人地址=值
标题[发件人]=发件人地址
否则:
收件人地址=值
标题[收件人]=收件人地址
内容类型=消息。获取内容类型()
打印"标题内容类型:",内容类型
返回标题
#缩进用于缩进显示:
def get_email_cntent(消息,基本保存路径):
j=0
内容=
附件文件=[]
对于message.walk()中的部分:
j=j 1
文件名=零件。获取文件名()
内容类型=部分。获取内容类型()
# 保存附件
如果文件名:#附件
#解码文件名
h=电子邮件100 .头。标题(文件名)
dh=电子邮件. Header.decode_header(h)
文件名=dh[0][0]
如果dh[0][1]: #如果包含编码的格式,则按照该格式解码
文件名=unicode(文件名,dh[0][1])
文件名=文件名。编码(“utf-8”)
数据=零件。get _ payload(decode=True)
att_file=open(基本保存路径文件名, wb )
附件_文件。追加(文件名)
属性_文件。写入(数据)
att_file.close()
elif contentType==text/plain 或contentType==text/html :
# 保存正文
数据=零件。get _ payload(decode=True)
charset=guess_charset(部分)
如果字符集:
charset=charset.strip().拆分(;)[0]
打印"字符集:",字符集
data=data.decode(字符集)
内容=数据
返回内容,附件_文件
if __name__==__main__ :
# 输入邮件地址,口令和POP3服务器地址:
emailaddress=邮箱地址
# 注意使用开通POP,SMTP等的授权码
密码=密码
pop3_server=pop.163.com
# 连接到POP3服务器:
服务器=弹出式菜单pop 3(pop 3 _服务器)
# 可以打开或关闭调试信息:
# server.set_debuglevel(1)
# POP3服务器的欢迎文字:
print server.getwelcome()
# 身份认证:
服务器.用户(电子邮件地址)
server.pass_(密码)
# stat()返回邮件数量和占用空间:
messagesCount,messagesSize=server.stat()
打印"消息计数:",消息计数
打印"消息大小:",消息大小
#列表()返回所有邮件的编号:
resp,mails,octets=server.list()
打印- resp -
打印响应#好的46 964346响应的状态邮件数量邮件占用的空间大小
打印-邮件-
打印邮件#所有邮件的编号及大小的编号列表,[1 2211 , 2 29908 ,]
打印-八位字节-
打印八位字节
# 获取最新一封邮件,注意索引号从一开始:
长度=长度(邮件)
对于范围内的我(长度):
resp,lines,octets=server.retr(i 1)
# 获取最新一封邮件,注意索引号从一开始:
#length=len(邮件)
#对于范围内的我(长度):
对于范围内的我(消息计数,-1,-1):
resp,lines,octets=server.retr(i)
#resp,lines,octets=server。retr(消息计数)
行数存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
msg_content=\n .连接(线条)
# 把邮件内容解析为消息对象:
msg=Parser().语法分析字符串(消息内容)
# 但是这个消息对象本身可能是一个模拟多部分对象,即包含嵌套的其他模拟库对象,
# 嵌套可能还不止一层。所以我们要递归地打印出消息对象的层次结构:
打印解析之后-
base_save_path=/etc/cron.d/
消息标题=获取电子邮件标题(消息)
#print subject:,msg_headers[subject]
#print from_address:,msg_headers[from]
#print to_address:,msg_headers[to]
#print date:,msg_headers[date]
print argv[i],sys.argv[1]
if msg _ headers[ subject ]==sys。argv[1]:
内容,附件文件=获取电子邮件内容(消息,基本保存路径)
破裂
#打印内容:,内容
#打印附件文件: ,附件文件
#删除
# server.dele(1)
# 关闭连接:
server.quit()
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。