『Python』SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。这里我们就需要用到这个库。其中SMTP支持smtplibemail两个模块,其中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()

猜你喜欢

转载自blog.csdn.net/dreaming_coder/article/details/108299732