用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之文件的读写和文件目录以及文件夹的操作实现代码
Aug 28 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
python实现搜索文本文件内容脚本
Jun 22 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
django 单表操作实例详解
Jul 30 Python
详解用python生成随机数的几种方法
Aug 04 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python列表推导式实现代码实例
Sep 09 Python
浅析python实现动态规划背包问题
Dec 31 Python
python中%格式表达式实例用法
Jun 18 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+DBM的同学录程序(5)
2006/10/09 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
让您的菜单不离网站
2006/10/03 Javascript
List the Codec Files on a Computer
2007/06/11 Javascript
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
Python去除字符串两端空格的方法
2015/05/21 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
python操作gitlab API过程解析
2019/12/27 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
python 8种必备的gui库
2020/08/27 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
NULL是什么,它是怎么定义的
2015/05/09 面试题
医科大学生的自我评价
2013/12/04 职场文书
介绍信格式
2015/01/30 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python