侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   246

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

实现结果图:

实现代码:

#!/usr/bin/python2.7# _*_ coding: utf-8 _*_"""@Author: MarkLiu"""import poplibimport emailfrom email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddrdef decode_str(s):  value, charset = decode_header(s)[0]  if charset:    value = value.decode(charset)  return valuedef 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 charsetdef 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_filesif __name__ == '__main__':  # 输入邮件地址, 口令和POP3服务器地址:  emailaddress = '[email protected]'  # 注意使用开通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中LEGB和闭包及装饰器
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客