# -*- coding: utf-8 -*-
#python 27
#xiaodeng
#python之poplib模块下载并解析邮件
#https://github.com/michaelliao/learn-python/blob/master/email/fetchmail_pop3.py
import poplib,email
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr #编码处理
def guess_charset(msg):
charset = msg.get_charset()#从msg对象获取编码
if charset is None:
content_type = msg.get('Content-Type', '').lower()#如果获取不到,再从content—type字段获取
if 'charset' in content_type:
charset=content_type.split('charset=')[1].strip()
return charset
return charset #数据解码
def decode_str(s):
value, charset = decode_header(s)[0]#数据,数据编码方式,from email.header import decode_header
if charset:
value = value.decode(charset)
return value #print_ingo函数:
def print_info(msg, indent=0):#indent用于缩进显示
if indent == 0:
for header in ['From', 'To', 'Subject']:#邮件的from、to、subject存在于根对象上
value = msg.get(header, '')
if value:
if header=='Subject':
value = decode_str(value)#需要解码subject字符串
else:
#解码mail地址
hdr, addr = parseaddr(value)
name = decode_str(hdr)
value = '%s' % (addr)
print '%s:%s'%(header,value)
print '--'*20
if (msg.is_multipart()):
#如果邮件对象是一个is_multipart,get_payload()返回一个list,包含所有子对象
parts = msg.get_payload()#循环获得列表项
for n, part in enumerate(parts):
#print('%spart %s' % (' ' * indent, n))
#print('%s------------' % (' ' * indent))
#递归打印没一个子对象
print_info(part, indent + 1)
else:
#邮件对象不是一个is_multipart,就根据content_type判断
content_type = msg.get_content_type()#数据类型
if content_type=='text/plain' or content_type=='text/html':#纯文本 html文本
#纯文本或html内容
content = msg.get_payload(decode=True)#获得文本对象的字符串而非对象本身
charset = guess_charset(msg)#要检测文本编码
if charset:content = content.decode(charset)
content='%s' % (content)
print content#获取邮件文本内容,如果只有文本,打印显示的结果和邮件中看的效果一模一样
else:
print '不是文本' #链接到pop3服务器
server=poplib.POP3('pop.163.com') #打印pop3服务器的欢迎对象
#server.getwelcome() #身份认证
email='xxxx@163.com'
password='xxxx'
server.user(email)#输入邮件地址
server.pass_(password)#输入口令
#print('Messages: %s. Size: %s' % server.stat())#Messages: 3. Size: 36090 #请求消息列表,返回所有邮件的编号;可以查看返回的列表类似['1 82923', '2 2184', ...]
resp, mails, octets = server.list() #获取最新一封邮件
#Poplib模块的retr()函数使用来下载邮件的。它每次刚好下载一封邮件,我们必须传递给他想要下载的邮件的数字。
#print mails#['1 2721', '2 2784', '3 2986', '4 28987', '5 10056', '6 753', '7 763']
#注意索引号从1开始,那么最新的一封邮件就是索引最大的那个数值
lenString=len(mails)
resp, mailContent, octets = server.retr(lenString)#mailContent:邮件内容 #解析邮件:只需要一行代码就可以把邮件内容解析为Message对象
msg = Parser().parsestr('\r\n'.join(mailContent)) #打印邮件内容,调用print_info函数:
print_info(msg) #server.dele(len(mails))#慎重:将直接从服务器删除邮件: #关闭连接:
server.quit() '''
From:dengyg200891@163.com
----------------------------------------
To:drgs156@163.com
----------------------------------------
Subject:我就是标题
----------------------------------------
见到我,表示邮件发送成功
'''

python之poplib模块下载并解析邮件的更多相关文章

  1. python使用requests模块下载文件并获取进度提示

    一.概述 使用python3写了一个获取某网站文件的小脚本,使用了requests模块的get方法得到内容,然后通过文件读写的方式保存到硬盘同时需要实现下载进度的显示 二.代码实现 安装模块 pip3 ...

  2. python使用you-get模块下载视频

    pip install you-get # 安装先 怎么用    进入命令行: you-get url 暂停下载:ctrl + c ,继续下载重复  you-get url 官网地址:https:// ...

  3. Python使用requests模块下载图片

    MySQL中事先保存好爬取到的图片链接地址. 然后使用多线程把图片下载到本地. # coding: utf-8 import MySQLdb import requests import os imp ...

  4. python之scrapy模块下载中间件

    知识点 使用方法: 编写一个Downloader Middlewares和我们编写一个pipeline一样,定义一个类,然后在setting中开启 Downloader Middlewares默认的方 ...

  5. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  6. python的email、smtplib、poplib模块收发邮件

    一封电子邮件的旅程是: MUA:Mail User Agent--邮件用户代理.(即类似Outlook的电子邮件软件) MTA:Mail Transfer Agent--邮件传输代理,就是那些Emai ...

  7. 使用python的email、smtplib、poplib模块收发邮件

    使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...

  8. Python连载57- 邮件头和主题、解析邮件

    一.添加邮件头,抄送等信息 1.mail["From"]表示发送者信息,包括姓名和邮件 2.mail["To"]表示接收者信息,包括姓名和邮件地址 3.mail ...

  9. Python各种模块下载及安装配置

    方式1 在Python官网https://www.python.org/或者是github搜索进行下载 ,解压缩之后通过命令提示符进入已经解压缩文件夹根目录,输入下面的命令: python setup ...

随机推荐

  1. Knockout官网实例在MVC下的实现-02,实现计次

    本篇使用Knockout在MVC下实现"Hello World",对应的官网实例在这里. 当次数达到3: View视图 页面包含三个部分:1.显示点击按钮的次数2.button按钮 ...

  2. Windows怎样实时同步文件夹?Java+Spring+Quartz+Tomcat集群实现

    我有一台服务器上加了两块硬盘.其中有个目录下的数据非常重要.假设是D:\data目录.这个目录下有几十个G的文件. 我希望能把这个文件夹里的内容同步到另一块硬盘的目录下,假设是E:\data 我希望最 ...

  3. eclipse Reference 功能之——项目之间的引用

    i'm sorry, i forgot this article where i found. that it is referenced. 以前也研究过Eclipse里Web Project引用Ja ...

  4. css3 3d展示中rotate()介绍与简单实现

    最近在了解css3的3d动画效果,学习发现,css3中的3d效果实现还是很好玩的,现在我给你大家简单的介绍一下css3中3d效果的实现. 我也只是一个初学者,如果在博客中写的不对的地方欢迎指正. 好了 ...

  5. OpenCV学习(27) 直方图(4)

    我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体.下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的 ...

  6. C语言编译器不检查数组下标越界

    这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以 ...

  7. Java 动态向 JTable 中添加数据

    import java.awt.Toolkit; import javax.swing.SwingUtilities; import javax.swing.UIManager; import jav ...

  8. C#线程同步与死锁Monitor

    在上一讲介绍了使用lock来实现C#线程同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public stat ...

  9. 【面试必读】一不注意就做错的五道JavaScript题目

    如果不会,可以存在DW中运行试一下哦~ 1.这段代码会输出什么? function Container( properties ) { var objthis = this; for ( var i  ...

  10. Java 实例 - 队列(Queue)用法

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...