目录
1. 认识smtp服务器发送邮件的流程
平时生活中我们想要发送邮件,直接借助qq邮箱
、163邮箱
等即可,如果我们想要使用代码来完成这个事情,那就需要Python标准库中的两个模块:email
和smtp
。它们可以做的事情如下图所示:
2. 认识邮件构造的各个元素
想要组装一个email
,分为两步:
- 创建一个
email
对象 - 给
email
添加属性
第一步:创建email
对象 使用如下语法格式:
from email.mime.text import MIMEText
msg = MIMEText(content, 'plain', 'utf-8')
参数说明:
content
: 邮件的内容 即为文本内容 定义为字符串即可plain
: 邮件的文本格式 默认设置为plain即可utf-8
: 邮件的编码格式 默认设置为utf-8即可
第二步:给email
对象添加属性 需要添加三个属性,如下:
from
:从哪里来,即发送者to
:到哪里去,即接收者subject
:主题,即邮件的标题
代码演示:
# msg["from"] = user # 指定发送者的邮箱
msg["from"] = "[email protected]"
# msg["to"] = to_addr # 指定接收者的邮箱
msg["to"] = "[email protected]" # 如果两个邮箱相同,则表示自己发送给自己
# msg["subject"] = subject # 邮箱的主题
msg["subject"] = "Python面试结果通知"
# 这里的话我只是随意拿一个邮箱来进行演示
#########或者使用下面的这种方式##########
from email.header import Header
msg["from"] = Header("amo", "utf-8")
msg["To"] = Header("测试", "utf-8")
subject = "Python SMTP 邮件测试"
msg["Subject"] = Header(subject, "utf-8")
email
示意图 这里的话我是拿qq邮箱来举例子的,为了安全起见,我将自己的邮箱号打了马萨克,自己可在自己qq邮箱观察:
3. 掌握使用smtplib发送邮件的步骤
使用smtp发送邮件,有如下流程:(和socket通信类似):
- 创建一个smtp对象
- 连接smtp服务器
- 登陆smtp服务器
- 发送邮件
- 退出登陆
- 关闭连接
import smtplib
# 1.创建一个smtp对象
server = smtplib.SMTP()
# 2.连接smtp服务器
# mainhost: 设置的目标服务器
# mainport: 端口号
server.connect(mainhost, mainport)
# 3.登陆smtp服务器
# user: 用户名
# password: 授权码
server.login(user, password)
# 4.发送邮件
# msg: 就是使用email模块包装出来的对象 然后将这个对象转换为字符串
# from_addr: 邮件发送者地址
# to_addrs: 字符串列表,邮件发送地址
# msg: 发送消息
server.sendmail(from_addr, to_addrs, msg)
# 5.退出登陆
server.quit()
# 6.关闭连接
server.close()
这里的话以我的qq
邮箱为例,怎么去查找目标服务器
,端口号
,用户名
,授权码
获取服务器和端口号:
获取用户名和密码:
发送一封基本的qq
邮件,完整示例代码演示:
from email.mime.text import MIMEText # 导包
from email.header import Header
import smtplib
# TODO 2.配置发送邮件需要的基本信息
# 设置第三方smtp相关服务信息
main_host = "smtp.qq.com" # 设置服务器 如果是163 写smtp.163.com即可
main_user = "[email protected]" # 用户名 或者是[email protected]
main_pass = "填写自己获取的授权码" # 授权码
# 设置接收与发送邮件者
sender = "[email protected]"
receiver = "[email protected]" # 第一次可以先测试自己发送给自己
# TODO 1.将发送的内容包装成为邮件需要的格式
content = "Hello World" # 发送内容
msg = MIMEText(content, 'plain', 'utf-8')
# 这里可以将[email protected]指定为中文
msg["from"] = Header("[email protected]", "utf-8")
msg["To"] = Header("[email protected]", "utf-8")
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")
# TODO 3.使用smtplib模块发送邮件
# 发送邮件server.sendmail(sender, receiver, msg.as_string()) # 4.发送邮件
try:
server = smtplib.SMTP() # 1.创建一个smtp对象
server.connect(main_host, 25) # 2.连接smtp服务器 # 这里的端口号写587也是可以的
server.login(main_user, main_pass) # 3.登陆smtp服务器
server.sendmail(sender, receiver, msg.as_string()) # 4.发送邮件
server.quit() # 5.退出登陆
# 6.关闭连接 实际情况中最好是不要关闭自己的链接 否则会在后续运行程序中出现莫名的错误
# server.close()
except smtplib.SMTPException:
print("无法发送邮件")
运行结果如图所示:
163
邮箱,怎么去查找授权码
:
4. 使用Python发送HTML格式的邮件
Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:
from email.mime.text import MIMEText # 导包
from email.header import Header
import smtplib
# TODO 2.配置发送邮件需要的基本信息
# 设置第三方smtp相关服务信息
main_host = "smtp.qq.com" # 设置服务器 如果是163 写smtp.163.com即可
main_user = "[email protected]" # 用户名 或者是[email protected]
main_pass = "填写自己获取的授权码" # 授权码
# 设置接收与发送邮件者
sender = "[email protected]"
receiver = "[email protected]" # 第一次可以先测试自己发送给自己
# TODO 1.将发送的内容包装成为邮件需要的格式
content = """
<p>Python 邮件发送测试...</p>
<p><a href="https://blog.csdn.net/xw1680?orderby=ViewCount">点击进入Amo Xiang的博客</a></p>
""" # 发送内容
msg = MIMEText(content, 'html', 'utf-8')
# 这里可以将[email protected]指定为中文
msg["from"] = Header("[email protected]", "utf-8")
msg["To"] = Header("[email protected]", "utf-8")
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")
# TODO 3.使用smtplib模块发送邮件
# 发送邮件server.sendmail(sender, receiver, msg.as_string()) # 4.发送邮件
try:
server = smtplib.SMTP() # 1.创建一个smtp对象
server.connect(main_host, 25) # 2.连接smtp服务器 # 这里的端口号写587也是可以的
server.login(main_user, main_pass) # 3.登陆smtp服务器
server.sendmail(sender, receiver, msg.as_string()) # 4.发送邮件
server.quit() # 5.退出登陆
# 6.关闭连接 实际情况中最好是不要关闭自己的链接 否则会在后续运行程序中出现莫名的错误
# server.close()
except smtplib.SMTPException:
print("无法发送邮件")
代码执行结果如图所示:
5. Python发送带附件的邮件
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。代码如下:
# TODO 1.倒入需要相关的模块/类
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import smtplib
# TODO 2.包装email
# 创建一个带附件的实例
msg = MIMEMultipart()
msg["from"] = "[email protected]"
msg["to"] = "[email protected]"
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")
# 邮件正文内容
msg.attach(MIMEText("这是Amo Xiang Python邮件发送测试....", "plain", "utf-8"))
# 构造附件1 传送当前目录下的user_info.txt文件
att1 = MIMEText(open("user_info.txt", "rb").read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="user_info.txt"'
msg.attach(att1)
# 构造附件2 传送当前目录下的gobang.py文件
att2 = MIMEText(open("gobang.py", "rb").read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="gobang.py"'
msg.attach(att2)
# TODO 3.发送邮件
# 准备发送邮件需要的基本信息
main_host = "smtp.qq.com"
main_user = "[email protected]"
main_pass = "填写自己获取的授权码"
sender = "[email protected]"
receiver = "[email protected]"
try:
server = smtplib.SMTP()
server.connect(main_host, 25)
server.login(main_user, main_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except smtplib.SMTPException:
print("无法发送邮件...")
运行结果如图所示:
6. 在HTML文本中添加图片
邮件的 HTML 文本中一般邮件服务商添加外链是无效的,正确添加图片的实例如下所示:
# TODO 1.倒入需要相关的模块/类
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib
# TODO 2.包装email
# 创建一个带附件的实例
msg = MIMEMultipart("related")
msg["from"] = "[email protected]"
msg["to"] = "[email protected]"
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")
msg2 = MIMEMultipart("alternative")
msg.attach(msg2)
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="https://blog.csdn.net/xw1680?orderby=ViewCount">Amo Xiang博客链接</a></p>
<p>图片演示: </p>
<p><img src="cid:image1"></p>
"""
msg2.attach(MIMEText(mail_msg, "html", "utf-8"))
# 指定图片为当前目录
msgImage = MIMEImage(open('timg.jpeg', "rb").read())
# 定义图片id 在html文本中引用
msgImage.add_header("Content-ID", "<image1>")
msg.attach(msgImage)
# TODO 3.发送邮件
# 准备发送邮件需要的基本信息
main_host = "smtp.qq.com"
main_user = "[email protected]"
main_pass = "填写自己获取到的授权码"
sender = "[email protected]"
receiver = "[email protected]"
try:
server = smtplib.SMTP()
server.connect(main_host, 25)
server.login(main_user, main_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except smtplib.SMTPException:
print("无法发送邮件...")
执行结果如图所示:
7. 批量发送邮件
7.1 给同一个人发送多封邮件
# TODO 1.倒入需要相关的模块/类
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import smtplib
# TODO 2.包装email
# 创建一个带附件的实例
msg = MIMEMultipart()
msg["from"] = "[email protected]"
msg["to"] = "[email protected]"
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")
# 邮件正文内容
msg.attach(MIMEText("这是Amo Xiang Python邮件发送测试....", "plain", "utf-8"))
# 构造附件1 传送当前目录下的user_info.txt文件
att1 = MIMEText(open("user_info.txt", "rb").read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="user_info.txt"'
msg.attach(att1)
# 构造附件2 传送当前目录下的gobang.py文件
att2 = MIMEText(open("gobang.py", "rb").read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="gobang.py"'
msg.attach(att2)
# TODO 3.发送邮件
# 准备发送邮件需要的基本信息
main_host = "smtp.qq.com"
main_user = "[email protected]"
main_pass = "填写授权码"
sender = "[email protected]"
receiver = "[email protected]"
try:
server = smtplib.SMTP()
server.connect(main_host, 25)
server.login(main_user, main_pass)
# 给同一个人发很多封 直接在这里加一个for循环即可 5:表示发送5封
for i in range(5):
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except smtplib.SMTPException:
print("无法发送邮件...")
程序执行结果如下:
7.2 根据不同的人发送不同内容的邮件
from email.mime.text import MIMEText # 导包
from email.header import Header
import smtplib
# TODO 2.配置发送邮件需要的基本信息
# 设置第三方smtp相关服务信息
main_host = "smtp.qq.com" # 设置服务器 如果是163 写smtp.163.com即可
main_user = "[email protected]" # 用户名 或者是[email protected]
main_pass = "授权码" # 授权码
# 设置接收与发送邮件者
sender = "[email protected]"
receiver = ["[email protected]", "[email protected]", "[email protected]",
"[email protected]"]
# 不同邮箱对应的人的姓名
receiver_name = ["name1", "name2", "name3", "name4"]
# TODO 1.将发送的内容包装成为邮件需要的格式
content = """
Dear {}:
恭喜你,通过布塔学院的面试,请与2020-03-30日前来我司报道。
""" # 发送内容
for i in range(len(receiver)):
msg = MIMEText(content.format(receiver_name[receiver.index(receiver[i])]), 'plain', 'utf-8')
msg["from"] = Header("[email protected]", "utf-8")
msg["To"] = Header("[email protected]", "utf-8")
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")
# TODO 3.使用smtplib模块发送邮件
# 发送邮件server.sendmail(sender, receiver, msg.as_string()) # 4.发送邮件
try:
server = smtplib.SMTP() # 1.创建一个smtp对象
server.connect(main_host, 25) # 2.连接smtp服务器 # 这里的端口号写587也是可以的
server.login(main_user, main_pass) # 3.登陆smtp服务器
server.sendmail(sender, receiver[i], msg.as_string()) # 4.发送邮件
server.quit() # 5.退出登陆
except smtplib.SMTPException:
print("无法发送邮件")
程序运行结果如图所示:
综上,便是使用Python发送各种形式的邮件,笔者希望大家看完之后,自己使用函数进行封装,以便于将来方便使用。