用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中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Python中类的初始化特殊方法
Dec 01 Python
Python Socket使用实例
Dec 18 Python
python web基础之加载静态文件实例
Mar 20 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
Python实现aes加密解密多种方法解析
May 15 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 Python
Python 数据可视化之Seaborn详解
Nov 02 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
Python中IPYTHON入门实例
2015/05/11 Python
python数组复制拷贝的实现方法
2015/06/09 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
详解Python中for循环是如何工作的
2017/06/30 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
python pandas修改列属性的方法详解
2018/06/09 Python
详解Python locals()的陷阱
2019/03/26 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
商务经理岗位职责
2014/08/03 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
使用Springboot实现健身房管理系统
2021/07/01 Java/Android