当前位置: 首页 > news >正文

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支持主要依赖于smtplibemail两个模块。其中,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模块提供了一些常用的类来处理邮件的构建和解析。以下是一些常用的类及其功能说明:

  1. email.message.Message类:

    • 用于表示邮件消息的基本类,可以用来创建新的邮件消息或解析现有的邮件消息。
    • 可以通过添加头部信息、设置正文内容等来构建邮件消息。
  2. email.mime.text.MIMEText类:

    • 用于表示文本类型的MIME邮件,可以处理纯文本邮件的创建和解析。
    • 可以设置文本内容、字符集等属性。
  3. email.mime.multipart.MIMEMultipart类:

    • 用于表示多部分邮件,可以包含多个子类型的邮件体,如文本、HTML、附件等。
    • 可以添加子类型的邮件体,并设置邮件的头部信息。
  4. email.mime.image.MIMEImage类:

    • 用于表示图像类型的MIME邮件,可以处理图像类型的邮件。
    • 可以设置图像内容、图像类型等属性。
  5. 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.联合文件系统&#xff08…...

布尔逻辑与逻辑门

计算机为什么使用二进制: 计算机的元器件晶体管只有 2 种状态,通电(1)& 断电(0),用二进制可直接根据元器件的状态来设计计算机。而且,数学中的“布尔代数”分支,可以…...

opencv-python计算视频光流

光流基本概念 光流表示的是相邻两帧图像中每个像素的运动速度和运动方向。具体:光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xf…...

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)概念&#xff…...

【创建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. 无偏估计为何叫做“无偏”&#xff1…...

C语言基础13

今天是学习嵌入式相关内容的第十四天,以下是今日所学内容 1.结构体: 1.结构体类型定义 2.结构体变量的定义 3.结构体元素的访问 4.结构体的存储 内存对齐 结构体整体的大小必须为最大基本类型长度的整数倍 5.结构体作为函数参数 值传递 练习:定…...

【Java】Maven配置加载到全局

Maven配置加载到全局 <build><plugins><plugin><artifactId>maven-resources-plugin</artifactId><configuration><encoding>utf-8</encoding><useDefaultDelimiters>true</useDefaultDelimiters></configura…...

右手螺旋线定则

通电螺线管中的安培定则&#xff08;安培定则二&#xff09;&#xff1a;用右手握住通电螺线管&#xff0c;让四指指向电流的方向&#xff0c;那么大拇指所指的那一端是通电螺线管的N极。...

2024 高级前端面试题之 React 「精选篇」

该内容主要整理关于 React 模块的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 React模块精选篇 1. 如何理解React State不可变性的原则2. JSX本质3. React合成事件机制4. setState和batchUpdate机制5. 组件渲染和更新过程6. Diff算法相…...

OSPF协议解析及相关技术探索(C/C++代码实现)

OSPF&#xff08;开放最短路径优先&#xff09;是一种用于自治系统&#xff08;AS&#xff09;内部的路由协议&#xff0c;它是基于链路状态算法的。OSPF的设计目的是为了提供一种可扩展、快速收敛和高效的路由解决方案。 OSPF概念和特点 概念 自治系统&#xff08;AS&#…...

如何恢复已删除的照片?

在这篇综合文章中发现恢复丢失照片的有效且免费的方法。无论您使用的是智能手机、iPhone、Windows 计算机、Mac、SD 卡还是数码相机&#xff0c;我们都提供有关如何恢复已删除照片的分步说明。此外&#xff0c;学习一些有价值的技巧&#xff0c;以防止将来意外删除照片。 意外…...

VMware虚拟机安装macOS

VMware虚拟机安装macOS 文章目录 VMware虚拟机安装macOS先看效果一、准备工作①&#xff1a;镜像资源下载②&#xff1a;虚拟机③&#xff1a;安装macOS所必要的插件 二、开始安装①&#xff1a;创建新的虚拟机②&#xff1a;自定义硬件③&#xff1a;开启虚拟机 先看效果 一、…...

API管理协作工具:Apipost

相信无论是前端&#xff0c;还是后端的测试和开发人员&#xff0c;都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致&#xff0c;导致协作低效、频繁出问题&#xff0c;开发测试人员痛苦不堪。 API管理的难点在哪&#xff1f; 开发人员在 …...

GPT-SoVITS 本地搭建踩坑

GPT-SoVITS 本地搭建踩坑 前言搭建下载解压VSCode打开安装依赖包修改内容1.重新安装版本2.修改文件内容 运行总结 前言 传言GPT-SoVITS作为当前与BertVits2.3并列的TTS大模型&#xff0c;于是本地搭了一个&#xff0c;简单说一下坑。 搭建 下载 到GitHub点击此处下载 http…...

【教学类-34-02】20240130纸尺2.0 (A4横版5条,刻度25*5=125CM,有图案)

作品展示&#xff1a; 背景需求&#xff1a; 设计了纸尺的基本模板 【教学类-34-01】20240130纸尺1.0 &#xff08;A4横版5条&#xff0c;刻度25*5125CM&#xff09;-CSDN博客文章浏览阅读194次&#xff0c;点赞5次&#xff0c;收藏5次。【教学类-34-01】20240130纸尺1.0 &am…...

iText操作pdf

最近有个任务是动态的创建pdf根据获取到的内容&#xff0c;百度到的知识点都比较零散&#xff0c;官方文档想必大家也不容易看懂。下文是我做出的汇总 public class CreatePdfUtils {public static void create(){//准备File file new File("C:\\code\\base-project-back…...