用Python实现一个简单的能够发送带附件的邮件程序的教程


Posted in Python onApril 08, 2015

基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。
在python中,MIME的这些对象的继承关系如下。
MIMEBase
    |-- MIMENonMultipart
        |-- MIMEApplication
        |-- MIMEAudio
        |-- MIMEImage
        |-- MIMEMessage
        |-- MIMEText
    |-- MIMEMultipart
一般来说,不会用到MIMEBase,而是直接使用它的继承类。MIMEMultipart有attach方法,而MIMENonMultipart没有,只能被attach。
MIME有很多种类型,这个略麻烦,如果附件是图片格式,我要用MIMEImage,如果是音频,要用MIMEAudio,如果是word、excel,我都不知道该用哪种MIME类型了,得上google去查。
最懒的方法就是,不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。
application/octet-stream表明“这是个二进制的文件,希望你们那边知道怎么处理”,然后客户端,比如qq邮箱,收到这个声明后,会根据文件扩展名来猜测。

下面上代码。
假设当前目录下有foo.xlsx/foo.jpg/foo.pdf/foo.mp3这4个文件。
 

import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.mime.application import MIMEApplication 
_user = "sigeken@qq.com" 
_pwd = "***" 
_to  = "402363522@qq.com" 
  
#如名字所示Multipart就是分多个部分 
msg = MIMEMultipart() 
msg["Subject"] = "don't panic" 
msg["From"]  = _user 
msg["To"]   = _to 
  
#---这是文字部分--- 
part = MIMEText("乔装打扮,不择手段") 
msg.attach(part) 
  
#---这是附件部分--- 
#xlsx类型附件 
part = MIMEApplication(open('foo.xlsx','rb').read()) 
part.add_header('Content-Disposition', 'attachment', filename="foo.xlsx") 
msg.attach(part) 
  
#jpg类型附件 
part = MIMEApplication(open('foo.jpg','rb').read()) 
part.add_header('Content-Disposition', 'attachment', filename="foo.jpg") 
msg.attach(part) 
  
#pdf类型附件 
part = MIMEApplication(open('foo.pdf','rb').read()) 
part.add_header('Content-Disposition', 'attachment', filename="foo.pdf") 
msg.attach(part) 
  
#mp3类型附件 
part = MIMEApplication(open('foo.mp3','rb').read()) 
part.add_header('Content-Disposition', 'attachment', filename="foo.mp3") 
msg.attach(part) 
  
s = smtplib.SMTP("smtp.qq.com", timeout=30)#连接smtp邮件服务器,端口默认是25 
s.login(_user, _pwd)#登陆服务器 
s.sendmail(_user, _to, msg.as_string())#发送邮件 
s.close()
Python 相关文章推荐
从零学python系列之数据处理编程实例(二)
May 22 Python
Python中的闭包实例详解
Aug 29 Python
Python中的XML库4Suite Server的介绍
Apr 14 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python实现的堆排序算法示例
Apr 29 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 Python
深入了解Django View(视图系统)
Jul 23 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
如何在pycharm中安装第三方包
Oct 27 Python
Python 创建子进程模块subprocess详解
Apr 08 #Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 #Python
Python使用scrapy抓取网站sitemap信息的方法
Apr 08 #Python
Python中用format函数格式化字符串的用法
Apr 08 #Python
简单介绍Python中的JSON模块
Apr 08 #Python
Python实现把xml或xsl转换为html格式
Apr 08 #Python
Python正则表达式匹配HTML页面编码
Apr 08 #Python
You might like
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
js删除所有的cookie的代码
2010/11/25 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python 字典中的所有方法及用法
2020/06/10 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
cf搞笑广告词
2014/03/14 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书