Python实现Smtplib发送带有各种附件的邮件实例


Posted in Python onJune 05, 2017

这两天对Python的邮件模块比较感兴趣,于是就查了查资料。同时在实际的编码过程中也遇到了各种各样的问题。下面我就来分享一下我与smtplib的故事。

前提条件

我的上一篇博文里面讲解了,发送邮件必须的条件。这里同样是适用的。大致就是要开启邮箱的SMPT/POP服务等等。

核心知识点

因为今天主要讲解的是如何发送带有附件的邮件,那么核心肯定是附件了。怎么才能发附件呢?

其实我们换个思路,就不难理解了。因为我们发送邮件,经过了应用层?>> 传输层?>> 网络层?>>数据链路层?>>物理层。这一系列的步骤,全都变成了比特流了。所以无论是纯文本,图片,亦或是其他类型的文件。在比特流的面前,都是平等的。所以我们发送附件,也是按照发送纯文本的模式来做就行,只不过加上一些特殊的标记即可。

\# 首先是xlsx类型的附件
xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
msg.attach(xlsxpart)

\# jpg类型的附件
jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
msg.attach(jpgpart)

\# mp3类型的附件
mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')
msg.attach(mp3part)

经过这三小段的代码,想必你已经很清楚了吧。无非就是使用MIMEApplication进行包装一下,然后设置一下内容。最后添加到邮件内容。就是这几步,就搞定了。

完整的代码

# coding:utf-8

#  __author__ = 'Mark sinoberg'
#  __date__ = '2016/5/26'
#  __Desc__ = 实现发送带有各种附件类型的邮件

import urllib, urllib2
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

username = '156408XXXXX@163.com'
password = 'XXXXXXXX'
sender = username
receivers = ','.join(['10643XXXX2@qq.com'])

# 如名字所示: Multipart就是多个部分
msg = MIMEMultipart()
msg['Subject'] = 'Python mail Test'
msg['From'] = sender
msg['To'] = receivers

# 下面是文字部分,也就是纯文本
puretext = MIMEText('我是纯文本部分,')
msg.attach(puretext)

# 下面是附件部分 ,这里分为了好几个类型

# 首先是xlsx类型的附件
xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
msg.attach(xlsxpart)

# jpg类型的附件
jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
msg.attach(jpgpart)

# mp3类型的附件
mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')
msg.attach(mp3part)

## 下面开始真正的发送邮件了
try:
  client = smtplib.SMTP()
  client.connect('smtp.163.com')
  client.login(username, password)
  client.sendmail(sender, receivers, msg.as_string())
  client.quit()
  print '带有各种附件的邮件发送成功!'
except smtplib.SMTPRecipientsRefused:
  print 'Recipient refused'
except smtplib.SMTPAuthenticationError:
  print 'Auth error'
except smtplib.SMTPSenderRefused:
  print 'Sender refused'
except smtplib.SMTPException,e:
  print e.message

验证结果

没有什么比来张图片更有说服力的了。如图

Python实现Smtplib发送带有各种附件的邮件实例

错误总结

我遇到的错误如下:

D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/mail/withappedix.py
Traceback (most recent call last):
 File "E:/Code/Python/MyTestSet/mail/withappedix.py", line 51, in <module>
  client.sendmail(sender, receivers, msg.as_string())
 File "D:\Software\Python2\lib\email\message.py", line 137, in as_string
  g.flatten(self, unixfrom=unixfrom)
 File "D:\Software\Python2\lib\email\generator.py", line 83, in flatten
  self._write(msg)
 File "D:\Software\Python2\lib\email\generator.py", line 115, in _write
  self._write_headers(msg)
 File "D:\Software\Python2\lib\email\generator.py", line 164, in _write_headers
  v, maxlinelen=self._maxheaderlen, header_name=h).encode()
 File "D:\Software\Python2\lib\email\header.py", line 410, in encode
  value = self._encode_chunks(newchunks, maxlinelen)
 File "D:\Software\Python2\lib\email\header.py", line 370, in _encode_chunks
  _max_append(chunks, s, maxlinelen, extra)
 File "D:\Software\Python2\lib\email\quoprimime.py", line 97, in _max_append
  L.append(s.lstrip())
AttributeError: 'list' object has no attribute 'lstrip'

Process finished with exit code 1

我的解决办法是

receiver parameter was list type. either it should be list converted to string using join method or if it is a single recipient, then pass it as a string only

是的,就是receivers = ','.join(['10XXXXXXXX@qq.com'])。这样就搞定了。

也许,你遇到的错误不是我这个,那么也不用担心,我这里有一份比较齐全的错误码对照表。你可以对照着你的错误码来查找具体的错误原因。这样有的放矢,效率会更高一点的。

在编码的过程中,我也是遇到了很多意想不到的错误。而这些错误的错误码对我们来说是很有用的。这对我们测试代码以及找到其中出错的原因和有帮助。

企业退信的错误码对照表 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现自动更换ip的方法
May 05 Python
python简单猜数游戏实例
Jul 09 Python
浅谈Python数据类型之间的转换
Jun 08 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
Python实现端口检测的方法
Jul 24 Python
python执行精确的小数计算方法
Jan 21 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
Python dict的常用方法示例代码
Jun 23 Python
PyQt5的相对布局管理的实现
Aug 07 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
python神经网络 使用Keras构建RNN训练
May 04 Python
python实现的正则表达式功能入门教程【经典】
Jun 05 #Python
Python中easy_install 和 pip 的安装及使用
Jun 05 #Python
详解Python pygame安装过程笔记
Jun 05 #Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 #Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 #Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 #Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 #Python
You might like
PHP与MySQL交互使用详解
2006/10/09 PHP
PHP中for循环语句的几种变型
2006/11/26 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
PHP 日常开发小技巧
2009/09/23 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
vue axios用法教程详解
2017/07/23 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
信息技术专业个人自我评价
2013/12/11 职场文书
图书馆标语
2014/06/19 职场文书
师德师风整改措施
2014/10/24 职场文书
Nginx的基本概念和原理
2022/03/21 Servers
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js