100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)
文章目录
- 专栏导读
- 案例说明
- 一、smtplib模块是什么?
- 1.1 模块介绍
- 1.2 SMTP参数说明
- 1.3 SMTP常用方法
- 二、email模块是什么?
- 1.1 模块介绍
- 1.2 常用类说明
- 三、案例实战
- 3.1 获取授权码
- 3.2 代码步骤
- 3.3 发送文本格式邮件
- 3.4 发送图片格式邮件
- 3.5 发送指定文件夹下所有内容
专栏导读
🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html
- 优点:订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
- 专栏福利:简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等


案例说明
SMTP是一种用于发送电子邮件的协议,Python从2.3版本开始内置了对SMTP的支持。Python的SMTP支持主要依赖于smtplib和email两个模块。其中,email模块负责构建邮件内容,包括邮件头部信息和正文部分;而smtplib模块则负责发送邮件,通过它我们可以连接到SMTP服务器,并发送邮件。
本文以QQ邮箱为例,介绍如何使用Python发送不同类型的邮件。
一、smtplib模块是什么?
1.1 模块介绍
- smtplib模块是Python标准库中的一个模块,用于发送电子邮件。它提供了一个简单的接口,可以用来连接到邮件服务器并发送电子邮件。通过smtplib模块,你可以轻松地创建和发送包含文本或附件的电子邮件。
- smtplib模块的主要功能包括连接到邮件服务器、发送邮件、设置邮件主题、收件人、抄送、密送等信息。它还支持使用SMTP身份验证来发送邮件,并可以处理各种邮件服务器的不同设置和要求。
- 在使用smtplib模块发送邮件时,你需要提供邮件服务器的地址、端口号,以及可能的登录凭据等信息。一旦连接到邮件服务器,你可以使用smtplib模块提供的方法来构建和发送邮件。
Python 3.x 版本中,smtplib模块已经包含在标准库中,无需额外安装,你可以在Python脚本中直接导入smtplib模块并开始使用:
import smtplib
1.2 SMTP参数说明
SMTP类是Python的smtplib模块中的一个重要类,它提供了与SMTP服务器进行交互的方法和功能。
smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
参数说明:
-
host: 可选参数,表示SMTP服务器的主机名。如果未提供此参数,将使用默认的本地主机名来连接 SMTP 服务器。
-
port: 可选参数,表示SMTP服务器的端口号。如果未提供此参数,将使用标准的 SMTP 端口号 25。
-
local_hostname: 可选参数,用于标识客户端的主机名。通常情况下,你不需要提供这个参数,SMTP 类会尝试自动确定本地主机名。
-
timeout: 可选参数,表示连接超时时间,以秒为单位。如果未提供此参数,将使用默认的超时时间。
这些参数用于初始化 SMTP 连接,当你实例化 SMTP 对象时,可以根据需要传递这些参数来连接到指定的 SMTP 服务器。
1.3 SMTP常用方法
下面是SMTP类的基本定义和一些常用方法:
class SMTP:def __init__(self, host='', port=0, local_hostname=None, timeout=None, source_address=None):"""初始化SMTP连接:param host: SMTP服务器的主机名:param port: SMTP服务器的端口号:param local_hostname: 本地主机名:param timeout: 连接超时时间:param source_address: 发送源地址"""def connect(self, host='localhost', port=0):"""连接到SMTP服务器:param host: SMTP服务器的主机名:param port: SMTP服务器的端口号"""def starttls(self, keyfile=None, certfile=None, context=None):"""将连接升级为TLS加密连接:param keyfile: 私钥文件:param certfile: 证书文件:param context: SSL上下文"""def login(self, user, password, initial_response_ok=True):"""登录到SMTP服务器:param user: 用户名:param password: 密码:param initial_response_ok: 初始响应是否OK"""def sendmail(self, from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]):"""发送邮件:param from_addr: 发件人地址:param to_addrs: 收件人地址列表:param msg: 邮件内容:param mail_options: 邮件选项:param rcpt_options: 接收选项"""def quit(self):"""退出SMTP会话"""
以上是SMTP类的一些基本方法的定义。通过实例化SMTP类并调用这些方法,你可以连接到SMTP服务器,发送邮件,登录到服务器,将连接升级为TLS加密连接,并退出SMTP会话等。这些方法为你提供了与SMTP服务器进行交互的基本功能,使得你可以使用Python的smtplib模块来发送电子邮件。
二、email模块是什么?
1.1 模块介绍
Python的email模块是用于处理电子邮件的标准库模块,它提供了一系列的类和方法,用于创建、解析、操作和发送电子邮件。通过email模块,你可以轻松地构建各种类型的邮件,包括纯文本邮件、HTML邮件、带附件的邮件等。
1.2 常用类说明
在Python中,email模块提供了一些常用的类来处理邮件的构建和解析。以下是一些常用的类及其功能说明:
-
email.message.Message类:- 用于表示邮件消息的基本类,可以用来创建新的邮件消息或解析现有的邮件消息。
- 可以通过添加头部信息、设置正文内容等来构建邮件消息。
-
email.mime.text.MIMEText类:- 用于表示文本类型的MIME邮件,可以处理纯文本邮件的创建和解析。
- 可以设置文本内容、字符集等属性。
-
email.mime.multipart.MIMEMultipart类:- 用于表示多部分邮件,可以包含多个子类型的邮件体,如文本、HTML、附件等。
- 可以添加子类型的邮件体,并设置邮件的头部信息。
-
email.mime.image.MIMEImage类:- 用于表示图像类型的MIME邮件,可以处理图像类型的邮件。
- 可以设置图像内容、图像类型等属性。
-
email.mime.audio.MIMEAudio类:- 用于表示音频类型的MIME邮件,可以处理音频类型的邮件。
- 可以设置音频内容、音频类型等属性。
这些类可以帮助我们在Python中构建和解析各种类型的邮件,包括纯文本邮件、HTML邮件以及带附件的邮件。通过使用这些类,我们可以更加灵活地处理邮件消息的构建和解析。
三、案例实战
这里咱们用QQ邮箱用做测试,QQ邮箱需要先获取授权码,其他邮箱貌似不需要
3.1 获取授权码
1、登录QQ邮箱的主界面 点击 设置:

2、点击账号:

3、往下翻,找到并开启 POP3/SMTP 服务 和 IMAP/SMTP 服务:

4、点击获取授权码(获取后记得复制):

3.2 代码步骤
代码步骤说明:
- 1、 首先需要导入smtplib和email相关模块。
- 2、 设置发件人邮箱和密码,以及收件人邮箱。
- 3、 创建邮件内容,包括发件人、收件人、主题和正文。
- 4、连接到SMTP服务器,并使用starttls()方法启用TLS加密。
- 5、使用login()方法进行邮箱登录。
- 6、使用sendmail()方法发送邮件。
- 7、 最后使用quit()方法关闭连接。
3.3 发送文本格式邮件
案例代码(注意下面代码需要更改发件人邮箱、授权码和收件人邮箱):
import smtplib # 导入smtplib模块
from email.message import EmailMessage # 从email.message模块导入EmailMessage类# 1、设置发件人邮箱和授权码
sender_email = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码' # 邮箱SMTP的授权码(看上文获取)# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己# 3、创建邮件内容
message = EmailMessage() # 创建EmailMessage对象
message['From'] = sender_email # 设置发件人
message['To'] = recipient_email # 设置收件人message['subject'] = "Python发送邮箱测试标题信息" # 设置标题信息
body = "Python发送邮箱测试正文内容" # 正文内容
message.set_content(body) # 设置邮件正文内容# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25) # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password) # 登录邮箱# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())# 6、关闭连接
server.quit()
运行结果,我的邮箱收到了发送的邮件:

3.4 发送图片格式邮件
案例代码(注意下面代码需要更改发件人邮箱、授权码、收件人邮箱和图片路径,如果不想要正文文字内容也可以注释掉):
import smtplib # 导入smtplib模块
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os# 1、设置发件人邮箱和授权码
sender_email = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码' # 邮箱SMTP的授权码(看上文获取)# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己# 3、创建邮件内容
message = MIMEMultipart() # 创建EmailMessage对象
message['From'] = sender_email # 设置发件人
message['To'] = recipient_email # 设置收件人message['subject'] = "Python发送邮箱测试标题信息" # 设置标题信息
body = MIMEText("Python发送美女图片") # 正文内容
message.attach(body) # 设置邮件正文内容# 添加图片附件
image_path = '1.png' # 图片文件路径
if os.path.exists(image_path):with open(image_path, 'rb') as image_file:image = MIMEImage(image_file.read(), name=os.path.basename(image_path))message.attach(image)# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25) # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password) # 登录邮箱# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())# 6、关闭连接
server.quit()
运行结果,发送成功:

3.5 发送指定文件夹下所有内容
下面是我准备的文件:

案例代码(注意下面代码需要更改发件人邮箱、授权码、收件人邮箱和文件夹路径,如果不想要正文文字内容也可以注释掉):
import smtplib # 导入smtplib模块
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os# 1、设置发件人邮箱和授权码
sender_email = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码' # 邮箱SMTP的授权码(看上文获取)# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己# 3、创建邮件内容
message = MIMEMultipart() # 创建EmailMessage对象
message['From'] = sender_email # 设置发件人
message['To'] = recipient_email # 设置收件人message['subject'] = "Python发送邮箱测试标题信息" # 设置标题信息
body = MIMEText("Python发送指定文件夹下所有内容") # 正文内容
message.attach(body) # 设置邮件正文内容# 指定文件夹路径
folder_path = r'E:\Python3.10\测试文件夹' # 文件夹路径
# 遍历文件夹下所有文件
for filename in os.listdir(folder_path):file_path = os.path.join(folder_path, filename)if os.path.isfile(file_path):attachment = open(file_path, 'rb')# 添加附件part = MIMEBase('application', 'octet-stream')part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header('Content-Disposition', f'attachment; filename= {filename}')message.attach(part)# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25) # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password) # 登录邮箱# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())# 6、关闭连接
server.quit()
运行结果,收到了指定文件夹下所有内容:

相关文章:
100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)
文章目录 专栏导读案例说明一、smtplib模块是什么?1.1 模块介绍1.2 SMTP参数说明1.3 SMTP常用方法 二、email模块是什么?1.1 模块介绍1.2 常用类说明 三、案例实战3.1 获取授权码3.2 代码步骤3.3 发送文本格式邮件3.4 发送图片格式邮件3.5 发送指定文件夹…...
redisTemplate.opsForValue()
redisTemplate 在Spring Data Redis中,redisTemplate 是一个非常重要的组件,它为开发者提供了各种操作 Redis 的方法。对于 opsForValue() 方法,它是用来获取一个操作字符串值的操作对象。这意味着你可以使用它来执行各种字符串相关的操作…...
多线程事务如何回滚?
背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败&am…...
医院如何筛选安全合规的内外网文件交换系统?
医院内外网文件交换系统是专为医疗机构设计的,用于在内部网络(内网)和外部网络(外网)之间安全、高效地传输敏感医疗数据和文件的解决方案。这种系统对于保护患者隐私、遵守医疗数据保护法规以及确保医疗服务的连续性和…...
C51 单片机学习(一):基础外设
参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机(Micro Controller Unit,简称 MCU) 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处…...
Docker容器引擎镜像创建
目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统(…...
布尔逻辑与逻辑门
计算机为什么使用二进制: 计算机的元器件晶体管只有 2 种状态,通电(1)& 断电(0),用二进制可直接根据元器件的状态来设计计算机。而且,数学中的“布尔代数”分支,可以…...
opencv-python计算视频光流
光流基本概念 光流表示的是相邻两帧图像中每个像素的运动速度和运动方向。具体:光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系…...
Spring 中获取 Bean 对象的三种方式
目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean(好的解决方法) 假设 Bean 对象是 User,并存储到 Spring 中,注册到 xml 文件中 public class User {public String sayHi(){retur…...
centos系统安装Ward服务器监控工具
简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…...
计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )
文章目录 为什么要数据交换?总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…...
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
阅读导航 引言一、设计模式概念(了解)二、单例模式1. 饿汉模式(1)概念(2)模拟实现(3)优缺点(4)适用场景 2. 懒汉模式(1)概念ÿ…...
【创建vue项目的两种方式】
Vue环境搭建 NodeJs安装包安装淘宝镜像 环境搭建webpack安装全局安装vue/cli查看模板创建项目1.webpack2. vue-cli NodeJs安装包 下载链接:官网链接 下载下来后,直接傻瓜式的安装即可。 通过在cmd控制台输入以下命令查看是否安装成功 node -v因为适配某…...
2. HarmonyOS应用开发DevEcoStudio准备-1
2. HarmonyOS应用开发DevEcoStudio准备-1 下载 DevEco Studio 进入HUAWEI DevEco Studio产品页产品页。 单击下载列表右侧的按钮,下载 DevEco Studio。 安装 DevEco Studio 下载完成后,双击下载的 deveco-studio-xxxx.exe,进入 DevEco St…...
《二叉树》——3(层序遍历)
目录 前言: 层序遍历: 解析: 前言: 本文主讲链式二叉树的层序遍历,在前面的张篇blog我们初步实现了链式二叉树递归部分的内容,对于递归算法的学习和思维方式我们仍然需要不断加强,所以将对链式二叉树进行…...
HarmonyOS应用开发者基础认证考试答案
HarmonyOS应用开发者基础认证考试答案 一、判断题 1.Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(True) 2.所有使用Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide…...
【前端素材】bootstrap3 实现地产置业公司source网页设计
一、需求分析 地产置业公司的网页通常是该公司的官方网站,旨在向访问者提供相关信息和服务。这些网页通常具有以下功能: 公司介绍:网页通常包含有关公司背景、历史、核心价值观和使命等方面的信息。此部分帮助访问者了解公司的身份和目标。 …...
C++ 数论相关题目 博弈论 Nim游戏
给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先手是否必胜。 输入格式…...
机器学习---无偏估计
1. 如何理解无偏估计 无偏估计:就是我认为所有样本出现的概率⼀样。 假如有N种样本我们认为所有样本出现概率都是 1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲 的平均值。数学期望本质就 是平均值。 2. 无偏估计为何叫做“无偏”࿱…...
C语言基础13
今天是学习嵌入式相关内容的第十四天,以下是今日所学内容 1.结构体: 1.结构体类型定义 2.结构体变量的定义 3.结构体元素的访问 4.结构体的存储 内存对齐 结构体整体的大小必须为最大基本类型长度的整数倍 5.结构体作为函数参数 值传递 练习:定…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
