详解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文件与文件夹常见基本操作总结
Sep 19 Python
机器学习python实战之决策树
Nov 01 Python
Python建立Map写Excel表实例解析
Jan 17 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
Aug 01 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 Python
python 实现识别图片上的数字
Jul 30 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
python实现自动清理重复文件
Aug 24 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 网上商城促销设计实例代码
2012/02/17 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
基于Python的身份证号码自动生成程序
2014/08/15 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
python实现飞机大战微信小游戏
2020/03/21 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
python 连续不等式语法糖实例
2020/04/15 Python
python 如何设置守护进程
2020/10/29 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
外国语学院毕业生自荐信
2013/10/28 职场文书
带薪年假请假条
2014/02/04 职场文书
农村葬礼主持词
2014/03/31 职场文书
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
vue elementUI批量上传文件
2022/04/26 Vue.js