Python发送邮件

1. 认识smtp服务器发送邮件的流程

平时生活中我们想要发送邮件,直接借助qq邮箱163邮箱等即可,如果我们想要使用代码来完成这个事情,那就需要Python标准库中的两个模块:emailsmtp。它们可以做的事情如下图所示:
在这里插入图片描述

2. 认识邮件构造的各个元素

想要组装一个email,分为两步:

  1. 创建一个email对象
  2. email添加属性

第一步:创建email对象 使用如下语法格式:

from email.mime.text import MIMEText
msg = MIMEText(content, 'plain', 'utf-8')

参数说明:

  1. content: 邮件的内容 即为文本内容 定义为字符串即可
  2. plain: 邮件的文本格式 默认设置为plain即可
  3. utf-8: 邮件的编码格式 默认设置为utf-8即可

第二步:给email对象添加属性 需要添加三个属性,如下:

  1. from:从哪里来,即发送者
  2. to:到哪里去,即接收者
  3. 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通信类似):

  1. 创建一个smtp对象
  2. 连接smtp服务器
  3. 登陆smtp服务器
  4. 发送邮件
  5. 退出登陆
  6. 关闭连接
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发送各种形式的邮件,笔者希望大家看完之后,自己使用函数进行封装,以便于将来方便使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章