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

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

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

企业退信的错误码对照表

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

(0)

相关推荐

  • python smtplib模块发送SSL/TLS安全邮件实例

    python的smtplib提供了一种很方便的途径发送电子邮件.它对smtp协议进行了简单的封装. smtp协议的基本命令包括: HELO 向服务器标识用户身份 MAIL 初始化邮件传输 mail from: RCPT 标识单个的邮件接收人:常在MAIL命令后面,可有多个rcpt to: DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束 VRFY 用于验证指定的用户/邮箱是否存在:由于安全方面的原因,服务器常禁止此命令 EXPN 验证给定的邮箱列表是否

  • python使用电子邮件模块smtplib的方法

    Smptp类定义:smtplib.SMTP(host[,port[,local_hostname[,,timeout]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登陆,校验,发送,退出等.host参数为远程smtp主机地址,比如stmp.163.com;port为连接端口,默认为25:local_hostname的作用是在本地的FQDN(完整的域名)发送HELO/EHLO指令,timeout为连接或尝试在多数秒超时,SMTP类具有

  • 用smtplib和email封装python发送邮件模块类分享

    复制代码 代码如下: #!/usr/bin/python# encoding=utf-8# Filename: send_email.pyfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMEText  import smtplib class SendEmail:    # 构造函数:初始化基本信息    def __

  • Python使用poplib模块和smtplib模块收发电子邮件的教程

    poplib模块接收邮件 python的poplib模块是用来从pop3收取邮件的,也可以说它是处理邮件的第一步. POP3协议并不复杂,它也是采用的一问一答式的方式,你向服务器发送一个命令,服务器必然会回复一个信息.pop3命令码如下: 命令 poplib方法 参数 状态 描述 ----------------------------------------------------------------------------------------------- USER user use

  • python中使用smtplib和email模块发送邮件实例

    SMTP模块 这么多已定义的类中,我们最常用的的还是smtplib.SMTP类,就具体看看该类的用法:smtp实例封装一个smtp连接,它支持所有的SMTP和ESMTP操作指令,如果host和port参数被定义,则smtp会在初始化期间自动调用connect()方法,如果connect()方法失败,则会触发SMTPConnectError异常,timeout参数设置了超时时间.在一般的调用过程中,应该遵connetc().sendmail().quit()步骤. SMTP模块主要方法 下面我们来

  • python使用smtplib模块通过gmail实现邮件发送的方法

    本文实例讲述了python使用smtplib模块通过gmail实现邮件发送的方法.分享给大家供大家参考.具体实现方法如下: import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText fromaddr = 'fromaddr@gmail.com' toaddr = 'toaddr@gmail.com' text = 'test email message sent

  • 举例详解Python中smtplib模块处理电子邮件的使用

    在基于互联网的应用中,程序经常需要自动地发送电子邮件.如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册:当用户忘记登陆密码的时候,通过邮件来取回密码.smtplib模块是python中smtp(简单邮件传输协议)的客户端实现.我们可以使用smtplib模块,轻松的发送电子邮件.下面的例子用了不到十行代码来发送电子邮件: #coding=gbk import smtplib smtp = smtplib.SMTP() smtp.connect("smtp.yeah.net",

  • Python使用smtplib模块发送电子邮件的流程详解

    1.登录SMTP服务器 首先使用网上的方法(这里使用163邮箱,smtp.163.com是smtp服务器地址,25为端口号): import smtplib server = smtplib.SMTP('smtp.163.com', 25) server.login('j_hao104@163.com', 'password') Traceback (most recent call last): File "C:/python/t.py", line 192, in <modu

  • Python基于smtplib实现异步发送邮件服务

    基于smtplib包制作而成,但在实践中发现一个不知道算不算是smtplib留的一个坑,在网络断开的情况下发送邮件时会抛出一个socket.gaierror的异常,但是smtplib中并没有捕获这个异常,导致程序会因这个异常终止,因此代码中针对这部分的异常进行处理,确保不会异常终止. #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Zoa Chou' # see http://www.mudoom.com/Article/s

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

    这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须的条件.这里同样是适用的.大致就是要开启邮箱的SMPT/POP服务等等. 核心知识点 因为今天主要讲解的是如何发送带有附件的邮件,那么核心肯定是附件了.怎么才能发附件呢? 其实我们换个思路,就不难理解了.因为我们发送邮件,经过了应用层–>> 传输层–>> 网络层–>>数据链

  • python requests 库请求带有文件参数的接口实例

    有些接口参数是一个文件格式,比如fiddler 抓包参数如下显示 这个接口的 form-data fiddler 显示的和不带文件参数的接口有明显区别,显示的不是简单的键值对,所以我们也不能只通过 data给接口传参,需要再value为<file>的参数通过 files传参 data = { "CSRFName": "CSRFName", "CSRFToken": "CSRFToken", "import

  • PHPMailer发送HTML内容、带附件的邮件实例

    PHPMailer是一个封装好的PHP邮件发送类,支持发送HTML内容的电子邮件,以及可以添加附件发送,并不像PHP本身mail()函数需要服务器环境支持,您只需要设置邮件服务器以相关信息就能实现邮件发送功能. 本文将结合实例代码,讲解如何设置和实现发送HTML以及带附件的邮件功能. 首先,您可以到PHPMailer获取最新的下载包,解压到WEB目录下. 然后建立一个sendmail.php的文件,载入PHPMailer类,并设置相关属性参数,如邮件服务器地址,发件人和收件人,邮件内容等等,详情

  • python email smtplib模块发送邮件代码实例

    本例使用 QQ邮箱测试,需要打开 QQ邮箱的 smtp协议,获取授权码 代码内容如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ __author__ = 'junxi' import smtplib from email.mime.text import MIMEText # 文本模式 # msg = MIMEText('send by python...', 'plain', 'utf-8') # html 格式 msg = MIMEText(

  • Python中Django发送带图片和附件的邮件

    最近需要做集团的SRC系统.暂无安全研发,所以只能找我这个小菜兼职开发.系统使用Django框架,在整个过程中,有许多奇特的需求.在某项需求中,需要给厂商用户发送富文本邮件,漏洞详情,这个折腾了一下,感觉略有收获,所以记一篇随笔. 首先我在网上搜索了一些资料,发现都是python通过smtplib发送,使用MIME格式来生成富文本邮件:传送门 我想的是,使用Django框架,框架带了邮件模块,没必要引入smtplib吧.我就想,向上文传送门那样,生成一个MIME文件,然后通过 from djan

  • java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

  • python基于SMTP发送QQ邮件

    python基于SMTP发送QQ邮件,供大家参考,具体内容如下 第一步: 1.打开qq邮箱,开启smtp服务 2.验证密保 3.获取授权码 python代码里面使用 在Python中, smtplib模块提供了丰富的邮件发送接口,只要设置smtp服务器和端口,输入账号密码登陆,就可以使用邮件发送的接口. import smtplib from email.mime.text import MIMEText from email.header import Header sender='send@

  • python如何发送带有附件、正文为HTML的邮件

    一.HTML格式怎么发送右键 1.准备HTML代码作为内容 2.把邮件的subtype设置为html 3.发送 4.举个例子:自己发给自己一个HTML格式的文件 from email.mime.text import MIMEText ​ main_content = """ <!DOCTYPE html> <html lang = "en" <head> <meta charset = "UTF-8"

  • python smtplib发送带附件邮件小程序

    最近经常需要出一些临时性的报表,于是就用python 的smtplib 和email 两模块写了个小程序,当数据处理完后通过邮箱把报表文件从服务器上发送出来! 程序名称:sendMail_func.py #!/usr/bin/env python # -*- coding:utf-8 -*- import os import sys import time import smtplib from email import encoders from email.mime.text import

  • python实现发送带附件的邮件代码分享

    具体代码如下: from django.template import loader from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header import smtplib import traceback class SendEmail(object):     """     发送html邮件    

随机推荐