python模块之email: 电子邮件编码

转载自:http://www.cnblogs.com/sislcb/archive/2008/12/01/1344861.html

用email模块来生成邮件也是很简单的,只是需要一些mime的基础知识。下面看看一点mime基础。
MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体。邮件头与邮件体之间以空行进行分隔。这点可以用文本编辑器(比如记事本)查看一个邮件的源文件就可以清除看到。outlook和foxmail自己就有查看源文件的功能。
  邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的。
  邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。最常见的类型有text/plain(纯文本)和text/html(超文本)。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。从它们的名称,不难推知这些类型各自的含义和用处。它们之间的层次关系可归纳为下图所示:

可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义 multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。生成邮件就是要生成这各个MIME部分。email模块对这些处理都是包装好的,看看生成方法:

 1 #-*- encoding: gb2312 -*-
 2
 3 import email
 4 import string, sys, os, email
 5 import time
 6
 7 class MailCreator:
 8     def __init__(self):
 9         # 创建邮件的message对象
10         self.msg = email.Message.Message()
11         self.mail = ""
12
13     def create(self, mailheader, maildata, mailattachlist=[]):
14         # mailheader 是dict类型,maildata是list, 且里面第一项为纯文本类型,第二项为html.
15         # mailattachlist 是list, 里面为附件文件名
16         if not mailheader or not maildata:
17             return
18
19         for k in mailheader.keys():
20             # 对subject要作特殊处理,中文要转换一下。
21             # 比如 "我的一个测试邮件" 就要转换为 =?gb2312?b?ztK1xNK7uPay4srU08q8/g==?=
22             if k == ‘subject‘:
23                 self.msg[k] = email.Header.Header(mailheader[k], ‘gb2312‘)
24             else:
25                 self.msg[k] = mailheader[k]
26         # 创建纯文本部分
27         body_plain = email.MIMEText.MIMEText(maildata[0], _subtype=‘plain‘, _charset=‘gb2312‘)
28         body_html = None
29         # 创建html部分,这个是可选的
30         if maildata[1]:
31             body_html = email.MIMEText.MIMEText(maildata[1], _subtype=‘html‘, _charset=‘gb2312‘)
32
33
34         # 创建一个multipart, 然后把前面的文本部分和html部分都附加到上面,至于为什么,可以看看mime相关内容
35         attach=email.MIMEMultipart.MIMEMultipart()
36         attach.attach(body_plain)
37         if body_html:
38             attach.attach(body_html)
39         # 处理每一个附件
40         for fname in mailattachlist:
41             attachment=email.MIMEText.MIMEText(email.Encoders._bencode(open(fname,‘rb‘).read()))
42             # 这里设置文件类型,全部都设置为Application.当然也可以是Image,Audio什么的,这里不管那么多
43             attachment.replace_header(‘Content-type‘,‘Application/octet-stream;name="‘+os.path.basename(fname)+‘"‘)
44             # 一定要把传输编码设置为base64,因为这里默认就是用的base64
45             attachment.replace_header(‘Content-Transfer-Encoding‘, ‘base64‘)
46             attachment.add_header(‘Content-Disposition‘,‘attachment;filename="‘+os.path.basename(fname)+‘"‘)
47             attach.attach(attachment)
48         # 生成最终的邮件
49         self.mail = self.msg.as_string()[:-1] + attach.as_string()
50
51         return self.mail
52
53 if __name__ == ‘__main__‘:
54     mc = MailCreator()
55     header = {‘from‘: ‘[email protected]‘, ‘to‘:‘[email protected]‘, ‘subject‘:‘我的一个测试邮件‘}
56     data = [‘plain text information‘, ‘<font color="red">html text information</font>‘]
57     if sys.platform == ‘win32‘:
58         attach = [‘c:\windows\clock.avi‘]
59     else:
60         attach = [‘/bin/cp‘]
61
62     mail = mc.create(header, data, attach)
63
64     f = open("test.eml", "wb")
65     f.write(mail)
66     f.close()

这里我自己封装了一个类来做处理,大体的过程就是:
1. 先创建message对象: email.Message.Message()
2. 创建MIMEMultipart对象:email.MIMEMultipart.MIMEMultipart()
3. 创建各个MIMEText对象,并把他们attach到MIMEMultipart里,这里的MIMEText其实不仅仅是text, 也包括image, application, audio等等。
4. 生成最终邮件。

时间: 2024-08-08 03:22:33

python模块之email: 电子邮件编码的相关文章

Python使用SMTP模块、email模块发送邮件

smtplib模块: 主要通过SMTP类与邮件系统进行交互.使用方法如下: 1.实例化一个SMTP对象: s = smtplib.SMTP(邮件服务地址,端口号) s = smtplib.SMTP_SSL(邮件服务地址,端口号) 2.登陆邮件,权限验证: s.login(用户名,密码) 3.发送邮件: s.sendmail(发件人邮箱,收件人邮箱,发送内容) 4.断开连接: s.close() email模块: email模块:支持发送的邮件内容为纯文本.HTML内容.图片.附件.email模块

python的邮件模块smtplib&email

import smtplib import string from email.mime.text import MIMEText def send_mail(host, sender, sender_passwd, receiver, content_file, port="25"):     # print "create smtp object"     server = smtplib.SMTP()     # print "conncect sm

Python模块、字符编码、文件读写

模块 当我们用一种语言开始真正的软件开发室,除了编写代码外,还需要很多基本的已经写好的现成的东西,高级语言通常都会为我们提供了一个比较完善的基础代码库,让我们能直接调用,python也不例外,为我们提供了分成完善的基础代码和第三方库.在python中一个.py文件就是一个模块. 模块导入使用import 获取随机数模块 调用系统命令 把执行脚本时传递的参数获取到了 当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错,默认情况下,Python解释器会搜

python 模块介绍 - Base16, Base32, Base64 数据编码

简介 功能:RFC 3548: Base16, Base32, Base64 数据编码.转换二进制数据为适合明文协议传输的 ASCII 序列.转换8bits 为每个字节包含 6,5 或 4bits 的有效数据,比如 SMTP, URL 的一部分或者 HTTP POST 的一部分.参考:RFC 3548.编码算法不同于 uuencode.类型:标准库相关模块:uu, binhex, uu, quopri Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法.由于 2 的 6 次方

Python学习日志之Python模块

Python入门学习笔记之Python模块 Python模块: 一.认识Python模块 1.什么是模块 函数是可以实现一项或多项功能的一段程序.我们的模块是函数功能的扩展,模块是可以实现一项或多项功能的程序块.从定义可以看出:函数是一段程序,模块是一项程序块,也就是说函数,模块都是用来实现功能的,但是模块范围要广,在模块里可以重用多个函数 2.如何导入模块 在Python程序中如果要使用某个模块,不能直接使用某个模块的功能.在模块使用之前,我们需要先导入指定模块,只要导入模块后我们才能使用 >

python模块介绍

adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:连接MySQL数据库的py2exe:用来生成windows可执行文件Pylons:我们领导推荐的web frameworkpysql

常用的python模块及安装方法

adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:连接MySQL数据库的py2exe:用来生成windows可执行文件Pylons:我们领导推荐的web frameworkpysql

转 《python开发_常用的python模块及安装方法》

http://www.cnblogs.com/hongten/p/hongten_python_more_modules.html adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:

4.python模块

python 字符串 一.注释 在python中的注释分为单行注释和多行注释    (1)单行注释:为在语句的前边加"#" 例子: #!/usr/bin/env python a = 123 print a #print a #print a #print a 执行结果如下: [[email protected] ~]# python a.py 123  (2)多行注释:可以用3对单引号(比如:''' 注释内容''') 或是3对双引号(比如:"""注释内容