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


前提条件

我的上一篇博文里面讲解了,发送邮件必须的条件。这里同样是适用的。大致就是要开启邮箱的SMPT/POP服务等等。如果不明白,可以看看发送纯文本邮件。里面讲的还不错。 :-)

核心知识点

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

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

  1. \# 首先是xlsx类型的附件
  2. xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())
  3. xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
  4. msg.attach(xlsxpart)
  5. \# jpg类型的附件
  6. jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
  7. jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
  8. msg.attach(jpgpart)
  9. \# mp3类型的附件
  10. mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
  11. mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')
  12. msg.attach(mp3part)

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

完整的代码

  1. # coding:utf-8
  2. # __author__ = 'Mark sinoberg'
  3. # __date__ = '2016/5/26'
  4. # __Desc__ = 实现发送带有各种附件类型的邮件
  5. import urllib, urllib2
  6. import smtplib
  7. from email.mime.multipart import MIMEMultipart
  8. from email.mime.text import MIMEText
  9. from email.mime.application import MIMEApplication
  10. username = '156408XXXXX@163.com'
  11. password = 'XXXXXXXX'
  12. sender = username
  13. receivers = ','.join(['10643XXXX2@qq.com'])
  14. # 如名字所示: Multipart就是多个部分
  15. msg = MIMEMultipart()
  16. msg['Subject'] = 'Python mail Test'
  17. msg['From'] = sender
  18. msg['To'] = receivers
  19. # 下面是文字部分,也就是纯文本
  20. puretext = MIMEText('我是纯文本部分,')
  21. msg.attach(puretext)
  22. # 下面是附件部分 ,这里分为了好几个类型
  23. # 首先是xlsx类型的附件
  24. xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())
  25. xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
  26. msg.attach(xlsxpart)
  27. # jpg类型的附件
  28. jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
  29. jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
  30. msg.attach(jpgpart)
  31. # mp3类型的附件
  32. mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
  33. mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')
  34. msg.attach(mp3part)
  35. ## 下面开始真正的发送邮件了
  36. try:
  37. client = smtplib.SMTP()
  38. client.connect('smtp.163.com')
  39. client.login(username, password)
  40. client.sendmail(sender, receivers, msg.as_string())
  41. client.quit()
  42. print '带有各种附件的邮件发送成功!'
  43. except smtplib.SMTPRecipientsRefused:
  44. print 'Recipient refused'
  45. except smtplib.SMTPAuthenticationError:
  46. print 'Auth error'
  47. except smtplib.SMTPSenderRefused:
  48. print 'Sender refused'
  49. except smtplib.SMTPException,e:
  50. print e.message

验证结果

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

错误总结

我遇到的错误如下:

  1. D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/mail/withappedix.py
  2. Traceback (most recent call last):
  3. File "E:/Code/Python/MyTestSet/mail/withappedix.py", line 51, in <module>
  4. client.sendmail(sender, receivers, msg.as_string())
  5. File "D:\Software\Python2\lib\email\message.py", line 137, in as_string
  6. g.flatten(self, unixfrom=unixfrom)
  7. File "D:\Software\Python2\lib\email\generator.py", line 83, in flatten
  8. self._write(msg)
  9. File "D:\Software\Python2\lib\email\generator.py", line 115, in _write
  10. self._write_headers(msg)
  11. File "D:\Software\Python2\lib\email\generator.py", line 164, in _write_headers
  12. v, maxlinelen=self._maxheaderlen, header_name=h).encode()
  13. File "D:\Software\Python2\lib\email\header.py", line 410, in encode
  14. value = self._encode_chunks(newchunks, maxlinelen)
  15. File "D:\Software\Python2\lib\email\header.py", line 370, in _encode_chunks
  16. _max_append(chunks, s, maxlinelen, extra)
  17. File "D:\Software\Python2\lib\email\quoprimime.py", line 97, in _max_append
  18. L.append(s.lstrip())
  19. AttributeError: 'list' object has no attribute 'lstrip'
  20. 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模块探秘 Smtplib发送带有各种附件的邮件的更多相关文章

  1. Python模块探秘之smtplib,实现纯文本邮件的发送

    今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了.下面来谈一谈我的这段经历. 配置你的邮箱 为什么要配置邮箱呢?具体要配置什么呢? 因为 ...

  2. Android 调用系统Email发送带多附件的邮件

    转自:http://www.open-open.com/lib/view/open1347005126912.html 众所周知,在Android中调用其他程序进行相关处理,都是使用的Intent.当 ...

  3. Python模块探秘之EasyGui

    在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使 ...

  4. 【selenium+Python unittest】之发送带中文附件的邮箱

    完整原码如下: import smtplib from email.mime.text import MIMEText #from email.header import Header from em ...

  5. python模块:网络协议和支持

    python模块:网络协议和支持 webbrowser 调用浏览器显示html文件 webbrowser.open('map.html') [webbrowser - Convenient Web-b ...

  6. 在zabbix中实现发送带有图片的邮件和微信告警

    1 python实现在4.2版本zabbix发送带有图片的报警邮件 我们通常收到的报警,都是文字,是把动作中的消息内容当成了正文参数传给脚本,然后邮件或者微信进行接收,往往只能看到当前值,无法直观的获 ...

  7. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  8. 使用JavaMail发送带附件的邮件

    所需jar包 链接:http://pan.baidu.com/s/1dFo4cDz 密码:akap 工具类: package com.javamail.utils; import java.util. ...

  9. python:利用smtplib模块发送邮件

    自动化测试中,测试报告一般都需要发送给相关的人员,比较有效的一个方法是每次执行完测试用例后,将测试报告(HTML.截图.附件)通过邮件方式发送. 参考代码:send_mail.py 一.python对 ...

随机推荐

  1. 51nod 1686 第k大区间

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  2. 修改表单元素中placeholder属性样式、清除IE浏览器中input元素的清除图标和眼睛图标

    一.修改input元素placeholder属性样式 在做项目的时候,一般表单元素的placeholder属性样式都是使用浏览器默认的,但有时候为了追求设计上的美感需要修表单元素的placeholde ...

  3. PHP中利用DOM创建xml文档

    DOM创建xml文档 用dom创建如下文档: <booklist> <book id="1"> <title>天龙八部</title> ...

  4. C语言作业程序设计第一次作业

    1.求圆面积和面积 (1)题目: 输入圆的半径,计算圆的周长和面积 (2)流程图: (3)测试数据及运行结果 测试数据:r=4 运行结果: (4)实验分析 没有遇到问题 2.判断闰年问题 (1)题目: ...

  5. teachable-machine:探索机器学习如何工作,浏览器中实时浏览

    教学机器是一个实验,让所有人都非常方便的探索机器学习,在浏览器中实时浏览,不需要编程.学习更多实验,然后亲自尝试它 访问:https://teachablemachine.withgoogle.com ...

  6. 用 ConfigMap 管理配置 - 每天5分钟玩转 Docker 容器技术(159)

    Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap. ConfigMap 的创建和使用方式与 Secret 非常类 ...

  7. Java正则过滤

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class LongStringtonumber { pu ...

  8. Hibernate给表和字段设置前后缀及分隔符

    在<一口一口吃掉Hibernate(一)--使用SchemaExport生成数据表>中介绍了如何生成数据表.但是这只是最基本的.hibernate在生成或者操作数据库时,会受一些限制.比如 ...

  9. Java数据库开发(一)之——JDBC连接数据库

    一.MySQL数据库 1.创建数据库 CREATE DATABASE jdbc CHARACTER SET 'utf8'; 2.建表 CREATE TABLE user ( id int(10) NO ...

  10. 如何找回Oracle所有用户丢失的密码

    如何找回Oracle所有用户丢失的密码: 方法一:1.以操作系统验证的方式登录 SQL>conn / as sysdba; 2.查看系统中的用户名. SQL>select USERNAME ...