Python3读取邮件内容

Python3读取邮件内容

前言

邮件的收取主要有pop(主要用于客户端远程管理服务器上的邮件)和imap(交互式邮件访问协议),相应的Python中提供了相关的模块poplib和imaplib。POP3尽管得到广泛的支持,但其已经过时,而且POP3服务器的实现差异很大,大多数进行较差,所以如果我们的邮件服务器支持IMAP,那么最好使用imaplib.IMAP4,因为IMAP服务器往往会更好的实现。基本上主流的邮箱都会支持imap协议,如qq、163、gmail、outlook等等。因此我们选择imap协议来实现读取邮件的脚本。

实现过程

  • 登录邮箱并读取原始邮件

    使用imaplib库实现邮箱登录,所以需要先导入库import imaplib,然后利用imaplib库中的方法登录邮箱并读取邮件

    def get_mail(email_address, password):
      # 这里的服务器根据需要选择
      server = imaplib.IMAP4_SSL("imap.gmail.com")
      server.login(email_address, password)
      # 邮箱中的文件夹,默认为‘INBOX‘
      inbox = server.select("INBOX")
      # 搜索匹配的邮件,第一个参数是字符集,None默认就是ASCII编码,第二个参数是查询条件,这里的ALL就是查找全部
      type, data = server.search(None, "ALL")
      # 邮件列表,使用空格分割得到邮件索引
      msgList = data[0].split()
      # 最新邮件,第0封邮件为最早的一封邮件
      latest = msgList[len(msgList) - 1]
      type, datas = server.fetch(latest, ‘(RFC822)‘)
      # 使用utf-8解码
      text = datas[0][1].decode(‘utf8‘)
      # 转化为email.message对象
      message = email.message_from_string(text)
      return message

    上述程序返回值为email.message,即原始邮件,如果打印出来,我们会发现这些一些代码,无法读懂,因此接下来我们需要将原始邮件转化为可读邮件

    关于email.message

    电子邮件消息由 headerspayload (其也被称为 content)组成。标题是 RFC 5322RFC 6532 样式的字段名称和值。有效载荷可以是简单文本消息,或二进制对象或子消息的结构化序列,每个子消息具有它们自己的一组头部和它们自己的有效载荷。后一类型的有效载荷由具有诸如 multipartmessage/rfc822 的MIME类型的消息指示。

    EmailMessage 对象提供的概念模型是与表示消息的 RFC 5322 主体的 payload 耦合的标题的有序字典,其可以是子 EmailMessage 对象的列表。除了用于访问头部名称和值的常规字典方法之外,还存在用于从头部(例如MIME内容类型)访问专用信息,用于在有效载荷上操作,用于生成消息的序列化版本的方法,以及用于递归地遍历对象树。

    EmailMessage 类字典接口由标题名称索引,标题名称必须是ASCII值。字典的值是带有一些额外方法的字符串。头以字节保存的形式存储和返回,但字段名匹配大小写不敏感。不像真正的dict,有一个排序的键,并可以有重复的键。提供了其他方法来处理具有重复键的标头。

  • 将原始邮件转化为可读邮件
    1. 邮件的Subject或者Email中包含的名字都是经过编码后的字符串,要正常显示就必须decode,定义 一个decode函数

      def decode_str(s):
       value, charset = decode_header(s)[0]
       if charset:
           value = value.decode(charset)
       return value
    2. 为了防止非UTF-8编码的邮件无法显示,定义一个检测邮件编码函数
      def guess_charset(msg):
       charset = msg.get_charset()
       if charset is None:
           content_type = msg.get(‘Content-Type‘, ‘‘).lower()
           pos = content_type.find(‘charset=‘)
           if pos >= 0:
               # 去掉尾部不代表编码的字段
               charset = content_type[pos + 8:].strip(‘; format=flowed; delsp=yes‘)
       return charset
    3. 接下来通过循环遍历来读取邮件内容
      # 使用全局变量来保存邮件内容
      mail_content = ‘\n‘
      # indent用于缩进显示:
      def print_info(msg, indent=0):
       global mail_content
       if indent == 0:
           for header in [‘From‘, ‘To‘, ‘Subject‘]:
               value = msg.get(header, ‘‘)
               if value:
                   if header == ‘Subject‘:
                       value = decode_str(value)
                   else:
                       hdr, addr = parseaddr(value)
                       name = decode_str(hdr)
                       value = u‘%s <%s>‘ % (name, addr)
               mail_content += ‘%s%s: %s‘ % (‘  ‘ * indent, header, value) + ‘\n‘
       parts = msg.get_payload()
       for n, part in enumerate(parts):
           content_type = part.get_content_type()
           if content_type == ‘text/plain‘:
               content = part.get_payload(decode=True)
               # charset = guess_charset(msg)
               charset = ‘utf-8‘
               if charset:
                   content = content.decode(charset)
               mail_content += ‘%sText:\n %s‘ % (‘ ‘ * indent, content)
           else:
               # 这里没有读取非text/plain类型的内容,只是读取了其格式,一般为text/html
               mail_content += ‘%sAttachment: %s‘ % (‘  ‘ * indent, content_type)
      return mail_content
    4. 最后,调用上述函数,输出邮件内容
      if __name__ == ‘__main__‘:
       email_addr = "[email protected]"
       password = "mypassword"
       test = print_info(get_mail(email_addr, password))
       print("mail content is: %s" % test)

相关问题

原文地址:https://blog.51cto.com/acevi/2442415

时间: 2024-08-03 10:25:22

Python3读取邮件内容的相关文章

C# Po3协议读取邮件内容遇到的问题

背景:最近在做一个小工具,读取PO3协议邮件服务器的指定人员的邮件,东西做出来了,弄了一个While死循环,20秒执行一次, 结果运行了3天,周一来IT人员找上门来了,你的电脑什么情况,怎么一个小时下载流量达到1个G多,而且都是PO3协议的,哈哈,哈哈 心理很想呵呵,但是还得如实跟他解释了一下情况,然后立刻把程序停止了. 接下来我就是找问题啦,最后找到了原因是因为我每次都是循环读取邮箱中的180条邮件,这180条中还有好多有几十兆附件的,哈哈 解决办法和问题原因: 问题就出现这循环读取以及读取过

利用Python imaplib和email模块 读取邮件文本内容及附件内容

#! encoding:utf8 ''' 环境: Win10 64位 Python 2.7.5 参考: http://www.pythonclub.org/python-network-application/email-format http://blog.sina.com.cn/s/blog_4deeda2501016eyf.html ''' import imaplib import email def parseHeader(message): """ 解析邮件首部

node.js实现收取邮件,以及对特定邮件内容的自动回复,邮件正文保存的功能

废话不多说,直接上代码... var Imap = require('imap');var inspect = require('util').inspect;var MailParser = require("mailparser").MailParser;var nodemailer = require('nodemailer'); var fs = require('fs');var http = require('http'); var imap = new Imap({ us

java读取邮件

package com.zz.mail; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Properties; import javax.mail.Address; i

认真对待 Python3 收邮件

前言 准备 初体验 试水 划水 蹚水 潜水 拓展 前言 之前老是用Python发邮件,用起来挺方便的.但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊.所以写个脚本来做下定时任务,一旦有相关的主题邮件,结合GUI控件,声音组件,给出提醒. 想来还是不错的. 收邮件其实是被Python内置支持的,名为poplib.安装了Python的话,就会默认存在于标准库中,用起来也很方便.下面就一步步的来实现今天的

使用 EWS(Exchange Web Service)协议读取邮件、发送邮件

问题: 公司之前可以通过POP3协议收发邮件,因而在SoapUI中用JavaMail可以读取邮件,后来配置了Office 365,POP3协议端口不再开放,邮件全部读取失败,报login timeout,需要改用EWS(Exchange Web Service)协议. 参考 : http://blog.csdn.net/yangcheng33/article/details/55049629 需要导入此JAR包 : ews-java-api-2.0.jar import java.net.URI

Python发送邮件(常见四种邮件内容)

Python发送邮件(常见四种邮件内容) 转载 2017年03月03日 17:17:04 转自:http://lizhenliang.blog.51cto.com/7876557/1875330 在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调用运营商邮箱服务器. 对于Python来说,需要编写脚本调用邮件服务器来发送邮件,使用的协议是SMTP.

python3读取ini配置文件

python3读取ini配置文件(含中文)import configparser# 加载现有配置文件conn = configparser.ConfigParser()conn.read("KKD.ini", encoding="utf-8-sig") #此处是utf-8-sig,而不是utf-8 #以下两种方法读取文件内容效果一样print(conn.get('rclog', 'kkdqg_in')) 原文地址:https://www.cnblogs.com/te

上网行为管理软件如何监控客户端方式收发的邮件内容?

客户端邮件是指用邮件客户端来收发邮件. 邮件客户端一般采用SMTP.POP3和IMAP协议,随着SSL加密的广泛应用,后来又发展了SSL加密的邮件收发. 配置客户端时,如果勾选了"此链接需要SSL加密"或者"STARTTLS"的传输方式,都意外着该链接已经被加密.目前,SSL加密邮件已经得到了广泛的应用. 在"WFilter上网行为管理软件"中,无需配置即可监控到不加密的客户端邮件. 1. 在"所有在线"中点击"邮件