前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python发送邮件(二)——smtplib模块和email模块

python发送邮件(二)——smtplib模块和email模块

原创
作者头像
Elsa_111
修改2021-07-27 18:10:39
4K0
修改2021-07-27 18:10:39
举报
文章被收录于专栏:Elsa的学习笔记

一、模块介绍

1、smtplib 模块(用于邮件的发送)

①理论解释

代码语言:javascript
复制
 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
  • 通过这个语句,可以向SMTP服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有的参数都是可选的。
  • host:smtp服务器主机名
  • port:smtp服务的端口,默认是25;端口号可以省略。

但是使用25号端口有一个问题,就是保密性不够好,数据都是明文传输,没有加密。 现在一般都推荐使用SSL,Secure Socket Layer,465是默认的SMTP over SSL的端口号,

  • 如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器 smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致

②smtplib.SMTP提供的方法:

  • SMTP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。也可以用来设置debug信息的显示级别,设置后,会将与SMTP服务器交互时的信息往来打印出来,

设置参数2smtp_server.set_debuglevel(2)有每条交互信息的时间显示;

设置参数1smtp_server.set_debuglevel(1)没有时间显示。

代码语言:javascript
复制
# SMTP对应的端口号是25
# 三个参数分别是(服务器,端口,超时时间)。超时时间是可选的,设置了之后,如果超时,抛出socket.timeout异常
smtp = smtplib.SMTP('smtp.qq.com',25,timeout=3)            
smtp.set_debuglevel(2)
smtp.noop()    # noop是一个命令,它什么都不做
smtp.quit()   # 断开连接
代码语言:javascript
复制
# SMTP_SSL对应的端口号是465
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465, timeout=3)
smtp.set_debuglevel(2)
smtp.noop()
smtp.quit()
代码发了一个noop操作,服务器回应OK,什么都不干,最后使用quit函数断开连接
代码发了一个noop操作,服务器回应OK,什么都不干,最后使用quit函数断开连接
  • SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。
代码语言:javascript
复制
smtp = smtplib.SMTP()
smtp.set_debuglevel(2)
smtp.connect('smtp.qq.com')
smtp.noop()
smtp.quit()
  • SMTP.docmd(cmd[, argstring]):向smtp服务器发送指令。可选参数argstring表示指令的参数。
  • SMTP.helo([hostname]) :使用"helo"指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。
  • SMTP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
  • SMTP.verify(address) :判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
  • SMTP.login(user, password) :登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。
代码语言:python
代码运行次数:0
复制
# 通过SMTP登录SMTP服务器
smtp = smtplib.SMTP('smtp.qq.com')
smtp.set_debuglevel(2)
smtp.login('qqnumber@qq.com', 'password')
smtp.quit()
代码语言:python
代码运行次数:0
复制
# 通过SMTP_SSL登录SMTP服务器
smtp = smtplib.SMTP_SSL('smtp.qq.com')
smtp.set_debuglevel(2)
smtp.login('qqnumber@qq.com', 'password')
smtp.quit()
  • SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

sendmail函数,需要结合email模块的内容,一起使用

  • SMTP.quit() :断开与smtp服务器的连接,相当于发送"quit"指令。

2、email模块(用于邮件的配置)

①理论解释

一封Email邮件,不仅仅是有一些字符串组成的内容,它是一个结构,有收件人,发件人,抄送名单,邮件主题等等。

要组织好这样一个结构,我们才能发送邮件。而组织Email邮件内容结构的任务,不属于smtplib模块范围,我们需要用到email模块(标准库中的模块)提供的一些工具,比如这些库

代码语言:javascript
复制
from email.header import Header    # 用来对Email标题进行编码
from email.mime.text import MIMEText # 负责构造文本
from email.mime.image import MIMEImage  # 负责构造图片
from email.mine.multiprt import MIMEMultipart  # 负责将多个对象集合起来
from email.mime.base import MIMEBase # 添加附件的时候用到
from email.utils import parseaddr, formataddr
  • parseaddr:将带姓名的Email格式作为参数,给parseaddr函数,得到name姓名和addr纯email
  • formataddr:将name和addr转换成标准Email地址格式
代码语言:javascript
复制
To = 'mylove<babylove@qq.com>'
name, addr = parseaddr(To)
分别查看name和addr里面放了什么内容
分别查看name和addr里面放了什么内容
代码语言:javascript
复制
toaddr = formataddr((Header(name,'utf-8').encode(), addr))  # name要经过Header函数的编码
查看经过formataddr处理过后的内容
查看经过formataddr处理过后的内容
  • 注意:sendmail函数是不使用编码后的,带姓名的Email地址字符串的,而是使用纯Email地址
代码语言:javascript
复制
# 补充一个函数小工具,它合并了 parseaddr和formataddr功能,输入以(发件人/收件人的昵称<xxxxx@163.com>)编写的Email地址,得到直接可以在MIMEText中使用字符串
    def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(), addr))

②使用方法

class email.mime.message.MIMEMessage(_msg[, _subtype]):具体的一个message实例,使用方法如下:

代码语言:javascript
复制
msg=mail.Message.Message()#一个实例
msg['to']='XXX@XXX.com'#发送到哪里
msg['from']='YYY@YYYY.com'#自己的邮件地址
msg['date']='2012-3-16'#时间日期
msg['subject']='hello world'#邮件主题

class email.mime.text.MIMEText(_text[, _subtype[, _charset]]):MIME文本对象;其中

_text是邮件内容,

_subtype是邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件),

_charset是编码,可以是gb2312等等,一般是utf-8


二、使用方法

1、发送一封文本邮件

代码语言:javascript
复制
# 函数小工具
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
    
# 配置发件人/收件人
from_addr = input('From: ')
password = input('Password: ')
to_addr = input('To: ')
smtp_server = input('SMTP server: ')

# 配置邮件信息
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')# 邮件内容, 格式, 编码
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)# 发送方
msg['To'] = _format_addr('管理员 <%s>' % to_addr) # 收件方
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode() # 邮件主题
# Header 函数,用来对Email标题进行编码,将邮件标题转换成了标准Email格式


# 配置服务器,并发送邮件
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
# msg调用了自己的 as_string() 函数,将整个Email内容结构转换成字符串再发送.
# as_string函数运行后,得到的就是一封Base64编码的Email邮件
server.quit()
  • 注意:msg 是MIMEText对象,不是一个dict对象,因此在某些循环发送Email的代码中,msg对象不能重复使用,如果只是修改msg['To']的值,想将相同的Email信息发送给不同的人,这样操作是不行的
  • 正确的方式是:重新创建一个新的MIMEText对象
收到的邮件信息
收到的邮件信息

2、一封邮件发给多个人

代码语言:python
代码运行次数:0
复制
msg_str = 'this is a test email sending by python'
msg = MIMEText(msg_str, 'plain', 'utf-8')
msg['From'] = 'from@qq.com'
msg['To'] = 'to1@qq.com,to2@qq.com' # msg['To']的值包含多个Email地址,用逗号隔开;
msg['Subject'] = Header('python email test', 'utf-8').encode()
smtp = smtplib.SMTP_SSL('smtp.qq.com')
smtp.login('from@qq.com', 'passwd')
# sendmail函数的第2个参数,是一个list。这样就实现了将邮件发给多个人,这多个收件人,都在收件人列表中
smtp.sendmail('from@qq.com', ['to1@qq.com','to2@qq.com'], msg.as_string())
smtp.quit()

3、抄送邮件

msg['Cc']来装抄送列表。注意sendmail的第2个参数,这个参数是一个所有收件人的 list(列表),收件人和抄送人都在一个list里面。如果想添加多个Cc地址,在Msg['Cc']中用逗号将地址隔开,并且所有的地址都要在sendmail的第2个参数中

代码语言:python
代码运行次数:0
复制
msg_str = 'this is a test email with Cc addr'
msg = MIMEText(msg_str, 'plain', 'utf-8')
msg['From'] = 'from@qq.com'
msg['To'] = 'toaddr@qq.com' 
msg['Cc'] = 'ccaddr@163.com'
msg['Subject'] = Header('test Cc addr', 'utf-8').encode()
smtp = smtplib.SMTP_SSL('smtp.qq.com')
smtp.login('from@qq.com', 'passwd')
smtp.sendmail('from@qq.com', ['toaddr@qq.com','ccaddr@163.com'], msg.as_string())
smtp.quit()

4、密送邮件

密送,就是收件人在邮件的头部(To和Cc地址)看不到自己的地址,但是还是收到了邮件。所有To和Cc地址中的收件人,都看不到密送地址。要实现密送,只需要在sendmail函数中,将密送地址加入第2个参数的list即可。

代码语言:python
代码运行次数:0
复制
msg_str = 'this is a test email with Cc addr'
msg = MIMEText(msg_str, 'plain', 'utf-8')
msg['From'] = 'from@qq.com'
msg['To'] = 'toaddr@qq.com' 
msg['Cc'] = 'ccaddr@163.com'
msg['Subject'] = Header('test Cc addr', 'utf-8').encode()
smtp = smtplib.SMTP_SSL('smtp.qq.com')
smtp.login('from@qq.com', 'passwd')
smtp.sendmail('from@qq.com', ['toaddr@qq.com','ccaddr@163.com','bccaddr@gmail.com'], msg.as_string())
# toaddr和ccaddr的收件人,都不会知道bccaddr的存在
smtp.quit()

5、发送HTML邮件

发送HTML邮件,只有一个地方与上面讲的不同,就是在创建MIMEText对象的时候,使用html参数

代码语言:javascript
复制
msg_str = '<html><body><h1>Hello</h1>' +
    '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
    '</body></html>'
msg = MIMEText(msg_str, 'html', 'utf-8')
收到的邮件内容
收到的邮件内容

6、发送带图片附件的邮件

带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可

  • 方法一
代码语言:python
代码运行次数:0
复制
# 添加附件就是加上一个MIMEBase,从本地读取一个图片
# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('/Users/michael/Downloads/test.png', 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'png', filename='test.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='test.png')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)
# 然后,按正常发送流程把msg(注意类型已变为MIMEMultipart)发送出去,就可以
收到的邮件信息
收到的邮件信息
  • 方法二
代码语言:javascript
复制
# 运用MIMEimage发送图片(是以附件的形式发送的)

    msg = MIMEMultipart()# 构建MIMEMultipart对象来代表邮件本身,可以往里面添加文本、图片、附件等
    
    # 设置邮件信息
    msg['From'] = "XXX@XXX.com"
    msg['To'] = "YYY@YYY.com"
    msg['Subject'] = "hello world"
    txt = MIMEText("这是中文的邮件内容哦", 'plain', 'gb2312')
    msg.attach(txt)
    
    # 设置图片信息
    file1 = "D:\Pictures\保存\笔_1.png"
    image = MIMEImage(open(file1, 'rb').read())
    image.add_header('Content-Disposition','attachment',filename = "图片.png")# 加上必要的头信息,解决中文附件名乱码
    image.add_header('Content-ID','<0>')
    msg.attach(image)
    
    # 配置服务器并发送邮件
    server = smtplib.SMTP()
    server.connect('smtp.XXX.com')
    server.login('XXX', 'XXXXXX')
    server.sendmail(msg['From'], msg['To'], msg.as_string())
    server.quit()

image.add_header('Content-Disposition','attachment',filename ="图片.png")这句话是必须要的

  • Content-Disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件
  • Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名

Content-Disposition属性有两种类型:inline 和 attachment

  • inline :将文件内容直接显示在页面
  • attachment:弹出对话框让用户下载

7、发送包含各种附件形式的邮件

代码语言:javascript
复制
try:
        msg =  MIMEMultipart()
        msg['From'] = _format_addr('信息化工程所 <%s>' % from_addr)
        msg['To'] = _format_addr('收件人 <%s>' % to_addr)
        msg['Subject'] = Header('邮件的主题:问候', 'utf-8').encode()
        # 邮件正文是MIMEText:
        msg.attach(MIMEText('发送多附件邮件...', 'plain', 'utf-8'))

        #---这是附件部分---
        #xlsx类型附件
        part = MIMEApplication(open(r'./file/foo.xlsx','rb').read())
        part.add_header('Content-Disposition', 'attachment', filename="foo.xlsx")
        msg.attach(part)

        #jpg类型附件
        part = MIMEApplication(open(r'./file/图片.png','rb').read())
        part.add_header('Content-Disposition', 'attachment', filename=('gbk', '', '图片.png'))
        msg.attach(part)

        #pdf类型附件
        part = MIMEApplication(open(r'./file/foo.pdf','rb').read())
        part.add_header('Content-Disposition', 'attachment', filename="foo.pdf")
        msg.attach(part)

        # #mp3类型附件
        # part = MIMEApplication(open('foo.mp3','rb').read())
        # part.add_header('Content-Disposition', 'attachment', filename="foo.mp3")
        # msg.attach(part)

        server = smtplib.SMTP(smtp_server, 25,timeout=30)
        # server.set_debuglevel(1) # 记录详细信息
        server.login(from_addr, password) # 登录邮箱服务器
        server.sendmail(from_addr, to_addr, msg.as_string()) # 发送信息
        server.quit()
        print("带图片邮件发送成功!")
except Exception as e:
        print("发送失败:" + e)


8、发送正文带图片的邮件

  • 直接在HTML邮件中链接图片地址的方法是不可行的,因为大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站
  • 要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,就给它们依次编号,然后引用不同的cid:x
  • 把上面代码加入MIMEMultipartMIMETextplain改为html,然后在适当的位置引用图片
代码语言:javascript
复制
msg.attach(MIMEText('<html><body><h1>Hello</h1>' +
    '<p><img src="cid:0"></p>' +
    '</body></html>', 'html', 'utf-8'))

9、加密SMTP发送

  • 某些邮件服务商,例如Gmail,提供的SMTP服务必须要加密传输。我们来看看如何通过Gmail提供的安全SMTP发送邮件
  • 加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件,所以也可以直接用SMTP_SSL链接
代码语言:python
代码运行次数:0
复制
smtp_server = 'smtp.gmail.com'
smtp_port = 587   # Gmail的SMTP端口是587
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
#只需要在创建SMTP对象后,立刻调用starttls()方法,就创建了安全连接。
#后面的代码和前面的发送邮件代码完全一样
server.set_debuglevel(1)


三、示例

1、完整示例——图片插入在正文

完整使用示例,但是这里有一个问题,暂时还未解决:在正文中插入图片之后,原来设置的正文的内容会被覆盖掉,不能够展示出来,还待优化

代码语言:python
代码运行次数:0
复制
# 导入库和相关方法
import os
import smtplib
from email import encoders
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import parseaddr, formataddr


# 函数小工具
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))


"""
设置邮箱域名、发件人邮箱、邮箱授权码、收件人邮箱
"""
# SMTP服务器,这里使用qq邮箱
mail_host = "smtp.qq.com"
# 发件人邮箱
mail_sender = "xxxxx@qq.com"
# 邮箱授权码,注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程
mail_license = "dqjmiaxuzepiibeg"
# 收件人邮箱,可以为多个收件人
mail_receivers = ["xxxxx@163.com", "xxxxx@qq.com"]

"""
构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
"""
mm = MIMEMultipart('related')

"""
设置邮件大体框架
"""
# 邮件主题
subject_content = """Python邮件多功能测试"""
# 设置发送者,<>里面的邮箱为发件人的邮箱账号
mm["From"] = "汤布力不<xxxxx@qq.com>"
# 设置接收者,<>里面的邮箱为收件人的邮箱账号
mm["To"] = _format_addr("玛卡巴卡<xxxxx@qq.com>")
# 设置邮件主题
mm["Subject"] = Header(subject_content, 'utf-8')

"""
添加邮件正文内容
"""
# 先以添加附件的方式,从本地读取一个图片:
with open(r'D:\Pictures\保存\笔_1.png', 'rb') as f:
    mime = MIMEBase('image', 'png', filename='图片.png')  # 设置附件的MIME和文件名,这里是png类型:
    mime.add_header('Content-Disposition', 'attachment', filename=('gbk', '', '图片.png'))  # 加上必要的头信息,解决中文附件名乱码
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    mime.set_payload(f.read())  # 把附件的内容读进来:
    encoders.encode_base64(mime)  # 用Base64编码:
    mm.attach(mime)  # 添加到MIMEMultipart:

# 正文展示图片和一个链接
mm.attach(MIMEText('<html><body><h1>图片测试</h1>' +
                   '<p><img src="cid:0"></p>' +
                   '<p>这是一个<a href="https://www.runoob.com/python3/python3-tutorial.html">Python3</a>的菜鸟教程</p>' +
                   '</body></html>', 'html', 'utf-8'))
"""
添加附件(excel表格)
"""
# 构造附件
atta = MIMEText(open('sample.xlsx', 'rb').read(), 'base64', 'utf-8')
# 设置附件信息
atta["Content-Disposition"] = 'attachment; filename="sample.xlsx"'
# 添加附件到邮件信息当中去
mm.attach(atta)

# 测试是否能正常发送邮件
try:
    # 发送邮件
    # 创建SMTP对象
    stp = smtplib.SMTP_SSL(mail_host, 465)
    # SMTP_SSL通信的端口是465
    # stp.connect()
    # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
    # stp.set_debuglevel(1)
    # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码
    stp.login(mail_sender, mail_license)
    # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str
    stp.sendmail(mail_sender, mail_receivers, mm.as_string())
    # 关闭SMTP对象
    stp.quit()
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)
收到的邮件效果
收到的邮件效果

2、完整示例——图片当作附件发送

这个方法能够展示出正文的内容

代码语言:python
代码运行次数:0
复制
# 导入库和相关方法
import os
import smtplib
from email import encoders
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import parseaddr, formataddr

# 函数小工具
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))


"""
设置邮箱域名、发件人邮箱、邮箱授权码、收件人邮箱
"""
# SMTP服务器,这里使用qq邮箱
mail_host = "smtp.qq.com"
# 发件人邮箱
mail_sender = "xxxxx@qq.com"
# 邮箱授权码,注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程
mail_license = "dqjmiaxuzepiibeg"
# 收件人邮箱,可以为多个收件人
mail_receivers = ["xxxxx@qq.com","xxxxx@yeah.net"]

"""
构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
"""
mm = MIMEMultipart('related')

"""
设置邮件大体框架
"""
# 邮件主题
subject_content = """Python邮件多功能测试"""
# 设置发送者,<>里面的邮箱为发件人的邮箱账号
mm["From"] = "汤布力不<xxxxx@qq.com>"
# 设置接收者,<>里面的邮箱为收件人的邮箱账号
mm["To"] = _format_addr("玛卡巴卡<xxxxx@qq.com>")
# 设置邮件主题
mm["Subject"] = Header(subject_content, 'utf-8')

"""
添加邮件正文的文本内容
"""
# 邮件正文内容
body_content = "这是正文测试部分!"
# 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式
message_text = MIMEText(body_content, "plain", "utf-8")
mm.attach(message_text)

# 添加图片
# 二进制读取图片
image_data = open('D:\Pictures\保存\笔_1.png','rb')
# 设置读取获取的二进制数据
message_image = MIMEImage(image_data.read())
# 关闭刚才打开的文件
image_data.close()
# 设置显示的图片名
message_image.add_header('Content-Disposition','attachment',filename = "图片.png")# 加上必要的头信息,解决中文附件名乱码
message_image.add_header('Content-ID','<0>')
# 添加图片文件到邮件信息当中去
mm.attach(message_image)

# 添加附件(excel表格)
# 构造附件
atta = MIMEText(open('sample.xlsx', 'rb').read(), 'base64', 'utf-8')
# 设置附件信息
atta["Content-Disposition"] = 'attachment; filename="sample.xlsx"'
# 添加附件到邮件信息当中去
mm.attach(atta)

# 测试是否能正常发送邮件
try:
    # 发送邮件
    # 创建SMTP对象
    stp = smtplib.SMTP_SSL(mail_host, 465)
    # SMTP_SSL通信的端口是465
    # stp.connect()
    # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
    # stp.set_debuglevel(1)
    # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码
    stp.login(mail_sender, mail_license)
    # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str
    stp.sendmail(mail_sender, mail_receivers, mm.as_string())
    # 关闭SMTP对象
    stp.quit()
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)

收到的邮件效果
收到的邮件效果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、模块介绍
    • 1、smtplib 模块(用于邮件的发送)
      • ①理论解释
      • ②smtplib.SMTP提供的方法:
    • 2、email模块(用于邮件的配置)
      • ①理论解释
      • ②使用方法
  • 二、使用方法
    • 1、发送一封文本邮件
      • 2、一封邮件发给多个人
        • 3、抄送邮件
          • 4、密送邮件
            • 5、发送HTML邮件
              • 6、发送带图片附件的邮件
                • 7、发送包含各种附件形式的邮件
                  • 8、发送正文带图片的邮件
                    • 9、加密SMTP发送
                    • 三、示例
                      • 1、完整示例——图片插入在正文
                        • 2、完整示例——图片当作附件发送
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档