pop3协议用来____邮件,pop3协议用于发送邮件
让我们再次回顾一封邮件的旅程:
发件人-MUA-MTA-MTA-几个MTA-MDA-MUA-收件人我们知道SMTP可以用来发送邮件想收邮件怎么办?邮件收集就是写一个MUA作为客户端,把MDA的邮件拿到用户的电脑或者手机上邮件收集最常用的协议是POP协议目前的版本号是3,俗称POP3Python内置了poplib模块,实现了POP3协议,可以直接用来接收邮件
需要注意的是,POP3协议收集的是邮件的原文,而不是已经可读的邮件,这和SMTP协议非常相似,SMTP发送的是一大段编码文本要将POP3接收的文本转换成可读的电子邮件,还需要使用email模块提供的各种类来解析原始文本,并将其转换成可读的email对象
因此,收集邮件有两个步骤:
第一步:用poplib将邮件原文下载到本地;
第2部分:通过邮件分析原文,还原到邮件对象
首先,通过POP3下载邮件,获取最新的邮件内容代码如下:
# -*-编码:utf-8 -*-#从email . parser import parser import pop lib #输入电子邮件地址、密码和POP3服务器地址email=input( email:)Password=input( Password:)POP3 _ server=input( pop 3 server:)#连接到pop 3服务器server=pop lib . pop 3(pop 3 _ server)#可以打开或关闭调试信息服务器. set_debuglevel(1)#可选:打印欢迎文本print (server.getwelcome()decode( UTF-8 )# authentic ation server . user(email)server . pass _(password)# stat()返回消息数和占用空间print( messages:% s . size:% s % server . stat())# list()返回所有消息数resp,mail,octets=server.list () #可以查看返回的列表类似于[b1 1111 ,b2 2222 ,]print(mails)#要获取最新邮件,注意索引号从1开始index=len (mails) resp,lines,octets=server.retr (index) #要获取所有邮件,只需回收retr()即可获取每封邮件的内容#lines存储每一行原始邮件文本#即可获取原始邮件文本msg_content=b\r\ N 连接(线条)Decode (UTF-8) #解析邮件msg=parser()parsetr(msg _ content)#可以根据邮件索引号直接从服务器上删除邮件#server.dele(index)#关闭与server.quit()的连接用POP3获取邮件其实挺简单的要获取所有邮件,真正的麻烦是将邮件的原始内容解析成可读的e mail对象
第二,解析邮件的过程和构造邮件正好相反
#解析邮件 (此处为网易邮箱,将QQ邮箱对应关系改为对应信息)的控制台参数:Email:xxx@163.com/xxx@qq.com密码:163邮箱授权码/qq邮箱授权码POP3服务器:pop.163.com/pop . QQ . com from Email . parser导入parser from email.header导入decode _ header from email.utils导入parseaddrimport poplib #输入邮箱地址、密码和POP3服务器地址Email=input( Email:)Password=input( Password:)pop 3 _ server=input( pop 3服务器:)#主题要正常显示,必须返回decode def decode _ str (s)上的列表:value,charset=decode _ header(s)[0]# decode _ header()因为Cc和Bcc等字段可能包含多个电子邮件地址,所以会解析出多个元素我们偷了个懒,只取了第一个元素如果charset:value=value . decode(charset)返回值#文本邮件的内容也是str,需要检测编码,否则非UTF-8编码的消息无法显示def guess _ charset(msg):charset=msg . get _ charset()如果charset为none:content _ type=msg . get( content-type ,)lower()pos=content _ type . find( charset=)if pos=0:charset=content _ type[pos 8:]strip () returncharset #消息内容被解析为Message对象,但这个Message对象本身可能是一个MIMEMultipart对象,即包含嵌套的其他MIMEBase对象,嵌套可能不止这些
# 所以我们要递归地打印出消息对象的层次结构def print_info(msg,indent=0):if indent==0:for header in[ From , To , Subject]: value=msg.get(header, )if value:if header== Subject :value=decode _ str(value)else:HDR,addr=parse addr(value)name=decode _ str(HDR)value=u % s % s %(name,addr)print( % s % s:% s %( * indent,header,value))if(msg .is _ multipart()):parts=msg indent 1)else:content _ type=msgget _ content _ type()if content _ type== text/plain 或 content _ type== text/html :content=msgget _ payload(decode=True)charset=guess _ charset(msg)if charset:content=contentdecode(charset)print( % sText:% s %( * indent,content . )))else:print( % sat attachment:% s %( * indent,content_type))#连接到POP3服务器服务器=弹出式菜单POP3(pop3_server)#网易#服务器=弹出式菜单POP3_SSL(pop3_server,port=995)#因为即时通信软件邮箱pop3得使用加密套接字协议层安全连接才可以登录,不然就会报错#可以打开或关闭调试信息server.set_debuglevel(1)#可选:打印POP3服务器的欢迎文字print(server.getwelcome().解码( utf-8 )#身份认证服务器用户(电子邮件)服务器pass _(密码)# stat()返回邮件数量和占用空间打印(邮件:% s,大小:% s %服务器stat())# list()返回所有邮件编号resp,mails,octets=server.list()#可以查看返回的列表类似[b1 1111 ,b2 2222 ,]打印(邮件)#获取最新一封邮件,注意索引号从一开始索引=长度(邮件)resp,lines,octets=server.retr(index)#要获取所有邮件,只需要循环使用retr()把每一封邮件内容拿到即可行数存储了邮件原始文本的每一行#可以获取整个邮件原始文本msg_content=b\r\n .连接(线条)解码( utf-8)#解析邮件,把邮件内容解析为消息对象msg=Parser().parsetr(消息内容)#可以根据邮件索引号直接从服务器删除邮件#server.dele(index)#关闭连接server.quit()#注:QQ邮箱需要改动#服务器=弹出式菜单POP3_SSL(pop3_server,port=995)#因为即时通信软件邮箱pop3得使用加密套接字协议层安全连接才可以登录,不然就会报错接下来我们就可以试试收取一封邮件先往自己的邮箱发一封邮件,然后用浏览器登录邮箱,看看邮件收到没,如果收到了,我们就来用计算机编程语言程序把它收到本地:
e:\ python workspace \ ven v1 \ Scripts \ pythonexe E:/python工作空间/python学习/day 2/receive _ emailpye邮箱:XXX @ 163指南针单词:xxxxx
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。