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+django+sql学生信息管理后台开发
Jan 11 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
python2 与 python3 实现共存的方法
Jul 12 Python
python 解压pkl文件的方法
Oct 25 Python
python学生管理系统开发
Jan 30 Python
Python何时应该使用Lambda函数
Jul 02 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
Python爬虫之Selenium实现键盘事件
Dec 04 Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 Python
如何理解及使用Python闭包
Jun 01 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
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
JS 自执行函数原理及用法
2019/08/05 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Python实现扫码工具的示例代码
2020/10/09 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
经典优秀个人求职自荐信格式
2013/09/25 职场文书
自我评价范文
2013/12/22 职场文书
财务会计自荐信范文
2014/02/21 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
清洁工岗位职责
2015/02/13 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
就业意向书范本
2015/05/11 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers