详解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获取从命令行输入数字的方法
Apr 29 Python
通过源码分析Python中的切片赋值
May 08 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
PyQT实现多窗口切换
Apr 20 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
Jul 11 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
python语言中有算法吗
Jun 16 Python
Pygame如何使用精灵和碰撞检测
Nov 17 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安全配置
2006/12/06 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
js资料toString 方法
2007/03/13 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
python实现巡检系统(solaris)示例
2014/04/02 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
python实现滑雪者小游戏
2020/02/22 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
感恩祖国演讲稿
2014/09/09 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
golang定时器
2022/04/14 Golang