Python实现Smtplib发送带有各种附件的邮件实例

发布时间 - 2026-01-11 01:43:55    点击率:

这两天对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'])。这样就搞定了。

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

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

企业退信的错误码对照表 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# smtplib  # 发送附件  # python  # 附件  # Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError  # python smtplib发送带附件邮件小程序  # python3模块smtplib实现发送邮件功能  # python3使用smtplib实现发送邮件功能  # python smtplib模块自动收发邮件功能(一)  # python利用smtplib实现QQ邮箱发送邮件  # python使用电子邮件模块smtplib的方法  # Python基于smtplib协议实现发送邮件  # 发送邮件  # 错误码  # 搞定了  # 对照表  # 的是  # 都是  # 我是  # 这一  # 多个  # 有的放矢  # 没有什么  # 感兴趣  # 就行  # 更高  # 更有  # 这对  # 你可  # 你已经  # 很清楚  # 如图 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端网站建设与定制开发一站式解决方案 中企动力  微信小程序制作网站有哪些,微信小程序需要做网站吗?  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何构建满足综合性能需求的优质建站方案?  重庆市网站制作公司,重庆招聘网站哪个好?  使用spring连接及操作mongodb3.0实例  香港服务器租用费用高吗?如何避免常见误区?  简单实现jsp分页  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  IOS倒计时设置UIButton标题title的抖动问题  Python制作简易注册登录系统  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何快速建站并高效导出源代码?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在服务器上三步完成建站并提升流量?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  如何在阿里云部署织梦网站?  如何用PHP快速搭建CMS系统?  制作旅游网站html,怎样注册旅游网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何用IIS7快速搭建并优化网站站点?  大同网页,大同瑞慈医院官网?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何确保FTP站点访问权限与数据传输安全?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何用搬瓦工VPS快速搭建个人网站?  如何挑选最适合建站的高性能VPS主机?  浅谈javascript alert和confirm的美化  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  简历在线制作网站免费版,如何创建个人简历?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Android 常见的图片加载框架详细介绍  敲碗10年!Mac系列传将迎来「触控与联网」双革新  教你用AI润色文章,让你的文字表达更专业  如何在阿里云域名上完成建站全流程?