python P4D学习笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

python模块之poplib:用pop3收取邮件python的poplib模块是用来从pop3收取邮件的,也可以说它是处理邮件的第一步。POP3协议并不复杂,它也是采用的一问一答式的方式,你向服务器发送一个命令,服务器必然会回复一个信息。pop3命令码如下:命令poplib方法参数状态描述-----------------------------------------------------------------------------------------------USERuserusername认可用户名,此命令与下面的pass命令若成功,将导致状态转换PASSpass_password认可用户密码APOPapopName,Digest认可Digest是MD5消息摘要-----------------------------------------------------------------------------------------------STATstatNone处理请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数UIDLuidl[Msg#]处理返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的LISTlist[Msg#]处理返回邮件数量和每个邮件的大小RETRretr[Msg#]处理返回由参数标识的邮件的全部文本DELEdele[Msg#]处理服务器将由参数标识的邮件标记为删除,由quit命令执行RSETrsetNone处理服务器将重置所有标记为删除的邮件,用于撤消DELE命令TOPtop[Msg#]处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数NOOPnoopNone处理服务器返回一个肯定的响应----------------------------------------------------------------------------------------------QUITquitNone更新python的poplib也针对这些命令分别提供了对应的方法,上面在第二列里已经标出来。收取邮件的过程一般是:1.连接pop3服务器(poplib.POP3.__init__)2.发送用户名和密码进行验证(poplib.POP3.userpoplib.POP3.pass_)3.获取邮箱中信件信息(poplib.POP3.stat)4.收取邮件(poplib.POP3.retr)5.删除邮件(poplib.POP3.dele)6.退出(poplib.POP3.quit)注意的是,上面我在括号里写的是使用什么方法来完成这个操作,在实际的代码中不能那样写,应该是创建poplib.POP3的对象,然后,调用这个对象的方法。比如:poplib.POP3.quit应该理解为a=poplib.POP3(host)a.quit()下面看看实际的代码:#-*-encoding:gb2312-*-importos,sys,stringimportpoplib#pop3服务器地址host=pop3.163.com#用户名username=xxxxxx@163.com#密码password=xxxxxxx#创建一个pop3对象,这个时候实际上已经连接上服务器了pp=poplib.POP3(host)#设置调试模式,可以看到与服务器的交互信息pp.set_debuglevel(1)#向服务器发送用户名pp.user(username)#向服务器发送密码pp.pass_(password)#获取服务器上信件信息,返回是一个列表,第一项是一共有多上封邮件,第二项是共有多少字节ret=pp.stat()printret#需要取出所有信件的头部,信件id是从1开始的。foriinrange(1,ret[0]+1):#取出信件头部。注意:top指定的行数是以信件头为基数的,也就是说当取0行,#其实是返回头部信息,取1行其实是返回头部信息之外再多1行。mlist=pp.top(i,0)print'line:',len(mlist[1])#列出服务器上邮件信息,这个会对每一封邮件都输出id和大小。不象stat输出的是总的统计信息ret=pp.list()printret#取第一封邮件完整信息,在返回值里,是按行存储在down[1]的列表里的。down[0]是返回的状态信息down=pp.retr(1)print'lines:',len(down)#输出邮件forlineindown[1]:printline#退出pp.quit()在有些地方,有安全邮件这一说,其实是对pop3做了ssl加密。这样的,poplib一样可以处理,只不过不是用POP3这个类,而是用POP3_SSL,他们的方法都一样。因此支持ssl在上面代码中,替换创建pop3对象的一行为:pp=poplib.POP3_SSL(host)python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用。处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件:Received:from192.168.208.56(192.168.208.56[192.168.208.56])byajax-webmail-wmsvr37(Coremail);Thu,12Apr200712:07:48+0800(CST)Date:Thu,12Apr200712:07:48+0800(CST)From:user1xxxxxxxx@163.comTo:zhaoweizhaoweikid@163.comMessage-ID:31571419.200911176350868321.JavaMail.root@bj163app37.163.comSubject:=?gbk?B?u+nJtA==?=MIME-Version:1.0Content-Type:multipart/Alternative;boundary=----=_Part_21696_28113972.1176350868319------=_Part_21696_28113972.1176350868319Content-Type:text/plain;charset=gbkContent-Transfer-Encoding:base64ztLS0b+qyrzS1M6qysfSu7j20MfG2ru70ru0zqOs1K3AtMrH0ru49tTCtffSu7TOztLDx8/W1NrTprjDysew67XjssXE3MjI1ebC6bezICAg------=_Part_21696_28113972.1176350868319Content-Type:text/html;charset=gbkContent-Transfer-Encoding:quoted-printableDIV=CE=D2=D2=D1=BF=AA=CA=BC=D2=D4=CE=AA=CA=C7=D2=BB=B8=F6=D0=C7=C6=DA=BB==BB=D2=BB=B4=CE=A3=AC=D4=AD=C0=B4=CA=C7=D2=BB=B8=F6=D4=C2=B5=F7=D2=BB=B4=CE=/DIVDIV=CE=D2=C3=C7=CF=D6=D4=DA=D3=A6=B8=C3=CA=C7=B0=EB=B5=E3=B2=C5=C4=DC=C8==C8/DIVDIV=D5=E6=C2=E9=B7=B3/DIV------=_Part_21696_28113972.1176350868319--上面的就是以封邮件的源文件,从第一行到第一个空行之间的为信件头,后面的就是信件体了。把上面的信息复制下来存到一个叫xxx.eml的文件里,用鼠标双击就可以看到内容,当然看到的是解码后的,是outlook帮你解码了。看看email模块怎么处理这个邮件,假设信件已经存为xxx.eml。#-*-encoding:gb2312-*-importemailfp=open(xxx.eml,r)msg=email.message_from_file(fp)#直接文件创建message对象,这个时候也会做初步的解码subject=msg.get(subject)#取信件头里的subject,也就是主题#下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC?=这样的subjecth=email.Header.Header(subject)dh=email.Header.decode_header(h)subject=dh[0][0]printsubject:,subjectprintfrom:,email.utils.parseaddr(msg.get(from))[1]#取fromprintto:,email.utils.parseaddr(msg.get(to))[1]#取tofp.close()这段代码可以把一封邮件中的主题、发件人、收件人解析出来。email.utils.parseaddr是用来专门解析邮件地址的,原因是邮件地址很多时候在原文里是这样写的:user1xxxxxxxx@163.com,email.utils.parseaddr就可以把它解析为一个列表,第一项是user1,第二项是xxxxxxxx@163.com,这里只显示了后面以部分。前面那段代码只是解析了信件头,接着解析信件体吧。信体里可能有纯文本的plain和html两部分,也可能有附件。这里需要mime的知识,详细介绍可以从网上搜搜。我这里就不说了,下面看看怎么解析的:#-*-encoding:gb2312-*-importemailfp=open(xxx.eml,r)msg=email.message_from_file(fp)#循环信件中的每一个mime的数据块forparinmsg.walk():ifnotpar.is_multipart():#这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。name=par.get_param(name)#如果是附件,这里就会取出附件的文件名ifname:#有附件#下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名h=email.Header.Header(name)dh=email.Header.decode_header(h)fname=dh[0][0]print'附件名:',fnamedata=par.get_payload(decode=True)#解码出附件数据,然后存储到文件中try:f=open(fname,'wb')#注意一定要用wb来打开文件,因为附件一般都是二进制文件except:print'附件名有非法字符,自动换一个'f=open('aaaa','wb')f.write(data)f.close()else:#不是附件,是文本内容printpar.get_payload(decode=True)#解码出文本内容,直接输出来就可以了。print'+'*60#用来区别各个部分的输出简单吧,并没有多少代码就可以实现复杂的解析邮件的功能!python模块之email:电子邮件编码解码(二、编码邮件)用email模块来生成邮件也是很简单的,只是需要一些mime的基础知识。下面看看一点mime基础。MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体。邮件头与邮件体之间以空行进行分隔。这点可以用文本编辑器(比如记事本)查看一个邮件的源文件就可以清除看到。outlook和foxmail自己就有查看源文件的功能。邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“:”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功