用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小脚本查询同ip网站
May 08 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python批量修改图片大小的方法
Jul 24 Python
python list格式数据excel导出方法
Oct 31 Python
详解Python中is和==的区别
Mar 21 Python
django celery redis使用具体实践
Apr 08 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
Python入门Anaconda和Pycharm的安装和配置详解
Jul 16 Python
Python 中判断列表是否为空的方法
Nov 24 Python
python str字符串转uuid实例
Mar 03 Python
python3 kubernetes api的使用示例
Jan 12 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创建Cookie数组的详解
2013/07/03 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
Ionic快速安装教程
2016/06/03 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
高中生学习生活的自我评价
2013/11/27 职场文书
学校文明单位申报材料
2014/05/06 职场文书
推荐信格式范文
2014/05/09 职场文书
建材投资建议书
2014/05/16 职场文书
小学课改工作总结
2015/08/13 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL