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 相关文章推荐
python3解析库pyquery的深入讲解
Jun 26 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
Python字符串的一些操作方法总结
Jun 10 Python
简单介绍python封装的基本知识
Aug 10 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
python函数不定长参数使用方法解析
Dec 14 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
python中return如何写
Jun 18 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 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实现图片缩放功能类
2013/12/18 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
vue实现扫码功能
2020/01/17 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
python实现树形打印目录结构
2018/03/29 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Python如何对齐字符串
2020/07/30 Python
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
《维生素c的故事》教学反思
2014/02/18 职场文书
公司年底活动方案
2014/08/17 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
教师党员个人整改措施
2014/10/27 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python