这里有新鲜出炉的 Python 入门,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
本篇文章主要介绍了 Python 实现 Smtplib 发送带有各种附件的邮件实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这两天对 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
验证结果
没有什么比来张图片更有说服力的了。如图
错误总结
我遇到的错误如下:
- 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'])。
也许,你遇到的错误不是我这个,那么也不用担心,我这里有一份比较齐全的错误码对照表。你可以对照着你的错误码来查找具体的错误原因。这样有的放矢,效率会更高一点的。
在编码的过程中,我也是遇到了很多意想不到的错误。而这些错误的错误码对我们来说是很有用的。这对我们测试代码以及找到其中出错的原因和有帮助。
企业退信的错误码对照表
来源: http://www.phperz.com/article/17/0705/336420.html