目录

创建Smtp对象

Smtp类中的方法

MIME

MIMEBase

MIMEBase

MIMEMultipart

MIMEApplication

MIMEAudio

MIMEImage

MIMEText

实例

text+html格式

发送带图片附件的邮件

发送带附件的邮件

含多种格式


SMTP模块

SMTP 简单传输协议,它是一组用于由源地址 到 目的地址的 邮件传输规则;

python可以发送纯文本邮件(HTML邮件)、带附件的邮件、以及图片、音频的邮件等;

email模块:负责构建邮件;  smtplib模块:负责发送邮件

创建Smtp对象

import smtplibsmtpObj  = smtplib.SMTP( [host [, 25 [, local_hostname]]] )
# smtpObj = smtplib.SMTP_SSL( [host [, 994 [, local_hostname]]] )

参数说明:
host:  SMTP 服务器主机。 你可以指定主机的ip地址 或者 域名,如: runoob.com,这个是可选参数。

port:  如果你提供了host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。

local_hostname:  如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

###示例一: smtp = smtplib.SMTP()smtp.connect( [host [ , port]] )        # 连接远程smtp方法,host为远程主机地址,port为smtp端口,默认25;# 也可使用host:port形式来表示. 如:SMTP.connect("smtp.163.com","25")smtp.starttls()                         # 开启安全传输模式smtp.login("test@arcvideo.com","pwd")   # 邮箱账号登录校验smtp.sendmail(FROM, [ TO ], BODY)       # 邮件发送smtp.quit()                             # 断开smtp连接###示例二:
smtp = smtplib.SMTP( [host [ , port]] )smtp.login("test@arcvideo.com","pwd")   # 邮箱账号登录校验smtp.set_debuglevel(1)                  # 打印出和SMTP服务器交互的所有信息。smtp.sendmail(FROM, [TO], BODY)         # 邮件发送smtp.quit()                             # 断开smtp连接smtp中sendmail方法:SMTP.sendmail( from_addr, to_addrs, msg [, mail_options, rcpt_options] )  # from_addr: 发件人地址。to_addrs: 收件人地址(是字符串列表 形式)。msg: 发送消息的内容 【 msg.as_string()  】eg: smtp.sendmail( sender, receivers , msg.as_string() ) 注意:msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg 的格式。这个格式就是 smtp 协议中定义的格式。

Smtp类中的方法

MIME

通过邮件传输简单的文本已经无法满足我们的需求,比如我们时常会定制业务质量报表,在邮件主体中会包含 HTML、图像、声音以及附件格式等,MIME(Multipurpose Internet Mail

Extensions,多用途互联网邮件扩展)作为一种新的扩展邮件格式很好地补充了这一点。

示例:msg.add_header('Content-ID','imgid')                                           # 设置图片ID【图片在正文中可用】msg.add_header('Content-Disposition','attachment',filename='test.xlsx')        # 为附件添加标题(没有这行,附件名称乱码)msg.add_header('Content-Disposition','attachment',filename=('utf-8','','中文标题'))   # 添加非ASCII字符时需指定编码
【图片本来在正文中,但是若加了上边2行之一,则正文中的图片 会跑到附件中。因为上边2行是专门为"附件" 服务的】eg:
msg_img.add_header('Content-ID', '<0>')msg_img.add_header('Content-Disposition', 'attachment', filename="a4.jpg")           
email.header.Header ( s=None , charset=None ):创建一个可以包含不同字符集中的字符串,并符合MIME的标头。
可选参数: s是初始标题值默认为None, 可以使用append()方法追加到标题,charset指定字符集
from email.header import Header
msg['From'] = Header( "测试邮件来自" , 'utf-8' )附加工具:email.utilsemail.utils.localtime(dt=None):返回当前时间,dt参数为datetime实例email.utils.formataddr(pair,charset='utf-8'):pair是一个元祖或列表,返回分割的标题与地址 如邮箱收件人昵称和邮箱账号示例:
from email.utils import formataddr
msg['From'] = formataddr( ['zhangsan' , 'wyh1942049307@163.com' ] )
msg['To']   = formataddr( ['Anybody' , '92066@163.com'] )

MIMEBase

Message

+- MIMEBase

+- MIMEMultipart

+- MIMENonMultipart

+- MIMEMessage

+- MIMEText

+- MIMEImage

如果只有一个html超文本正文 或者 plain普通文本正文的话,一般msg的类型可以是MIMEText;

如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。

msg.attach ( MIMEText对象 或 MIMEImage对象 ):

将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。

MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。

以上的构造的文本,超文本,附件,图片都可以添加到MIMEMultipart('mixed')中

MIMEBase

这是所有MIME特定类的基类

email.mime.base.MIMEBase (_maintype,_subtype,*,policy = compat32,** _ params) :

_maintpe是Content-Type主要类型(text  or image)

_subtype是Content-Type次要类型(plain or gif)

_params是一个键值字典参数直接传递给Message.add_header

示例:
filename1 = '图片.pdf'
attachfile_base = MIMEBase('application', 'octet-stream')      # 创建基础对象指定类型
attachfile_base.set_payload (open(filename,'rb').read() )      # 设置我有效负载# 设置文件名可用中文【若没有下边add_header(), 则附件中图片不能正常显示】
attachfile_base.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename1))   #为附件添加一个标题
attachfile_base.add_header('Content-Disposition', 'attachment', filename=filename1 .encode('UTF-8'))encoders.encode_base64(attachfile_base)
msg.attach(attachfile_base)                                     # 附加对象加入到msg

MIMEMultipart

带多个部分邮件(与附件相关)

作用是生成包含多个部分邮件体的MIME对象

email.mime.multipart.MIMEMultipart( _subtype='mixed', boundary= None, _subparts = None, *, policy = compat32, ** _ params ):

_subtype 指定要添加到"Content-type:multipart/subtype" 报头的可选的三种子类型,分别为         mixed、related、alternative,默认值为 mixed。

mixed  构建带附件的邮件;(向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型)

related 构建内嵌资源的邮件体;(内嵌图片、声音等资源)

alternative 则实现构建纯文本(text/plain) 与 超文本(text/html) 共存的邮件体;

_subparts是有效负载的一系类初始部分,可以使用attach()方法将子部件附加到消息中。

示例:
from email.mime.multipart import MIMEMultipartmsg1 = MIMEMultipart('mixed') 等效于msg = MIMEMultipart( )  # 创建带附件的实例msg2 = MIMEMultipart('related')       # 创建内嵌资源的实例(如:在正文html中 内嵌图片)msg3 = MIMEMultipart('alternative')   # 创建纯文本与超文本实例# 创建一个带附件的实例msg = MIMEMultipart()     # 等价于 msg = MIMEMultipart('mixed') 默认值为mixted ,创建带附件的实例msg['Subject'] = subject  # MIMEMultitext() 与 MIMEMultipart() 时,均可以这样msg['From'] = sendermsg['To'] = receivers

MIMEApplication

消息对象应用

被用来表示主要类型的MIME消息对象应用

email.mime.application.MIMEApplication( _data, _subtype='octet-stream', _encoder=email.encoders.encode_base64, *, policy=compat32, **_params ):

_data是一个包含原始字节数据的字符串;

_subtype指定MIME子类型默认为八位字节流;

_encoder是一个可调用函数,它执行传输数据的实际编码,使用set_payload()将有效载荷改为编码形式,默认编码位base64,可使用email.encoders模块查看内置编码表。

示例:
filename = 'abc.pdf'with open(filename,'rb') as f:attachfile = MIMEApplication( f.read() )attachfile.add_header('Content-Disposition', 'attachment', filename=filename)msg.attach(attachfile)  # 附加对象加入到msg

MIMEAudio

创建包含音频数据的邮件体

email.mime.audio.MIMEAudio ( _audiodata [, _subtype [, _encoder]] ):

_audiodata 包含原始二进制音频数据的字节字符串;

_subtype音频类型;

_encoder编码。

示例:
from email.mime.audio import MIMEAudiomsgaudio = MIMEAudio( open('yishengsuoai.mp3','rb').read() , 'plain' )             # 文本音频对象,plain是默认。
msgaudio.add_header('Content-Disposition','attachment',filename='text.mp3') #扩展标题类型,文件名msg.attach(msgaudio)  

MIMEImage

MIMENonMultipart中的一个子类,创建包含图片数据的邮件体

email.mime.image.MIMEImage ( _imagedata [ , _subtype [ , _encoder [ , **_params]]] ):

_imagedata 是包含原始图片数据的字节字符串;

_sutype    指定图像子类型;

_encoder   指定一个函数内部编码默认为:email.encoders.encode_base64默认为base64编码;

示例:
from email.mime.image import MIMEImage with open('test.png','rb') as fp:msgImage = MIMEImage( fp.read() ) msgImage.add_header('Content-ID','imgid')  # 为图片对象拓展标题字段和值msg.attach(msgImage)                       # 将图像负载添加到msg负载

MIMEText

文本  html格式邮件

MIMENonMultipart中的一个子类,创建包含文本数据的邮件体

email.mime.text.MIMEText ( _text [ , _subtype [ , _charset]] ):

_text 要发送的文本字符串内容;

_subtype 指定文本类型,支持 plain(默认值为txt格式) 或 html类型的字符串。发送HTML格式的时候,修改为html,但同时要求msg的内容也是html的格式;【注意:html格式的,就是放在MIMEText中的

_charset设置字符集,参数接收一个charset实例;

示例:
from email.mime.text import MIMEText# 创建文本内容的邮件体
msg = MIMEText( "python test email" , 'plain' , 'utf-8' )# 创建HTML格式的邮件体
msg = MIMEText( "<p>python test email</p><p><a href="http://www.demo.com">链接</a></p>" , 'html' , 'utf-8' )# 构造TEXT格式的消息
msg = MIMEText ("hello.text","plain","utf-8")msg["Subject"] = "xxxxx"  # 主题msg["From"] = "xxxx"      # 发送者msg["To"] = "xxxx"        # 接收者
msg["Cc"] = "xxxx"        # 抄送#注意:发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。
msg.sendmail( "发件人","收件人" , msg.as_string )

实例

text+html格式

import smtplib
from email.mime.text import MIMEText
from email.header import Headersender = 'xxx@163.com'passwd = 'abcdefg'                                   receivers = '123456789@qq.com'  subject = 'python发邮Html格式测试'  content = "<html><h1>人生苦短,何必执着</h1></html>"msg = MIMEText(content, 'html', 'utf-8')msg['Subject'] = Header(subject , 'utf-8') # msg['Subject'] = subjectmsg['From'] = Header('hello', 'utf-8')     # msg['From'] = sender , 发件人为:hello#msg['From'] = '詹姆斯'                     # 可以固定写死(也可以为空)msg['To'] = Header('emmmm', 'utf-8')       # msg['To'] = receivers , 收件人为:emmmm   #msg['To'] = '湖人队'try:smtp = smtplib.SMTP('smtp.163.com', 25)smtp.login(sender, passwd)smtp.sendmail(sender, receivers, msg.as_string())print('发送成功')except:                                    # 或 except Exeception as e:print('发送失败')

发送带图片附件的邮件

import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartsender = 'xxx@163.com'passwd = 'abcdefg'receivers = '123456789@qq.com'subject = 'python发邮带img的邮件测试'# 创建一个带附件的实例
msg = MIMEMultipart() # 等价于 msg = MIMEMultipart('mixed') 默认值为mixted ,创建带附件的实例msg['Subject'] = subjectmsg['From'] = sendermsg['To'] = receivers# 创建正文
msg.attach( MIMEText('使用python smtplib模块和email模块自动发送邮件测试', 'plain', 'utf-8') )# 创建图片附件
import osimg_file = open("/Users/benmu/Desktop/库里.jpg", 'rb').read()#img_file = open(os.getcwd()+"/a4.jpg",'rb').read() # 获取项目中的 a4.jpg图片
msg_img = MIMEImage(img_file)#没有下边2行,接收邮件端,的附件图片不能正常显示
msg_img.add_header('Content-Disposition', 'attachment', filename="a4.jpg")   #为附件添加标题(没有这行,附件名称乱码)msg_img.add_header('Content-ID', '<0>')msg.attach(msg_img)    # 附加对象加入到msgtry:s = smtplib.SMTP('smtp.163.com', 25)s.set_debuglevel(1)  # 输出发送邮件详细过程s.login(sender, passwd)s.sendmail(sender, receivers, msg.as_string())print('发送成功')except:print('发送失败')

发送带附件的邮件

模版(xlsx、csv、jpg、mp3)

下方替换的模版【各个部分一组合,就是发送多个附件】

###xlsx类型的附件【筛选、固定宽度、冻结首行;多sheet页这些; 原样发过去,格式、数据都不变】[也可发送zip文件]xlsx = MIMEApplication( open('/Users/benmu/Desktop/挂数200条.xlsx', 'rb' ).read() )      # 改为挂数200条.csv也可以xlsx.add_header('Content-Disposition', 'attachment', filename='挂数200条.xlsx')         # 为附件添加标题xlsx["Content-Type"] = 'application/octet-stream'mes.attach(xlsx)或# 读取xls文件作为附件,open()要带参数'rb',使文件变成二进制格式,从而使'base64'编码产生作用,否则附件打开乱码
att = MIMEText( open("/Users/benmu/Desktop/挂数200条.xlsx", 'rb' ).read(), 'base64', 'GB2312' )att.add_header('Content-Disposition','attachment',filename='挂数200条.xls')att['Content-Type'] = 'application/vnd.ms-excel'mes.attach(att)### jpg类型的附件
jpgpart = MIMEApplication( open('/Users/benmu/Desktop/库里.jpg', 'rb').read() )jpgpart.add_header('Content-Disposition', 'attachment', filename='库里.jpg')mes.attach( jpgpart )或fp = open('/Users/benmu/Desktop/库里.jpg', 'rb')msgImage = MIMEImage(fp.read())fp.close()msgImage.add_header('Content-Disposition', 'attachment', filename='库里.jpg')mes.attach(msgImage)### mp3类型的附件
mp3part = MIMEApplication(open('/Users/benmu/Desktop/大数据时代下数据可视化技术.m4a', 'rb').read())mp3part.add_header('Content-Disposition', 'attachment', filename='大数据时代下数据可视化技术.m4a')mes.attach(mp3part)
####带“多个”附件##### 构造附件1,传送当前目录下的 test.txt 文件
att_annex1 = MIMEText(open('/Users/benmu/Desktop/test.txt', 'rb').read(), 'base64', 'utf-8')att_annex1["Content-Type"] = 'application/octet-stream'att_annex1["Content-Disposition"] = 'attachment; filename="test.txt"'mes.attach(att_annex1)# 构造附件2,传送当前目录下的 test2.txt 文件
att_annex2 = MIMEText(open('/Users/benmu/Desktop/runoob.txt', 'rb').read(), 'base64', 'utf-8')att_annex2["Content-Type"] = 'application/octet-stream'att_annex2["Content-Disposition"] = 'attachment; filename="runoob.txt"'mes.attach(att_annex2)

含多种格式

import os
import smtplib
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email import encoders# 遍历桌面文件夹 中 文件
files ='/Users/benmu/Desktop/my_test'  # 附件中内容都在桌面的my_test文件夹中filenames = [os.path.join(files, f) for f in os.listdir(files) ]  #os.listdir()返回指定文件夹下的"所有文件和文件夹",保存到列表中sender = 'xxx@163.com'receivers = ['123456789@qq.com']passwd = 'abcdefg'subject = 'Python SMTP 邮件测试'content = MIMEText('测试发送数据:')mes = MIMEMultipart( )  # 创建带附件的实例mes.attach(content)     # 正文内容mes['From'] = Header("詹姆斯", 'utf-8')  # MIMEMultitext() 与 MIMEMultipart() 时,均可以这样mes['To'] = Header("湖人队", 'utf-8')mes['Subject'] = Header(subject, 'utf-8')for file in filenames:a = file.rfind('/')file_name = file[a+1:]       # 截取后获得文件名if file_name !='.DS_Store':  # 过滤掉以.DS_Store结尾的文件【不知哪来的】#print(file_name)        # 打印文件夹中 文件名【可去掉】part = MIMEBase('application', 'octet-stream') # 必须是使用MIMEBasepart.set_payload(open(file, 'rb').read())encoders.encode_base64(part)part.add_header('Content-Disposition', 'attachment', filename='%s' % file_name) mes.attach(part)try:smtp = smtplib.SMTP('smtp.163.com',25)smtp.login(sender, passwd)smtp.sendmail(sender, receivers, mes.as_string())print("邮件发送成功")except Exception as e:   # 或 except smtplib.SMTPException as e:print( '失败原因:' , str(e) )finally:smtp.quit()

结果:

Smtplib之发邮件模块相关推荐

  1. python发送邮件并返回提示_用python3的smtplib库发邮件一直返回无法发送邮件提示,是什么原因?...

    按照网上python3发邮件的教程,在jupyter运行都返回发送失败提示,是缺少了什么环境吗? 代码应该没问题,不过还是贴出来: # import smtplib # from email.mime ...

  2. python 自动发邮件模块抄送_一个python的邮件发送脚本,自动,定时,可以附件发送,抄送...

    #mail.py使用方法: 1,本脚本同目录下文件介绍: sender.list:邮件发送者邮箱和密码,第一行账号(如example@example.com),第二行密码(必须项,不能为空) rece ...

  3. Python 用smtplib库发邮件报错:[WinError 10061] 由于目标计算机积极拒绝,无法连接。解决办法

    看了菜鸟的教程,有这段代码: mail = smtplib.SMTP("localhost") 然后就报错了.菜鸟的教程太老了,Python迭代这么快,根本跟不上. 把这个里面的参 ...

  4. notes邮件正文显示不全_python实现一次性批量发邮件

    在上次实现了批量修改文件名后(链接:https://zhuanlan.zhihu.com/p/133727520),又拿来了同事编写的一次性批量发邮件小程序,小编每月向分公司发数据任务算是基本上实现了 ...

  5. python发邮件详解,smtplib和email模块详解

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  6. python是什么邮箱_python发邮件详解,smtplib和email模块详解

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  7. python发邮件详解 -- smtplib和email模块

    文章目录 python发邮件详解,-->smtplib和email模块 1.python发邮件所需要的基础包 2.smtplib的用法 3.email模块的详细理解和使用 A.MIMEText对 ...

  8. python 发邮件_Python发邮件告别smtplib,迎接zmail

    之前介绍过smtplib发邮件代码,直到今天仍有人在这里遇到问题.而且代码复杂,解释起来很麻烦,今天给大家介绍一个新的发邮件方法--zmail zmail的优势 自动填充头信息 将一个字典映射为ema ...

  9. python自动发邮件报554错误_python3 使用smtplib发送邮件错误554

    python3使用smtplib和MIME发送邮件失败 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18from smtplib import SMTP ...

最新文章

  1. 详解携程与去哪儿的“去携之战”
  2. 2021年春季学期-信号与系统-第六次作业参考答案-第一小题
  3. python教学研究_Python程序设计课程教学研究
  4. 分布式事务中间件 Fescar - 全局写排它锁解读
  5. 计算机专业英语书本笔记,英语语言学概论笔记《全集》.doc
  6. Exchange企业实战技巧(27)邮件中使用数字签名和邮件加密功能
  7. 利用反射对dao层进行重写
  8. 软件测试工程师和WGT,软件系统测试(WGT)工程师---ATK
  9. linux系统函数 utime,utime函数
  10. paip.提升安全性---WEB程序安全检测与防范
  11. 调整数组使奇数全部都位于偶数前面
  12. 机器学习实战 KNN实战
  13. Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法
  14. 使用GitHub搭建个人博客
  15. NVIDIA GPU Compute Capability
  16. 关于INTERVAL 函数的使用
  17. java2017期末考试,2017年java考试模拟试卷(2)
  18. node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制
  19. 可视化项目使用vw/vh布局进行适配
  20. URL定义、格式、常见协议

热门文章

  1. Java 实现上传文件到共享文件夹,创建文件夹到共享文件夹
  2. 三角计算机器应用试卷,2015年职称计算机考试WPS_Office考前测试题及答案
  3. 用代码打出登录_百度小程序商城用百家号能免费开通,如何操作?
  4. Excel2002制作自动记录的单位考勤表(转)
  5. 苹果ipad颜色失真,变得和底片一样,怎么调
  6. Element el-table 等表格组件超出隐藏(show-overflow-tooltip)按需展示且可鼠标移入
  7. .net软件开发脚本规范V1.0
  8. 详解JPA 2.0动态查询机制:Criteria API
  9. PS里, 制作BMP 4Bit索引格式方法
  10. 清华学霸讲计算机,清华学霸超强履历引膜拜 程序猿:这是学神啊