博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POP3接收邮件
阅读量:5821 次
发布时间:2019-06-18

本文共 3448 字,大约阅读时间需要 11 分钟。

#SMTP用于发送邮件,如果要收取邮件呢?
#收取邮件就是编写一个MUA作为客户端,从MDA获取邮件到用户的电脑或手机上。收取邮件最常用的协议是POP,目前版本是3,俗称POP3.
#Python内置了一个poplib模块,用于实现POP3协议,可以直接用来收取邮件。
#注意POP3协议收取的不是可以阅读的邮件,而是邮件的原始文本。这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。
#要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类解析原始文本。
#收取邮件分为以下两个步骤
1)、用poplib把邮件的原始文本下载到本地。
2)、用email解析原始文本,还原为邮件对象。
 
1、POP下载邮件
#pop3协议很简单。下面获取最新一封邮件的内容,代码如下:
1 #! /usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #Email_pop3 4  5 import poplib 6 from email.parser import Parser 7  8 #输入邮箱地址、密码和POP服务器地址 9 email=input('Email:')10 password=input('Password:')11 pop3_server=input('POP3 server:')12 13 #连接到POP3服务器14 server=poplib.POP3(pop3_server)15 16 #可以打开或关闭调试信息17 server.set_debuglevel(1)18 19 #可选:输出pop3服务器的欢迎文字20 print(server.getwelcome().decode('utf-8'))21 22 #身份认证23 server.user(email)24 server.pass_(password)25 26 #stat()返回邮件数量和占用空间27 print('Message:%s.Size:%s'%server.stat())28 29 #list()返回所有邮件的编号30 resp,mails,octets=server.list()31 32 #可以查看返回的列表,类似[b'1 82923',b'2 2184',...]33 print(mails)34 35 #获取最新一封邮件,注意索引号从1开始36 index=len(mails)37 resp,lines,octets=server.retr(index)38 39 #lines存储了邮件原始文本的每一行40 #可以获得整个邮件的原始文本41 msg_content=b'\r\n'.join(lines).decode('utf-8')42 43 #稍后解析邮件44 msg=Parser().parsestr(msg_content)45 46 #可以根据邮件索引号直接从服务器删除邮件47 #server.dele(index)48 #关闭连接49 server.quit()
#用POP3获取邮件其实很简单,要获取所有邮件,只需要循环使用retr()把每一封邮件的内容拿到即可。真正麻烦的是把邮件的原始内容解析为可以阅读的邮件对象。
 
2、解析邮件
#解析邮件的过程和构造邮件正好相反,需要先导入必要的模块:
1 from email.parser import Parser2 from email.header import decode_header3 from email.utils import parseaddr4 import poplib
#只需要一行代码就可以把邮件内容解气为Message对象:
1 msg=Parser().parsestr(msg_content)
#这个Message对象可能是一个MIMEMultipart对象,即包含嵌套的其他MIMEBase对象,嵌套可能还不止一层。
#我们要递归地输出Message对象的层次结构:
1 def print_info(msg,indent=0): 2     if indent==0: 3         for header in ['From','To','Subject']: 4             value=msg.get(header,'') 5             if value: 6                 if header=='Subject': 7                     value=decode_str(value) 8                 else: 9                     hdr,addr=parseaddr(value)10                     name=decode_str(hdr)11                     value=u'%s<%s>'%(name,addr)12                 print('%s%s:%s'%(''*indent,header,value))13     if(msg,is_multipart()):14         parts=msg.get_payload()15         for n,part in enumerate(parts):16             print('%spart %s'%(''*indent,n))17             print('%s------------'%(''*indent))18             print_info(part,indent+1)19     else:20         content_type=msg.get_content_type()21         if content_type=='text/plain' or content_type=='text/html':22             content=msg.get_payload(decode=True)23             charset=guess_charset(msg)24             if charset:25                 content=content.decode(charset)26             print('%sText:%s'%(''*indent,content+'...'))27         else:28             print('%sAttachment:%s'%(''*indent,content_type))
#邮件的Subject或Email中包含的名字都是经过编码的str,要正常显示必须进行解码,代码如下:
1 def decode_str(s):2     value,charset=decode_header(s)[0]3     if charset:4         value=value.decode(charset)5     return value
#decode_header()返回一个list,因为像Cc、Bcc这样的字段可能包含多个邮件地址,所以会解析出多个元素。
#文本邮件的内容也是str,好需要检测编码,否则非UTF-8编码的邮件都无法正常显示,代码如下:
1 def guess_charset(msg):2     charset=msg.get_charset()3     if charset is None:4         content_type=msg.get('Content-Type','').lower()5         pos=content_type.find('charset=')6         if pos >=0:7             chatset=content_type[pos+8:].strip()8         return charset

 

转载于:https://www.cnblogs.com/DLHe/p/8463536.html

你可能感兴趣的文章
js之无缝滚动
查看>>
Django 多表联合查询
查看>>
logging模块学习:basicConfig配置文件
查看>>
Golang 使用 Beego 与 Mgo 开发的示例程序
查看>>
ntpdate时间同步
查看>>
+++++++子域授权与编译安装(一)
查看>>
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>
路由器发布服务器
查看>>
实现跨交换机VLAN间的通信
查看>>
jquery中的data-icon和data-role
查看>>
python例子
查看>>
环境变量(总结)
查看>>
ios之UILabel
查看>>
Java基础之String,StringBuilder,StringBuffer
查看>>
1月9日学习内容整理:爬虫基本原理
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
渐变色文字
查看>>
C++ 0X 新特性实例(比较常用的) (转)
查看>>
node生成自定义命令(yargs/commander)
查看>>