Python进阶篇(五)-- 邮件客户端实现与电子邮件发送

news2025/1/10 22:23:06

1 SMTP

        通过完成本实验,我们将更加了解SMTP协议。还将学到使用Python实现标准协议的经验。

        主要任务是开发一个简单的邮件客户端,将邮件发送给任意收件人。客户端将需要连接到邮件服务器,使用SMTP协议与邮件服务器进行对话,并向邮件服务器发送电子邮件。 Python提供了一个名为smtplib的模块,它内置了使用SMTP协议发送邮件的方法。但是我们不会在本实验中使用此模块,因为它隐藏了SMTP和套接字编程的细节。

        为了限制垃圾邮件,一些邮件服务器不接受来源随意的TCP连接。对于下面所述的实验,您可能需要尝试连接到您的大学邮件服务器和流行的Webmail服务器(如AOL邮件服务器)。您也可以尝试从您的家和您的大学校园进行连接。

        这里采用qq邮箱来完成。本文将实现一个SMTP客户端,使用qq邮箱作为发件人,向指定的163邮箱发送一封邮件。

        SMTP协议即简单邮件传输协议,允许用户按照标准发送/接收邮件。

        在本文中,SMTP邮件客户端程序的基本流程如下:

  1. 与qq邮件服务器建立TCP连接,域名"smtp.qq.com",SMTP默认端口号25。建立连接后服务器将返回状态码220,代表服务就绪(类似HTTP,SMTP也使用状态码通知客户端状态信息)。
  2. 发送"HELO"命令,开始与服务器的交互,服务器将返回状态码250(请求动作正确完成)。
  3. 发送"AUTH LOGIN"命令,开始验证身份,服务器将返回状态码334(服务器等待用户输入验证信息)。
  4. 发送经过base64编码的用户名(本例中是163邮箱的账号),服务器将返回状态码334(服务器等待用户输入验证信息)。
  5. 发送经过base64编码的密码(本例中是163邮箱的密码),服务器将返回状态码235(用户验证成功)。
  6. 发送"MAIL FROM"命令,并包含发件人邮箱地址,服务器将返回状态码250(请求动作正确完成)。
  7. 发送"RCPT TO"命令,并包含收件人邮箱地址,服务器将返回状态码250(请求动作正确完成)。
  8. 发送"DATA"命令,表示即将发送邮件内容,服务器将返回状态码354(开始邮件输入,以"."结束)。
  9. 发送邮件内容,服务器将返回状态码250(请求动作正确完成)。
  10. 发送"QUIT"命令,断开与邮件服务器的连接。

1.2 代码实现

# -*- encoding: utf-8 -*-
# @Author: CarpeDiem
# @Date: 230504
# @Version: 1.0
# @Description: Python 实现邮件客户端

from socket import *
import base64

# Mail content
subject = "I love computer networks!"
contenttype = "text/plain"
msg = "I love computer networks!"
endmsg = "\r\n.\r\n"

# Choose a mail server (e.g. Google mail server) and call it mailserver 
mailserver = "smtp.qq.com"

# Sender and reciever
fromaddress = "xxxxxxxxx@qq.com"
toaddress = "xxxxx@163.com"

# Auth information (Encode with base64)
username = "xxxxxxxxx@qq.com"
password = "xxxxxxxxxxx"

username = base64.b64encode(username.encode()).decode()
password = base64.b64encode(password.encode()).decode()

# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((mailserver, 25))

recv = clientSocket.recv(1024).decode()
print(recv)
if recv[:3] != '220':
    print('220 reply not received from server.')

# Send HELO command and print server response.
heloCommand = 'HELO CarpeDiem\r\n'
clientSocket.send(heloCommand.encode())
recv1 = clientSocket.recv(1024).decode()
print(recv1)
if recv1[:3] != '250':
    print('250 reply not received from server.')

# Auth
clientSocket.sendall('AUTH LOGIN\r\n'.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '334'):
	print('334 reply not received from server')

clientSocket.sendall((username + '\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '334'):
	print('334 reply not received from server')

clientSocket.sendall((password + '\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '235'):
	print('235 reply not received from server')

# Send MAIL FROM command and print server response.
clientSocket.sendall(('MAIL FROM: <' + fromaddress + '>\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
	print('250 reply not received from server')

# Send RCPT TO command and print server response.
clientSocket.sendall(('RCPT TO: <' + toaddress + '>\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
	print('250 reply not received from server')

# Send DATA command and print server response.
clientSocket.send('DATA\r\n'.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '354'):
	print('354 reply not received from server')

# Send message data.
message = 'from:' + fromaddress + '\r\n'
message += 'to:' + toaddress + '\r\n'
message += 'subject:' + subject + '\r\n'
message += 'Content-Type:' + contenttype + '\t\n'
message += '\r\n' + msg
clientSocket.sendall(message.encode())

# Message ends with a single period.
clientSocket.sendall(endmsg.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
	print('250 reply not received from server')

# Send QUIT command and get server response.
clientSocket.sendall('QUIT\r\n'.encode())

# Close connection
clientSocket.close()

        温馨提示: 有些邮箱默认关闭SMTP服务,比如本文使用的qq邮箱。需要在设置中打开SMTP服务。另外,qq邮箱在打开SMTP服务后,会设置一个授权码,在程序使用这个授权码作为密码登录,而不是平时使用的密码。

        一切正常的话,运行效果如下图所示,将会看到服务器返回的每条消息,其中包含每次操作后返回的状态码。

        同时,我们还可以登陆发件人邮箱和收件人邮箱,在发件人的已发送文件夹中和收件人的收件箱中都能看到这封被发送的邮件。左图为qq邮箱,右图为网易163邮箱。


2 网络应用开发

2.1 发送电子邮件

        在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。

        就像我们可以用HTTP(超文本传输协议)来访问一个网站一样,发送邮件要使用SMTP(简单邮件传输协议),SMTP也是一个建立在TCP(传输控制协议)提供的可靠数据传输服务的基础上的应用级协议,它规定了邮件的发送者如何跟发送邮件的服务器进行通信的细节,而Python中的smtplib模块将这些操作简化成了几个简单的函数。

        smtplib和email,这俩模块是Python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

  • smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
  • email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

代码说明:

  1. smtplib模块

smtplib.SMTP()              # 实例化SMTP()

login(user, password)
# user:登录邮箱的用户名。
# password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。

sendmail(from_addr, to_addrs, msg,)
# from_addr:邮件发送者地址
# to_addrs:邮件接收者地址。字符串列表[‘接收地址1’,‘接收地址2’,‘接收地址3’,…]
# msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。

quit()      # 用于结束SMTP会话。

2) email模块

        email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。

        该mime包下常用的有三个模块:text, image, multpart。

        导入方法如下:

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

        构造一个邮件对象就是一个Message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

Message
+- MIMEBase
   +- MIMEMultipart
   +- MIMENonMultipart
      +- MIMEMessage
      +- MIMEText
      +- MIMEImage

        下面的代码演示了如何在Python发送普通的文字邮件。

1. 发送普通文字邮件

# -*- encoding: utf-8 -*-
# @Author: CarpeDiem
# @Date: 230428
# @Version: 1.0
# @Description: Python 发送邮件

from smtplib import SMTP_SSL
from email.header import Header 
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def main():
    # 设定邮件发送者和接受者
    host_server = 'smtp.qq.com'             # qq 邮箱smtp服务器
    sender = 'xxxxxxxx@qq.com'              # 发件人邮箱
    pwd = 'xxxxxxxxxxxxx'
    receivers = ['xxxxxxx@gmail.com', 'xxxxxx@163.com']              # 收件人邮箱
    mail_title = "Python自动发送的邮件"                               # 邮件标题  
    mail_content = "您好,这是使用python登录QQ邮箱发送邮件的测试——xq"   # 邮件正文内容

    message = MIMEMultipart()               # 初始化一个邮件主体
    message['Subject'] = Header(mail_title, 'utf-8')
    message['From'] = sender
    message['To'] = ";".join(receivers)
    message.attach(MIMEText(mail_content, 'plain', 'utf-8'))    # 邮件正文内容

    smtper = SMTP_SSL(host_server)      # ssl登录
    # login(user,password):
    # user:登录邮箱的用户名。
    # password:登录邮箱的密码,这里用的是QQ邮箱,
    # 需要用到客户端密码,需要在QQ邮箱中设置授权码,该授权码即为客户端密码
    smtper.login(sender, pwd)
    smtper.sendmail(sender, receivers, message.as_bytes())
    print("邮件发送完成!")
    # quit(): 用于结束SMTP会话
    smtper.quit()

if __name__ == '__main__':
    main()

2. 发送html格式邮件

# -*- encoding: utf-8 -*-
# @Author: CarpeDiem
# @Date: 230419
# @Version: 1.0
# @Description: Python 发送HTML格式邮件

import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

host_server = "smtp.qq.com"             # qq邮箱smtp服务器
sender_qq = "xxxxxxx@qq.com"         # 发件人邮箱
password = "xxxxxxxxxxxx"           # 授权码
receiver = "xxxxxxx@163.com"
mail_title = "Python自动发送html格式的邮件" # 邮件标题
# 邮件正文内容
mail_content = "您好!<p>这是使用python登录QQ邮箱发送\
                HTNL格式邮件的测试:</p> <p>\
                <a href='https://blog.csdn.net/xq151750111?spm=1010.2135.3001.5421'>CSDN个人主页</a></p>"

msg = MIMEMultipart()
msg["Subject"] = Header(mail_title, "utf-8")
msg["From"] = sender_qq
msg["To"] = Header("测试邮箱", "utf-8")

msg.attach(MIMEText(mail_content, 'html'))

try:
    smtp = SMTP_SSL(host_server)    # ssl登录连接到邮件服务器
    smtp.set_debuglevel(True)       # False to disable debug
    smtp.ehlo(host_server)          # 跟服务器打招呼,告诉它我们准备连接
    smtp.login(sender_qq, password)
    smtp.sendmail(sender_qq, receiver, msg.as_string())
    smtp.quit()
    print("邮件发送成功")
except smtplib.SMTPException:
    print("无法发送邮件")

3. 发送带附件的邮件

# -*- encoding: utf-8 -*-
# @Author: CarpeDiem
# @Date: 230419
# @Version: 1.0
# @Description: Python 发送HTML格式邮件以及附件

import string
import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.application import MIMEApplication  # 用于添加附件

host_server = "smtp.qq.com"             # qq邮箱smtp服务器
sender_qq = "xxxxxxx@qq.com"         # 发件人邮箱
password = "xxxxxxxxxxxx"           # 授权码
receiver = "xxxxxxxx@163.com"
mail_title = "Python自动发送html格式的邮件" # 邮件标题
# 邮件正文内容
mail_content = "您好!<p>这是使用python登录QQ邮箱发送\
                HTNL格式邮件的测试:</p> <p>\
                <a href='https://blog.csdn.net/xq151750111?spm=1010.2135.3001.5421'>CSDN个人主页</a></p>"

msg = MIMEMultipart()
msg["Subject"] = Header(mail_title, "utf-8")
msg["From"] = sender_qq
msg["To"] = Header("测试邮箱", "utf-8")

msg.attach(MIMEText(mail_content, 'html'))
attachment = MIMEApplication(open("H:\\毕业设计\\LassoNet\\脑区选择.xlsx", 'rb').read())
attachment["Content-Type"] = "application/octet-stream"

# 给附件重命名
basename = "test.xlsx"
attachment.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', basename))
msg.attach(attachment)

try:
    smtp = SMTP_SSL(host_server)    # ssl登录连接到邮件服务器
    smtp.set_debuglevel(True)       # False to disable debug
    smtp.ehlo(host_server)          # 跟服务器打招呼,告诉它我们准备连接
    smtp.login(sender_qq, password)
    smtp.sendmail(sender_qq, receiver, msg.as_string())
    smtp.quit()
    print("邮件发送成功")
except smtplib.SMTPException:
    print("无法发送邮件")

2.2 发送短信

        发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。在下面的代码中我们使用了互亿无线短信平台(该平台为注册用户提供了50条免费短信以及常用开发语言发送短信的demo,可以登录该网站并在用户自服务页面中对短信进行配置)提供的API接口实现了发送短信的服务,当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。

import urllib.parse
import http.client
import json


def main():
    host  = "106.ihuyi.com"
    sms_send_uri = "/webservice/sms.php?method=Submit"
    # 下面的参数需要填入自己注册的账号和对应的密码
    params = urllib.parse.urlencode({'account': 'API ID', 'password' : 'API KEY', 'content': '您的验证码是:666888。请不要把验证码泄露给其他人。', 'mobile': 'xxxxxxxxx', 'format':'json' })
    print(params)
    headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
    conn = http.client.HTTPConnection(host, port=80, timeout=30)
    conn.request('POST', sms_send_uri, params, headers)
    response = conn.getresponse()
    response_str = response.read()
    jsonstr = response_str.decode('utf-8')
    print(json.loads(jsonstr))
    conn.close()


if __name__ == '__main__':
    main()

        详细了解,请阅读:短信验证码/通知 - API文档


参考

  • Python实现自动发送邮件(详解):https://blog.csdn.net/weixin_44827418/article/details/111255414
  • Python网络应用开发:https://gitee.com/zengyujin/Python-100-Days/blob/master/Day01-15/14.%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8%E5%92%8C%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91.md#%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【P5】JMeter HTTP Cookie管理器

文章目录 一、测试网站二、Cookie 设置规则2.1、无配置元件时&#xff0c;Cookie 不会自动设置&#xff08;与线程组设置无关&#xff09;2.2、有配置元件&#xff0c;不选任何参数时&#xff0c;Cookie 自动设置&#xff08;与线程组设置无关&#xff09;2.3、有配置元件&…

【iOS KVO(上)实现过程】

前言 KVO 也适用于传值&#xff0c;在之前的学习只是学习了KVO的传值&#xff0c;今天详细学习 监听和实现 源码放在下一节学习 1.1 KVO KVO&#xff08;Key-Value Observing&#xff09;是Objective-C语言中一种观察者模式的实现&#xff0c;可以用来监听对象属性值的变化…

Kafka基础概念介绍

背景 Kafka是我们项目用的最多的消息中间件&#xff0c;但里面也有很多存在的问题&#xff0c;如重复消费、带宽瓶颈、部分分区消费不下来的异常场景。 重复消费问题有些让人头疼&#xff08;reblance导致offset提交失败&#xff09;&#xff0c;这里会持续更新&#xff08;基…

UML简介与类图详解

1 UML简介 1.1 UML是什么 UML&#xff0c;全称为Unified Model Language&#xff0c;即统一建模语言&#xff0c;是由一整套图表组成的&#xff0c;为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML 代表了一组最佳工程实践&#xff0c;这些实践已被证明在…

【路径规划】基于哈里斯鹰优化算法的栅格法路径规划 机器人路径规划【Matlab代码#20】

文章目录 1. 原始HHO算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取方式 1. 原始HHO算法 详细介绍此处略&#xff0c;可参考HHO算法介绍 2. 机器人路径规划环境创建 对机器人工作空间的进行环境建模是机器人路径规划研究的重要…

【电源专题】案例:拆一个早期用的万能充看看内部状况

说到万能充,可能存在80/90后的记忆里。以前手机都可以更换电池的,所有往往都是买两块,一块在手机内部使用,另一块在万能充充电。 万能充的外观也是大同小异的,从网上找了一些图片: 这东西现在日常生活已经都看不到了,关键因素之一应该是现在的手机电池都是不可拆…

多维图像去噪方法研究

一、背景介绍 由于传感器技术的快速发展&#xff0c;高光谱&#xff08;HS&#xff09;遥感&#xff08;RS&#xff09;成像为飞机等数据采集设备远距离观测和分析地球表面提供了大量的空间和光谱信息&#xff0c;航天器和卫星。 HS RS 技术的最新进展甚至革命为实现各种应用的…

【ONE·C++ || set和map(一)】

总言 主要介绍set和map的基本框架和使用 文章目录 总言1、部分接口介绍和使用举例1.1、序列式容器和关联式容器、键值对1.1.2、pair键值对 1.2、set基本介绍1.2.1、set::set、遍历1.2.2、set::insert、set::erase、set::find1.2.3、set::count、set::lower_bound、set::upper_…

数据结构与算法基础(青岛大学-王卓)(1)

士别三日当刮目相待&#xff0c;不好意思鸽了好久了&#xff0c;因为学习的时间不连续&#xff0c;所以我一直攒着&#xff0c;我又回来继续更新了 没有继续学习浙大的数据结构了&#xff0c;对比了青岛大学的王老师的这个教程我觉得更适合我一些&#xff0c;更入门&#xff0…

【Spring篇】Spring整合

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、Spring整合 1.Spring整合Mybatis思路分析 1.环境准备 2.整合思路分析 2.Spring整合Mybatis 3.Spring整合Junit 1.环境准备 2.整合Junit步骤 二、图书推荐 1.《元宇宙Ⅱ&#xff1a;图…

Ubuntu安装MySQL

一.安装MySQL服务器 安装MySQL服务器&#xff1a; apt-get install mysql-server 对MySQL进行初始化&#xff0c;设置密码&#xff1a; mysql_secure_installation 注意&#xff0c;这里要设置密码的最低长度为8位&#xff0c;如果你设的密码小于8位&#xff0c;则会提示&am…

有趣工具合集小程序-做你的小树洞小程序

有趣工具合集小程序-做你的小树洞 今天闲来无事&#xff0c;发现了一个有趣的小程序-做你的小树洞&#xff0c;包含ChatGpt小机器人、抛硬币、手持弹幕、亲戚计算器、藏头诗、唐诗三百首、歇后语以及猜谜语等功能 小程序总体界面是这样的 1.藏头诗 这个小程序里边有很多有趣…

Redis的哨兵和集群模式

哨兵模式# 哨兵模式是redis高可用的实现方式之一 使用一个或者多个哨兵(Sentinel)实例组成的系统&#xff0c;对redis节点进行监控&#xff0c;在主节点出现故障的情况下&#xff0c;能将从节点中的一个升级为主节点&#xff0c;进行故障转义&#xff0c;保证系统的可用性。 哨…

【Qt5】多线程串口

文章目录 原版代码工程增加QCustomplot实时画图的源码工程源码 原版代码工程 源码下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/15pWzadPwOx_OfJGtvL-MjA 提取码&#xff1a;lief –来自百度网盘超级会员V5的分享 增加QCustomplot实时画图的源码工程 源码&…

【Mybatis】增删改查

1.添加相应的jar包 2.创建持久化类 在src目录下创建一个名为com.mybatis.po的包 创建持久化类MyUser,包含三个属性&#xff08;uid,uname,usex) package com.mybatis.po; /***springtest数据库中user表的持久化类*/ public class MyUser {private Integer uid;//主键private…

滴水逆向三期笔记与作业——02C语言——02数据类型

海哥牛逼 这里写自定义目录标题 一、C语言如何变成汇编1、裸函数 二、调用约定1、常见的几种调用约定 三、程序的真正入口四、数据类型4.1 C语言中的数据类型 作业 一、C语言如何变成汇编 1、裸函数 裸函数使用特殊方式定义&#xff0c;编译器和连接器并不会为其生成提升堆栈…

华为网工实验(VRRP多网关负载分担,OSPF基础操作)

采用VRRP多网关负载分担实现流量的负载均衡 配置思路&#xff1a;首先配置各个接口ip,让设备间能够实现通信&#xff0c;采用OSPF协议实现通信&#xff0c;然后AR2 AR3创建两个备份组&#xff0c;主备不同的两个备份组 组网图 #先设备命名并配置IP&#xff0c;三台设备类似&a…

路由器拨号密码恢复

背景 路由器拨号上网的密码因时间久远遗忘了&#xff0c;恢复并记录下过程。 步骤 1&#xff0c;安装wireshark choco install wireshark -y 注意 实践发现wireshark安装后&#xff0c;启动提示还需要安装Npcap 或者 Winpcap, 不过&#xff0c;在winpcap官网提示它已不再开…

虚拟机的克隆

第一步&#xff1a; 虚拟机右击 -> 管理 ->克隆 第二步&#xff1a; 在这一步勾选创建完整克隆&#xff0c;其他的都下一步 第三步 1.修改 mac地址 点击生成&#xff0c;就会生成一个随机的mac地址 2.修改主机名 vim /etc/hostname 修改完主机名后 reboot 重启虚拟机…

C++ STL学习之【优先级队列】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、优先级队列的使用1.1、基本功能1.2、优先级模式切换1.3、相关题目 2、模拟…