详解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中由于logging模块误用导致的内存泄露
Apr 23 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
python中map()与zip()操作方法
Feb 27 Python
详解python eval函数的妙用
Nov 16 Python
使用numba对Python运算加速的方法
Oct 15 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Django接收自定义http header过程详解
Aug 23 Python
Python super()方法原理详解
Mar 31 Python
Python网页解析器使用实例详解
May 30 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
Python paramiko使用方法代码汇总
Nov 20 Python
Python 中random 库的详细使用
Jun 03 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变量的方法
2015/06/26 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
Python FTP操作类代码分享
2014/05/13 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
python re模块findall()函数实例解析
2018/01/19 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
高级电工工作职责
2013/11/21 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
财务会计专业自荐书
2014/06/30 职场文书
爬山的活动方案
2014/08/16 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
小程序自定义轮播图圆点组件
2022/06/25 Javascript