python使用SMTP发送电子邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
一、发送纯文本邮件
注:以qq邮箱发送邮件为例,使用QQ邮箱发送邮件时,须提前开通SMTP服务,密码输入QQ邮箱的授权码。
使用到email模块中MIMEText构造文本邮件对象,在参数中传入。第一个参数是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。
使用smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。模块中的sendmail实例方法,用于执行邮件发送的工作。它需要三个参数 -
sender - 具有发件人地址的字符串。
receiver - 字符串列表,每个收件人一个。
message - 作为格式如在各种RFC中指定的字符串。
示例代码:
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
# 发送纯文本格式邮件
def send_email_text():
# 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱
smtp_server = 'smtp.qq.com'
sender_qq = '296****177@qq.com'
password = 'wsvh********dcjg'
sender_email = '296****177@qq.com'
receiver = '130****7364@163.com'
# receiver = ['1@123.com','2@123.com','3@123.com'] # 给多人发送邮件,收件人传入列表中,以逗号隔开
# 邮件内容:正文+标题
mail_content = '您好,这是一封使用python登录QQ邮箱发送文本邮件的测试'
mail_title = '文本格式邮件测试'
# 发送邮件:连接smtp服务+登录账号+组装邮件
smtp = SMTP_SSL(smtp_server) # 连接服务器
smtp.ehlo(smtp_server)
smtp.login(sender_qq, password) # 登录账号
msg = MIMEText(mail_content, 'plain', 'utf-8') # 指定邮件正文为纯文本格式,以utf-8编码
msg['Subject'] = Header(mail_title, 'utf-8') # 邮件主题中包含中文,需要通过Header对象进行编码
msg['From'] = sender_email
msg['To'] = receiver
smtp.sendmail(sender_email, receiver, msg.as_string())
smtp.close()
二、发送html格式邮件
发送html格式邮件,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了。
示例代码:
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
# 使用Python发送HTML格式的邮件
def send_email_html(self):
# 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱
smtp_server = 'smtp.qq.com'
sender_qq = '296****177@qq.com'
password = 'wsvh********dcjg'
sender_email = '296****177@qq.com'
receiver = '130****7364@163.com'
# receiver = ['1@123.com','2@123.com','3@123.com'] # 给多人发送邮件
# 邮件内容:正文+标题
# 传入Html格式的邮件内容
mail_content = '<html><body><h2>您好</h2>,<p>这是一封使用python登录QQ邮箱发送文本邮件的测试</p></body></html>'
mail_title = '发送网页格式邮件测试'
# 登录smtp服务器并发送邮件
smtp = SMTP_SSL(smtp_server)
smtp.ehlo(smtp_server) # 由客户端发送,指示 ESMTP 会话开始
smtp.login(sender_qq, password)
msg = MIMEText(mail_content, 'html', 'utf-8')# 构建邮件对象,指定为html格式,以utf-8编码
msg['Subject'] = Header(mail_title, 'utf-8') # 邮件主题中包含中文,需要通过Header对对象进行编码
msg['From'] = sender_email
msg['To'] = receiver
smtp.sendmail(sender_email, receiver, msg.as_string())
smtp.close()
三、发送混合格式(带附件)的邮件
发送带附件格式的邮件,使用到email模块下multipart中的MIMEMultipart方法,构建混合格式邮件对象,构造附件变量对象,再加载附件。
# 使用Python发送带附件的邮件
def send_email_mixture(self, report_file):
# 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱
smtp_server = 'smtp.qq.com'
sender_qq = '296****177@qq.com'
password = 'wsv********lndcjg'
sender_email = '296****177@qq.com'
receiver = '130****7364@163.com'
# receiver = ['1@123.com','2@123.com','3@123.com'] # 给多人发送邮件
# 邮件内容:正文+标题
# 传入Html格式的邮件内容
mail_content = '<html><body><h2>您好</h2>,<p>这是一封使用python登录QQ邮箱发送网页格式带附件邮件的测试</p></body></html>'
mail_title = '发送网页格式带附件的邮件测试'
# 登录smtp服务器并发送邮件
smtp = SMTP_SSL(smtp_server)
smtp.ehlo(smtp_server) # 由客户端发送,指示 ESMTP 会话开始
smtp.login(sender_qq, password)
msg = MIMEMultipart() # 构建混合格式邮件对象
msg.attach(MIMEText(mail_content, 'html', 'utf-8')) # 邮件正文
msg['Subject'] = Header(mail_title, 'utf-8') # 邮件主题中包含中文,需要通过Header对对象进行编码
msg['From'] = sender_email
msg['To'] = receiver
# 加载附件
att = MIMEText(open(report_file, 'rb').read(), 'base64', 'utf-8') # 打开文件并以二进制方式读取,以base64位加密,utf-8编码保存作为附件
att['Content-Type'] = 'application/octet-stream' # 声明附件内容类型
att['Content-Disposition'] = 'attachment; filename="report.html"' # 声明附件描述及附件名称
msg.attach(att)
smtp.sendmail(sender_email, receiver, msg.as_string())
smtp.close()
四、发送HTML文本中带图片的邮件
将图片嵌于邮件中,需要使用到email中的image模块的MIMEImage方法,先构建混合邮件对象并指定指定subtype是alternative,同时兼容HTML和Plain格式。使用MIMEImage方法实例化图片对象,并加载到邮件中。邮件正文HTML内容中添加图片,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。
示例代码:
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from smtplib import SMTP_SSL
from config.cif import *
# 发送HTML文本中带图片的邮件
def send_email_html_img(self, data_file):
# 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱
smtp_server = 'smtp.qq.com'
sender_qq = '296****177@qq.com'
password = 'wsv********lndcjg'
sender_email = '296****177@qq.com'
receiver = '130****7364@163.com'
# receiver = ['1@123.com','2@123.com','3@123.com'] # 给多人发送邮件
# 邮件内容:正文+标题
# 传入Html格式的邮件内容
mail_content = '''
<html><body>
<h2>您好</h2>,
<p>这是一封使用python登录QQ邮箱发送网页格式带图片邮件的测试</p>,
<p>图片演示:</p>,
<p><img src="cid:01"></p>
</body></html>
'''
mail_title = '发送网页格式带图片邮件测试'
# 登录smtp服务器并发送邮件
smtp = SMTP_SSL(smtp_server)
smtp.ehlo(smtp_server) # 由客户端发送,指示 ESMTP 会话开始
smtp.login(sender_qq, password)
msg = MIMEMultipart('alternative') # 同时支持HTML和Plain格式
msg.attach(MIMEText(mail_content, 'html', 'utf-8')) # 构建邮件对象,指定为html格式,以utf-8编码
msg['Subject'] = Header(mail_title, 'utf-8') # 邮件主题中包含中文,需要通过Header对对象进行编码
msg['From'] = sender_email
msg['To'] = receiver
# 指定图片
img = MIMEImage(open(data_file, 'rb').read())
# 定义图片ID
img.add_header('Content-ID', '0')
msg.attach(img)
smtp.sendmail(sender_email, receiver, msg.as_string())
smtp.close()
参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000
https://www.yiibai.com/python/python_sending_email.html
https://www.jianshu.com/p/abb2d6e91c1f