用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中编写ORM框架的入门指引
Apr 29 Python
Python itertools模块详解
May 09 Python
Python内置模块turtle绘图详解
Dec 09 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
python 猴子补丁(monkey patch)
Jun 26 Python
Python数学形态学实例分析
Sep 06 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
python实现图片,视频人脸识别(opencv版)
Nov 18 Python
教你怎么用Python监控愉客行车程
Apr 29 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
简单采集了yahoo的一些数据
2007/02/14 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
Array对象方法参考
2006/10/03 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
分页栏的web标准实现
2011/11/01 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
JS变量及其作用域
2017/03/29 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
python实现备份目录的方法
2015/08/03 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
Python实现的简单计算器功能详解
2018/08/25 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python小白学习包管理器pip安装
2020/06/09 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
公司口号大全
2014/06/11 职场文书
2015新学期开学寄语
2015/02/26 职场文书
退税申请报告怎么写
2015/05/18 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL