博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python模块探秘 Smtplib发送带有各种附件的邮件
阅读量:6211 次
发布时间:2019-06-21

本文共 4059 字,大约阅读时间需要 13 分钟。

这两天对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, urllib2import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.application import MIMEApplicationusername = '156408XXXXX@163.com'password = 'XXXXXXXX'sender = usernamereceivers = ','.join(['10643XXXX2@qq.com'])# 如名字所示: Multipart就是多个部分msg = MIMEMultipart()msg['Subject'] = 'Python mail Test'msg['From'] = sendermsg['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.pyTraceback (most recent call last):  File "E:/Code/Python/MyTestSet/mail/withappedix.py", line 51, in 
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'])。这样就搞定了。

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

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

(^__^) 嘻嘻……。这下字体够大了吧。

你可能感兴趣的文章
puppet实战
查看>>
初学者怎样使用Keras进行迁移学习
查看>>
干货满满:Java、前端、PHP等九大系列资料整理,全面总结,推荐收藏 ...
查看>>
python socket传文件
查看>>
“阿里云大数据技术实战训练营”江苏省大学生万人计划学术冬令营活动成功举行...
查看>>
新Kubeflow,新征程 (一):简化部署体验
查看>>
Kubernetes集群高可用的策略和实践
查看>>
Mybatis调用MySQL存储过程
查看>>
CSS(溢出_判断IE版本)
查看>>
阿里面试90%以上会问到的数据结构;HashMap
查看>>
Jdbc模板、事务管理
查看>>
hive 异常 (Attempt to do update or delete on table terminal that does not use an )
查看>>
其实,我是这么学习的
查看>>
对标华为 GPU Turbo,OPPO 推出 Hyper Boost 手机加速引擎
查看>>
行为识别论文笔记之多纤维网络 | ECCV 2018
查看>>
Java序列化 ObjectOutputStream源码解析
查看>>
web设计中那些因素可能影响网站后期优化
查看>>
第十八章:MVVM(三)
查看>>
SAP中使用Function Module创建物料的过程
查看>>
Building a Keras + deep learning REST API(三部曲之一)
查看>>