详解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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python Cookie 读取和保存方法
Dec 28 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
浅谈Python3中print函数的换行
Aug 05 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
Python+Appium新手教程
Apr 17 Python
numpy数据类型dtype转换实现
Apr 24 Python
python三子棋游戏
May 04 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 file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
js DOM的学习笔记
2011/12/22 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python错误处理详解
2014/09/28 Python
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
python实现控制台输出颜色
2021/03/02 Python
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
大学活动邀请函
2014/01/28 职场文书
党员组织关系介绍信
2014/02/13 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
产品开发计划书
2014/04/27 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
名人演讲稿范文
2014/09/16 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
自我查摆剖析材料
2014/10/11 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
介绍信范文大全
2015/05/07 职场文书
色戒观后感
2015/06/12 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
Python实现简单得递归下降Parser
2022/05/02 Python
Windows server 2016服务器基本设置
2022/08/14 Servers