详解python实现读取邮件数据并下载附件的实例


Posted in Python onAugust 03, 2017

详解python实现读取邮件数据并下载附件的实例

实现结果图:

详解python实现读取邮件数据并下载附件的实例

实现代码:

#!/usr/bin/python2.7
# _*_ coding: utf-8 _*_

"""
@Author: MarkLiu
"""

import poplib
import email
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr


def decode_str(s):
  value, charset = decode_header(s)[0]
  if charset:
    value = value.decode(charset)
  return value


def guess_charset(msg):
  # 先从msg对象获取编码:
  charset = msg.get_charset()
  if charset is None:
    # 如果获取不到,再从Content-Type字段获取:
    content_type = msg.get('Content-Type', '').lower()
    pos = content_type.find('charset=')
    if pos >= 0:
      charset = content_type[pos + 8:].strip()
  return charset


def get_email_headers(msg):
  # 邮件的From, To, Subject存在于根对象上:
  headers = {}
  for header in ['From', 'To', 'Subject', 'Date']:
    value = msg.get(header, '')
    if value:
      if header == 'Date':
        headers['date'] = value
      if header == 'Subject':
        # 需要解码Subject字符串:
        subject = decode_str(value)
        headers['subject'] = subject
      else:
        # 需要解码Email地址:
        hdr, addr = parseaddr(value)
        name = decode_str(hdr)
        value = u'%s <%s>' % (name, addr)
        if header == 'From':
          from_address = value
          headers['from'] = from_address
        else:
          to_address = value
          headers['to'] = to_address
  content_type = msg.get_content_type()
  print 'head content_type: ', content_type
  return headers


# indent用于缩进显示:
def get_email_cntent(message, base_save_path):
  j = 0
  content = ''
  attachment_files = []
  for part in message.walk():
    j = j + 1
    file_name = part.get_filename()
    contentType = part.get_content_type()
    # 保存附件
    if file_name: # Attachment
      # Decode filename
      h = email.Header.Header(file_name)
      dh = email.Header.decode_header(h)
      filename = dh[0][0]
      if dh[0][1]: # 如果包含编码的格式,则按照该格式解码
        filename = unicode(filename, dh[0][1])
        filename = filename.encode("utf-8")
      data = part.get_payload(decode=True)
      att_file = open(base_save_path + filename, 'wb')
      attachment_files.append(filename)
      att_file.write(data)
      att_file.close()
    elif contentType == 'text/plain' or contentType == 'text/html':
      # 保存正文
      data = part.get_payload(decode=True)
      charset = guess_charset(part)
      if charset:
        charset = charset.strip().split(';')[0]
        print 'charset:', charset
        data = data.decode(charset)
      content = data
  return content, attachment_files


if __name__ == '__main__':
  # 输入邮件地址, 口令和POP3服务器地址:
  emailaddress = 'xxxxxx@163.com'
  # 注意使用开通POP,SMTP等的授权码
  password = 'xxxxxx'
  pop3_server = 'pop.163.com'

  # 连接到POP3服务器:
  server = poplib.POP3(pop3_server)
  # 可以打开或关闭调试信息:
  # server.set_debuglevel(1)
  # POP3服务器的欢迎文字:
  print server.getwelcome()
  # 身份认证:
  server.user(emailaddress)
  server.pass_(password)
  # stat()返回邮件数量和占用空间:
  messagesCount, messagesSize = server.stat()
  print 'messagesCount:', messagesCount
  print 'messagesSize:', messagesSize
  # list()返回所有邮件的编号:
  resp, mails, octets = server.list()
  print '------ resp ------'
  print resp # +OK 46 964346 响应的状态 邮件数量 邮件占用的空间大小
  print '------ mails ------'
  print mails # 所有邮件的编号及大小的编号list,['1 2211', '2 29908', ...]
  print '------ octets ------'
  print octets

  # 获取最新一封邮件, 注意索引号从1开始:
  length = len(mails)
  for i in range(length):
    resp, lines, octets = server.retr(i + 1)
    # lines存储了邮件的原始文本的每一行,
    # 可以获得整个邮件的原始文本:
    msg_content = '\n'.join(lines)
    # 把邮件内容解析为Message对象:
    msg = Parser().parsestr(msg_content)

    # 但是这个Message对象本身可能是一个MIMEMultipart对象,即包含嵌套的其他MIMEBase对象,
    # 嵌套可能还不止一层。所以我们要递归地打印出Message对象的层次结构:
    print '---------- 解析之后 ----------'
    base_save_path = '/media/markliu/Entertainment/email_attachments/'
    msg_headers = get_email_headers(msg)
    content, attachment_files = get_email_cntent(msg, base_save_path)

    print 'subject:', msg_headers['subject']
    print 'from_address:', msg_headers['from']
    print 'to_address:', msg_headers['to']
    print 'date:', msg_headers['date']
    print 'content:', content
    print 'attachment_files: ', attachment_files

  # 关闭连接:
  server.quit()

以上就是python读取邮件并下载邮件附件的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
简介Python中用于处理字符串的center()方法
May 18 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
基于python实现百度翻译功能
May 09 Python
python多线程并发实例及其优化
Jun 27 Python
tensorflow自定义激活函数实例
Feb 04 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
pandas处理csv文件的方法步骤
Oct 16 Python
用 python 进行微信好友信息分析
Nov 28 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 #Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 #Python
python中MethodType方法介绍与使用示例
Aug 03 #Python
初学python的操作难点总结(新手必看篇)
Aug 03 #Python
python 禁止函数修改列表的实现方法
Aug 03 #Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 #Python
详解Python import方法引入模块的实例
Aug 02 #Python
You might like
PHP版自动生成文章摘要
2008/07/23 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
php把数组值转换成键的方法
2015/07/13 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
学习ExtJS form布局
2009/10/08 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
python2.7和NLTK安装详细教程
2018/09/19 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
小学新学期寄语
2014/04/02 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
自我评价优缺点范文
2015/03/11 职场文书