SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。这里我们就需要用到这个库。其中SMTP支持smtplib
和email
两个模块,其中smtplib
负责发送邮件,email
负责构建邮件,SMTP支持发送纯文本,携带附件和携带图片等功能。
1. 发送HTML格式的邮件
1、首先导入smtplib
模块和email
模块中相应类型
from email.mime.text import MIMEText
from email.header import Header
import smtplib
2、准备发送邮件所需要的参数(服务器,发送者账号,密码,和收件人账号)
smtpserver = 'smtp.qq.com' # 服务器地址
user = '[email protected]' # 发送账号
password = 'xxxxxxxxxxx' # 发送密码
receivers = '[email protected]' # 收件人
subject = 'python 发送邮件' # 邮件标题
mail_msg = r"""
<p>Python 邮件发送测试...</p>
<p><a href="http://www.bilibili.com">这是一个链接</a></p>
"""
3、根据源码内容完成对参数对应填写
message = MIMEText(mail_msg, 'html', 'utf-8') # 发送内容 (文本内容,发送格式,编码格式)
message['From'] = user # 发送地址
message['To'] = receivers # 接受地址
message['Subject'] = subject # 邮件标题
4、通过对smtplib
模块对邮件进行发送
# 创建SMTP对象
smtp = smtplib.SMTP()
# 连接服务器
smtp.connect(smtpserver)
# 登录邮箱账号
smtp.login(user, password)
# 发送账号信息
smtp.sendmail(user, receivers, message.as_string())
# 关闭
smtp.quit()
2. 发送带附件的邮件
我们正常发送邮件的时候可能会携带一些附件,当然这个功能 Python 也可以帮助我们完成,SMTP
中自带的有携带附件的模块。
1、导入email
中的MIMEMultipart
模块
2、准备发送邮件的配置和参数
3、邮件携带的附件
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
smtpserver = 'smtp.qq.com' # 服务器地址
user = '[email protected]' # 发送账号
password = 'XXXXXXXXXXXXXXX' # 发送密码
receivers = '[email protected]' # 收件人
subject = 'python 发送带附件邮件' # 邮件标题
mail_msg = r"""
<p>Python 邮件发送测试...</p>
<p><a href="http://www.bilibili.com">这是一个链接</a></p>
"""
message = MIMEMultipart() # 创建一个带附件的实例
message['From'] = user # 发送地址
message['To'] = receivers # 接受地址
message['Subject'] = subject # 邮件标题
# 邮件正文内容
message.attach(MIMEText(mail_msg, 'html', 'utf-8'))
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream' # 此处固定
att1["Content-Disposition"] = 'attachment; filename="test.txt"' # 这里的 filename 可以任意写,写什么名字,邮件中显示什么名字
message.attach(att1) # 添加附件1
# 构造附件1,传送当前目录下的 signature.png 文件
att2 = MIMEText(open('signature.png', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream' # 此处固定
att2["Content-Disposition"] = 'attachment; filename="signature.png"' # 这里的 filename 可以任意写,写什么名字,邮件中显示什么名字
message.attach(att2) # 添加附件2
# 创建SMTP对象
smtp = smtplib.SMTP()
# 连接服务器
smtp.connect(smtpserver)
# 登录邮箱账号
smtp.login(user, password)
# 发送账号信息
smtp.sendmail(user, receivers, message.as_string())
# 关闭
smtp.quit()
3. 在 HTML 文本中添加图片以及多人发送
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
smtpserver = 'smtp.qq.com' # 服务器地址
user = '[email protected]' # 发送账号
password = 'XXXXXXXXXXXXX' # 发送密码
receivers = ['[email protected]', '[email protected]'] # 收件人
subject = 'python 批量发送带附件邮件,并在正文中显示图片' # 邮件标题
mail_msg = r"""
<p>Python 邮件发送测试...</p>
<p><a href="http://www.bilibili.com">这是一个链接</a></p>
<p>图片演示:</p>
<p><img src="cid:img"></p>
"""
message = MIMEMultipart('related') # 创建一个带附件的实例
message['From'] = user # 发送地址
message['To'] = ",".join(receivers) # 接受地址
message['Subject'] = subject # 邮件标题
# 构造正文内容
body = MIMEMultipart('alternative')
body.attach(MIMEText(mail_msg, 'html', 'utf-8'))
# 将正文内容添加到邮件中
message.attach(body)
# 读取需要在邮件正文显示的图片
with open('signature.png', 'rb') as f:
msgImage = MIMEImage(f.read())
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<img>')
message.attach(msgImage)
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream' # 此处固定
att1["Content-Disposition"] = 'attachment; filename="test.txt"' # 这里的 filename 可以任意写,写什么名字,邮件中显示什么名字
message.attach(att1) # 添加附件1
# 构造附件1,传送当前目录下的 signature.png 文件
att2 = MIMEText(open('signature.png', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream' # 此处固定
att2["Content-Disposition"] = 'attachment; filename="signature.png"' # 这里的 filename 可以任意写,写什么名字,邮件中显示什么名字
message.attach(att2) # 添加附件2
# 创建SMTP对象
smtp = smtplib.SMTP(smtpserver, port=25) # 和之前的smtp.connect(smtpserver)一样的意思,连接到邮件服务器
# smtp.set_debuglevel(1) # 用于显示邮件发送的执行步骤
# 登录邮箱账号
smtp.login(user, password)
# 发送账号信息
smtp.sendmail(user, receivers, message.as_string())
# 关闭
smtp.quit()