https://yq.aliyun.com/articles/54621

python模块之email: 电子邮件编码解码 (一、解码邮件)

python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用。
处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件:
Received: from 192.168.208.56 ( 192.168.208.56 [192.168.208.56] ) by
ajax-webmail-wmsvr37 (Coremail) ; Thu, 12 Apr 2007 12:07:48 +0800 (CST)
Date: Thu, 12 Apr 2007 12:07:48 +0800 (CST)
From: user1 <xxxxxxxx@163.com>
To: zhaowei <zhaoweikid@163.com>
Message-ID: <31571419.200911176350868321.JavaMail.root@bj163app37.163.com>
Subject: =?gbk?B?u+nJtA==?=
MIME-Version: 1.0
Content-Type: multipart/Alternative; 
boundary="----=_Part_21696_28113972.1176350868319"

------=_Part_21696_28113972.1176350868319
Content-Type: text/plain; charset=gbk
Content-Transfer-Encoding: base64

ztLS0b+qyrzS1M6qysfSu7j20MfG2ru70ru0zqOs1K3AtMrH0ru49tTCtffSu7TOztLDx8/W1NrT
prjDysew67XjssXE3MjI1ebC6bezICAg
------=_Part_21696_28113972.1176350868319
Content-Type: text/html; charset=gbk
Content-Transfer-Encoding: quoted-printable

<DIV>=CE=D2=D2=D1=BF=AA=CA=BC=D2=D4=CE=AA=CA=C7=D2=BB=B8=F6=D0=C7=C6=DA=BB=
=BB=D2=BB=B4=CE=A3=AC=D4=AD=C0=B4=CA=C7=D2=BB=B8=F6=D4=C2=B5=F7=D2=BB=B4=CE=
</DIV>
<DIV>=CE=D2=C3=C7=CF=D6=D4=DA=D3=A6=B8=C3=CA=C7=B0=EB=B5=E3=B2=C5=C4=DC=C8=
=C8</DIV>
<DIV>=D5=E6=C2=E9=B7=B3</DIV>
------=_Part_21696_28113972.1176350868319--

上面的就是以封邮件的源文件,从第一行到第一个空行之间的为信件头,后面的就是信件体了。把上面的信息复制下来存到一个叫xxx.eml的文件里,用鼠标双击就可以看到内容,当然看到的是解码后的,是outlook帮你解码了。
看看email模块怎么处理这个邮件,假设信件已经存为xxx.eml。

#-*- encoding: gb2312 -*-
import email

fp = open("xxx.eml", "r")
msg = email.message_from_file(fp) # 直接文件创建message对象,这个时候也会做初步的解码
subject = msg.get("subject") # 取信件头里的subject, 也就是主题
# 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC?=这样的subject
h = email.Header.Header(subject)
dh = email.Header.decode_header(h)
subject = dh[0][0]
print "subject:", subject
print "from: ", email.utils.parseaddr(msg.get("from"))[1] # 取from
print "to: ", email.utils.parseaddr(msg.get("to"))[1] # 取to

fp.close()

这段代码可以把一封邮件中的主题、发件人、收件人解析出来。email.utils.parseaddr是用来专门解析邮件地址的,原因是邮件地址很多时候在原文里是这样写的:user1 <xxxxxxxx@163.com>, email.utils.parseaddr就可以把它解析为一个列表,第一项是user1, 第二项是xxxxxxxx@163.com, 这里只显示了后面以部分。
前面那段代码只是解析了信件头,接着解析信件体吧。信体里可能有纯文本的plain和html两部分,也可能有附件。这里需要mime的知识,详细介绍可以从网上搜搜。我这里就不说了,下面看看怎么解析的:

#-*- encoding: gb2312 -*-
import email

fp = open("xxx.eml", "r")
msg = email.message_from_file(fp)

# 循环信件中的每一个mime的数据块
for par in msg.walk():
 if not par.is_multipart(): # 这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。
 name = par.get_param("name") #如果是附件,这里就会取出附件的文件名
 if name:
 #有附件
 # 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名
 h = email.Header.Header(name)
 dh = email.Header.decode_header(h)
 fname = dh[0][0]
 print '附件名:', fname
 data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中
 
 try:
 f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件
 except:
 print '附件名有非法字符,自动换一个'
 f = open('aaaa', 'wb')
 f.write(data)
 f.close()
 else:
 #不是附件,是文本内容
 print par.get_payload(decode=True) # 解码出文本内容,直接输出来就可以了。
 
 print '+'*60 # 用来区别各个部分的输出

本文转自 Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1861246

python模块之email: 电子邮件编码解码 (一、解码邮件)相关推荐

  1. python模块之email: 电子邮件编码解码 (二、编码邮件)

    用email模块来生成邮件也是很简单的,只是需要一些mime的基础知识.下面看看一点mime基础. MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体.邮件头与邮件体之间以空行进行分 ...

  2. python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)-阿里云开发者社区...

    python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用. 处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件: Re ...

  3. python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)

    python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用. 处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件: Re ...

  4. python模块之codecs: 自然语言编码转换

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.     有一点需要清楚的是,当python要做编码转换的时候,会借助于内 ...

  5. 安装了email模块还是报错_科普:利用Python smtplib和email模块实现自动发送邮件功能...

    概要 我们都知道SMTP(简单邮件传输协议),是一组用于从原地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式.SMTP规定电子邮件应该如何格式化.如何加密,以及如何在邮件服务器之间传递.SMT ...

  6. python decode()函数 (使用登记用于编码的编解码器解码字节)

    def decode(self, *args, **kwargs): # real signature unknown"""Decode the bytes using ...

  7. python模块、字符编码、文件读写

    模块 当我们用一种语言开始真正的软件开发室,除了编写代码外,还需要很多基本的已经写好的现成的东西,高级语言通常都会为我们提供了一个比较完善的基础代码库,让我们能直接调用,python也不例外,为我们提 ...

  8. python安装email模块_Python使用SMTP模块、email模块发送邮件

    一.smtplib模块: 主要通过SMTP类与邮件系统进行交互.使用方法如下: 1.实例化一个SMTP对象: s = smtplib.SMTP(邮件服务地址,端口号) s = smtplib.SMTP ...

  9. 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包

    自学Python第九天- 模块.包.编码.文件操作.OS 模块.打包 模块 导入模块 程序入口 包 编码 文件操作 打开或创建文件 常用的文件打开模式 边读边写 文件对象的常用方法 读写 CSV Ex ...

最新文章

  1. phpStudy项目目录无法访问(报错500、400)
  2. 添加Mysql普通用户来管理hive
  3. nodejs - local installation and global installation
  4. Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长
  5. express中间件系统的基本实现
  6. 科创板第二天:全线翻绿 仅4股飘红
  7. 《Python神经网络编程》
  8. mongodb 全文搜索---ttlsa教程系列之mongodb(十)
  9. sqlserver中系统库的作用
  10. 图解tcpip 第5版 pdf_16G906国标图集,装配式混凝土剪力墙结构住宅施工图解,PDF版...
  11. 大数据开发,如何发掘数据的关系?
  12. 诺基亚PC套件界面设计
  13. 速途在线沙龙11期:王通夫唯首次聚首共话SEO
  14. 宝来客:结婚率创新低,黄金珠宝销售受影响
  15. 内边距(padding)
  16. 完整的rk3288调试记录
  17. OPA 论坛为流程控制设备接口扩展了开放性、互操作性标准 - 第一部分
  18. 结对编程实况录像-2022北航软工
  19. 碱性干电池的内阻测试方法_碱性锌锰干电池电极反应式 锌锰干电池原理是什么【详细介绍】...
  20. 业务需求近期准备深度学习下SpringCloud为加深印象提高学习效果故做此笔记以备后面复习查看之用

热门文章

  1. 按下enter键禁止页面刷新
  2. crontab基本命令
  3. 歌词数据解析、歌词滚动、歌词进度控制功能的实现(基于js-base64、lyric-parser、better-scroll),以vue项目为例
  4. 推荐系统-基于矩阵分解的LFM模型
  5. WebSocket + Spring消息推送服务的快速实现
  6. Codeforces Round #168 (Div. 2)---A. Lights Out
  7. 如何用四个月搞定java?
  8. 虚拟机 搭建LVS + DR + keepalived 高可用负载均衡
  9. MySQL5 基础语法与操作
  10. Java程序优化之享元模式