# -*- 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. datagrid在MVC中的运用02-结合搜索

    本文接着上一篇,来体验给datagrid加上搜索功能.主要涉及到: ※ 把一个div与datagrid相关起来 ※ datagrid接收查询参数 ※ 查询参数的封装 效果图: 查询参数封装 分页相关的 ...

  2. 25LINQ拾遗及实例

      投影 □ 遍历数组索引,Select获取 int[] indexes = {0, 2}; string[] strs = {"a", "b", " ...

  3. nginx简单代理配置

    原文:https://my.oschina.net/wangnian/blog/791294 前言  Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器, ...

  4. Accepting PayPal in games(完整的Paypal在Unity的支付)

      Hello and welcome back to my blog! In this article I’m going to talk about the process of acceptin ...

  5. MyEclipse Web项目调试

    1.发布项目 2.启动服务 服务有两种启动方式,Run Server和Debug Server Run Server是运行模式,Debug Server是调试模式 使用Debug Server模式启动 ...

  6. vc中nmake.exe cl.exe 的使用

    首先简单介绍一下程序是如何编译链接的.程序写好之后,我们进行编译和链接来产生可执行程序.这时候,编译器为了完成编译和链接,需要知道很多信 息.比如要编译的文件是哪一个,使用哪些编译选项进行编译,编译好 ...

  7. VMware虚拟机的三种联网方法及原理

    VMware虚拟机的三种联网方法及原理 博客分类: 操作系统 虚拟机Vmware互联网网络应用网络协议 一.Brigde——桥接  :默认使用VMnet0 1.原理: Bridge  桥"就 ...

  8. 列出Windows域中所有的机器

    我所在的部门大概管理了300+台Windows终端,最近开始采用域的方式来进行管理.(别笑我们土,原来手工修改Windows口令太痛苦了.) 现在的任务是想在域控服务器中列出纳入域管理的所有机器,以及 ...

  9. MICS:副本和纠删码混合存储系统

    摘要 云存储系统的三个指标: 高可靠性,低存储开销,高读写性能. 这三个指标是没有办法同一时候满足的,许多时候须要进行tradeoff. 副本系统和纠删码是两种在存储系统中广泛使用的策略,它们在保证高 ...

  10. 第十九章 springboot + hystrix(1)

    hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) <! ...