用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切片用法实例教程
Sep 08 Python
python使用nntp读取新闻组内容的方法
May 08 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Python装饰器原理与用法分析
Apr 30 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python系列 文件操作的代码
Oct 06 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
Python通过Schema实现数据验证方式
Nov 12 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
jquery使用经验小结
2015/05/20 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
python模块之re正则表达式详解
2017/02/03 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
python opencv实现证件照换底功能
2019/08/19 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
财务主管自我鉴定
2014/01/17 职场文书
房屋租赁意向书
2014/04/01 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
学生会主席演讲稿
2014/04/25 职场文书
感恩的演讲稿
2014/05/06 职场文书
小区推广策划方案
2014/06/06 职场文书
校园文化标语
2014/06/18 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
辞职信格式范文
2015/05/13 职场文书
黄埔军校观后感
2015/06/10 职场文书
回复函范文
2015/07/14 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏