用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基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
python3大文件解压和基本操作
Dec 15 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 Python
Python使用贪婪算法解决问题
Oct 22 Python
django使用xadmin的全局配置详解
Nov 15 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 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
文件系统基本操作类
2006/11/23 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
用php解析html的实现代码
2011/08/08 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
python函数局部变量用法实例分析
2015/08/04 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
党章学习思想汇报
2014/01/14 职场文书
百日安全生产活动总结
2014/07/05 职场文书
入党培养人考察意见
2015/06/08 职场文书
工作简历的自我评价
2019/05/16 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
MySQL 四种连接和多表查询详解
2021/07/16 MySQL