python接收邮件

1.poplib.POP3('这里填入你pop邮件服务器地址') 登陆服务器. 
2.poplib.user('用户名 ') poplib.pass_('密码') 
3.poplib.stat()方法返回一个元组:(邮件数,邮件尺寸) 
mailCount,size=poplib.stat() 
这样mailCount就是邮件的数量,size,就是所有邮件的大小.

4.poplib.retr('邮件号码')方法返回一个元组:(状态信息,邮件,邮件尺寸)  
hdr,message,octet=server.retr(1) 读去第一个邮件信息. 
hdr的内容就是响应信息和邮件大小比如'+OK 12498 octets' 
message 是包含邮件所有行的列表. 
octet 是这个邮件的内容. 

email.message_from_string() 这个方法能把String的邮件转换成email.message实例. 
比如我们上面的message,向下面这样调用. 
mail=email.message_from_string(string.join(message,'\n')) 
这样我们就生成了一个email.Message实例 

email.Header.decode_header(mail['subject']) 
(解码后的字串,字符编码) 
意思为返回一个以“字符编码”编码的“字串”

s_multipart(),这个方法返回boolean值,如果实例包括多段,就返回True,


邮件的格式:邮件的内容都是经过处理后的文本。这些文本可以表示以下信息:
1、邮件头:邮件头携带有发件人(from)、发给谁(to)、邮件主题(subject)、接收日期(date)等信息。
2、邮件body(主体)。body有文本格式和html格式之分,这两种格式的body,可以同时存在,也可以只存在一种。这就是为什么有些邮件既可以用html格式查看,又可以用文本格式查看的原因了。
3、附件(attach)。发送邮件时,可以将本机的文件一起发送。附件可以有0个或多个,只要附件的总大小,不超过邮件服务器所声明的最大容量。

对文本格式的body、html格式的body、附件等内容进行编码时,这些内容之间相互独立存在,之间又没有关系, 编码时就将它们进行分段分别处 理 。我们将每个段文本称为Payload。Payload带有多个参数和内容信息,这些参数用来描述Payload内容的编码格式(Content- Transfer-Encoding)、附件的名称和类型、body的格式类型(Content-Type)等。Payload可以包含0或多个其它的 Payload。反过头来,我们可以认为整个邮件也是一个Payload,邮件头只是它所携带的参数信息而已。

Payload的内容由参数(Content- Transfer-Encoding)来保存编码格式,解码时就按照这个编码格式进行解码即可。那么Payload的参数的编码是如何表示的呢?如邮件头 的from参数值,它其实是将编码格式和内容放在一起如'=?utf-8?Q?UMLChina=E6=9C=8D=E5=8A=A1?= ',前面一部分为编码格式,后面的内容为编码后的文本内容。


如何分辨出此Payload是何种数据呢?
1、分辨附件。如果Payload的参数name,所对应的value不为空时,那么我们可以认为此Payload为附件,value为附件名称。
2、分辨body。如果不为附件,那么根据content-type参数对应的value,当value等于"text/plain"时,我们就认为是文 本格式的body。当value等于"text/html"时,我们就认为时html格式的body。如果这两种都不时,我们就默认它为html格式的 body。

那么我们可以用递归的方法来处理。
1、首先处理邮件的头信息。
2、将邮件当作一个Payload进行处理。
2.1、判断Payload是否还有子Payload,如果有则,递归处理所有子Payload。
2.2 如果Payload没有子Payload,则按照分辨原子Payload的方式处理。

#判断是否还有子Payload
payLoad.is_multipart()
#得到Payload的内容
msgText = payLoad.get_payload()
#得到Payload的子Payload
subPayLoad = payLoad.get_payload()
如果为附件
#得到Payload的Content-type参数、内容传输编码、附件名称
contentTypes = payLoad['Content-Type']
tranEncoding = payLoad['Content-Transfer-Encoding']
attachName = payLoad.get_param("name")

if part.get_filename() == 'abc.txt':
fcontent = part.get_payload(decode = 1)

可以使用mail.walk()得到每个payload
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值