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

Python-实现邮件发送:flask框架或django框架可以直接使用

在项目中,会使用到发送邮件的功能。不同框架的配置可能有所不同,直接写一个不依赖框架配置的邮件发送模块。
使用的功能:

1、可以发送给多个邮箱

2、可以实现抄送多个邮箱

3、可以添加多个文件附件

一、不使用多线程

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header
from email.utils import formataddr
from threading import Threadclass Email:EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.comEMAIL_PORT = 587  # qq邮箱服务的端口:465、587EMAIL_HOST_USER = "xxx@qq.com"  # 发送邮件的邮箱帐号EMAIL_HOST_PASSWORD = "xxx"  # 授权码,各邮箱的设置中启用smtp服务时获取FROM_EMAIL_USER = EMAIL_HOST_USER  # 收件人显示发件人的邮箱FROM_EMAIL_NAME = '广州市xxxx技术有限公司'  # 设置发件人的名字,在项目使用,一般是用公司名字def __init__(self, receiver_email, subject, message=None, html_message=None, file_path=None,cc_email=None):self.receiver_email = receiver_email # 接收人邮件self.cc_email = cc_email #邮件抄送人self.subject = subject  # 邮件的主题self.message = message  # 邮件文本内容self.html_message = html_message  # 邮件的html内容  注意:文本内容与html同时有的时候,html覆盖文本内容self.file_path = file_path  # 附件文件的路径,str 或 [str,]self.email = MIMEMultipart() #创建一个邮件对象,发送的邮件的信息都设置到这个对象中#接收人邮件:必须有if type(receiver_email) in [list,str,tuple]:if type(receiver_email) in [list,tuple]:self.receiver_email = ','.join(receiver_email)else:raise Exception('邮件抄送人必须是字符串、列表或元组形式')#抄送人邮件: 可选if cc_email:if type(cc_email) in [list,str,tuple]:if type(cc_email) in [list,tuple]:self.cc_email = ','.join(cc_email)else:raise Exception('邮件抄送人必须是字符串、列表或元组形式')def start(self):# 1、设置邮箱对象的发送人、接收人和主题self.email['From'] = formataddr((self.FROM_EMAIL_NAME, self.FROM_EMAIL_USER))self.email['To'] = self.receiver_emailself.email['Subject'] = Header(self.subject, 'utf-8')self.email['Cc'] = self.cc_email# 2、设置内容,如果同时attach了html信息和文本信息,文本信息会被转成附件文件。if not self.message and not self.html_message:raise Exception('发送的邮件每月携带任何内容...')if self.html_message:self.email.attach(MIMEText(self.html_message, 'html', 'utf-8'))else:self.email.attach(MIMEText(self.message, 'plain', 'utf-8'))# 3、邮箱的附件文件if self.file_path != None:if isinstance(self.file_path, str):self.file_path = [self.file_path]elif isinstance(self.file_path, list):passelse:raise Exception('邮件携带的附件,格式是文件字符串路径,就列表套文件字符串路径,不能是其他格式')for path in self.file_path:with open(path, "rb") as attachment:part = MIMEBase("application", "octet-stream")part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header("Content-Disposition",f"attachment; filename= {path}",)self.email.attach(part)# 4、连接smtp服务器,发送邮件with smtplib.SMTP(self.EMAIL_HOST, self.EMAIL_PORT) as server:# QQ邮箱的服务器域名和端口server.starttls()  # 使用 TLS 加密连接# 使用qq邮箱登录:邮箱号和授权码server.login(self.EMAIL_HOST_USER, self.EMAIL_HOST_PASSWORD)# 发送邮件,发送的是邮箱对象server.send_message(self.email)if __name__ == '__main__':receiver_email = ['xxx@163.com','yyy@qq.com'] #接收人邮件账号cc_email = ['xxxx@163.com','yyy@qq.com'] #抄送人的邮件账号subject = '登录验证码' #主题message = '您的验证码是234523,10分钟中内有效,若非本人操作请忽视...' #文本信息file_path = ['1.txt', '2.txt'] #同目录下创建1.txt和2.txt 文件,测试附件文件html_message = '<h1>登录验证码,5分钟内有效</h1><p>您的验证码是:546783</p><p>注意:若非本人操作,建议删除邮件防止泄漏验证码信息</p>' #html信息,有这个使用这个不使用文本信息#非多线程发送email_obj_2 = Email(receiver_email=receiver_email,subject=subject,message=message,file_path=file_path,html_message=html_message,cc_email=cc_email)email_obj_2.start()

二、使用线程封装

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header
from email.utils import formataddr
from threading import Threadclass ThreadEmail(Thread):EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.comEMAIL_PORT = 587  # qq邮箱服务的端口:465、587EMAIL_HOST_USER = "xxx@qq.com"  # 发送邮件的邮箱帐号EMAIL_HOST_PASSWORD = "xxx"  # 授权码,各邮箱的设置中启用smtp服务时获取FROM_EMAIL_USER = EMAIL_HOST_USER  # 收件人显示发件人的邮箱FROM_EMAIL_NAME = '广州市xxxx技术有限公司'#设置发件人的名字,在项目使用,一般是用公司名字def __init__(self, receiver_email, subject, message=None, html_message=None, file_path=None,cc_email=None):super().__init__()self.receiver_email = receiver_email  # 接收人邮件self.cc_email = cc_email  # 邮件抄送人self.subject = subject  # 邮件的主题self.message = message  # 邮件文本内容self.html_message = html_message  # 邮件的html内容  注意:文本内容与html同时有的时候,html覆盖文本内容self.file_path = file_path  # 附件文件的路径,str 或 [str,]self.email = MIMEMultipart()  # 创建一个邮件对象,给这个对象添加 邮件需要的各种信息# 接收人邮件:必须有if type(receiver_email) in [list, str, tuple]:if type(receiver_email) in [list, tuple]:self.receiver_email = ','.join(receiver_email)else:raise Exception('邮件抄送人必须是字符串、列表或元组形式')# 抄送人邮件: 可选if cc_email:if type(cc_email) in [list, str, tuple]:if type(cc_email) in [list, tuple]:self.cc_email = ','.join(cc_email)else:raise Exception('邮件抄送人必须是字符串、列表或元组形式')def run(self) -> None:# 1、设置邮箱对象的发送人、接收人和主题self.email['From'] = formataddr((self.FROM_EMAIL_NAME, self.FROM_EMAIL_USER))self.email['To'] = self.receiver_emailself.email['Subject'] = Header(self.subject, 'utf-8')self.email['Cc'] = self.cc_email# 2、设置内容,如果同时attach了html信息和文本信息,文本信息会被转成附件文件。if not self.message and not self.html_message:raise Exception('发送的邮件每月携带任何内容...')if self.html_message:self.email.attach(MIMEText(self.html_message, 'html', 'utf-8'))else:self.email.attach(MIMEText(self.message, 'plain', 'utf-8'))# 3、邮箱的附件文件if self.file_path != None:if isinstance(self.file_path, str):self.file_path = [self.file_path]elif isinstance(self.file_path, list):passelse:raise Exception('邮件携带的附件,格式是文件字符串路径,就列表套文件字符串路径,不能是其他格式')for path in self.file_path:with open(path, "rb") as attachment:part = MIMEBase("application", "octet-stream")part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header("Content-Disposition",f"attachment; filename= {path}",)self.email.attach(part)# 4、连接smtp服务器,发送邮件with smtplib.SMTP(self.EMAIL_HOST, self.EMAIL_PORT) as server:# QQ邮箱的服务器域名和端口server.starttls()  # 使用 TLS 加密连接# 使用qq邮箱登录:邮箱号和授权码server.login(self.EMAIL_HOST_USER, self.EMAIL_HOST_PASSWORD)# 发送邮件,发送的是邮箱对象server.send_message(self.email)if __name__ == '__main__':receiver_email = ['xxx@163.com','yyy@qq.com'] #接收人邮件账号cc_email = ['xxxx@163.com','yyy@qq.com'] #抄送人的邮件账号subject = '登录验证码' #主题message = '您的验证码是234523,10分钟中内有效,若非本人操作请忽视...' #文本信息file_path = ['1.txt', '2.txt'] #同目录下创建1.txt和2.txt 文件,测试附件文件html_message = '<h1>登录验证码,5分钟内有效</h1><p>您的验证码是:546783</p><p>注意:若非本人操作,建议删除邮件防止泄漏验证码信息</p>' #html信息,有这个使用这个不使用文本信息#多线程发送email_obj = ThreadEmail(receiver_email=receiver_email,subject=subject,message=message,file_path=file_path,html_message=html_message,cc_email=cc_email)email_obj.start()

三、通用性

1、对于脚本代码,也可以直接使用

2、在框架中,也可以直接使用

相关文章:

Python-实现邮件发送:flask框架或django框架可以直接使用

在项目中&#xff0c;会使用到发送邮件的功能。不同框架的配置可能有所不同&#xff0c;直接写一个不依赖框架配置的邮件发送模块。 使用的功能&#xff1a; 1、可以发送给多个邮箱 2、可以实现抄送多个邮箱 3、可以添加多个文件附件 一、不使用多线程 import smtplib from…...

使用亚马逊云科技Amazon SageMaker,为营销活动制作广告素材

广告公司可以使用生成式人工智能和文字转图像根基模型&#xff0c;制作创新的广告素材和内容。在本篇文案中&#xff0c;将演示如何使用亚马逊云科技Amazon SageMaker从现有的基本图像生成新图像&#xff0c;这是一项完全托管式服务&#xff0c;用于大规模构建、训练和部署机器…...

conda环境安装opencv带cuda版本

主要是cmake编译选项需要修改 以下两个选项按照自己情况修改 -D OPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-12.2 \ 其中/home/lixin/anaconda3/envs/stereo 改成你自己的conda环境 cmake -D CMAKE_BUILD_TYPER…...

R语言中的数据结构----矩阵

目录 &#xff08;1&#xff09;创建矩阵 &#xff08;2&#xff09; 线性代数运算 &#xff08;3&#xff09;矩阵索引 &#xff08;4&#xff09;矩阵元素的筛选 &#xff08;5&#xff09;增加或删除矩阵的行或列 &#xff08;6&#xff09;apply()函数 &#xff08;…...

Llama-2 推理和微调的硬件要求总结:RTX 3080 就可以微调最小模型

大语言模型微调是指对已经预训练的大型语言模型&#xff08;例如Llama-2&#xff0c;Falcon等&#xff09;进行额外的训练&#xff0c;以使其适应特定任务或领域的需求。微调通常需要大量的计算资源&#xff0c;但是通过量化和Lora等方法&#xff0c;我们也可以在消费级的GPU上…...

C++多线程的用法(包含线程池小项目)

一些小tips: 编译命令如下&#xff1a; g 7.thread_pool.cpp -lpthread 查看运行时间&#xff1a; time ./a.out 获得本进程的进程id&#xff1a; this_thread::get_id() 需要引入的库函数有&#xff1a; #include<thread> // 引入线程库 #include<mutex> //…...

react ant ice3 实现点击一级菜单自动打开它下面最深的第一个子菜单

1.问题 默认的如果没有你的菜单结构是这样的&#xff1a; [{children: [{name: "通用配置"parentId: "1744857774620672"path: "basic"}],name: "系统管理"parentId: "-1"path: "system"} ]可以看到每层菜单的p…...

关于 Qt串口不同电脑出现不同串口号打开失败 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/132842297 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…...

可观测性在灰度发布中的应用

前言 随着云计算的发展、云原生时代的来临&#xff0c;企业数字化转型进程不断深入&#xff0c;应用开发也越来越多地基于微服务化模式&#xff0c;快速迭代的能力使得应用开发更高效、更灵活。同时&#xff0c;也不得不面临应用版本快速升级所带来的的巨大挑战。 传统的发布方…...

vscode开发油猴插件环境配置指南

文章目录 一、环境配置1.1油猴插件开始编写代码1.2油猴插件配置1.2.1浏览器插件权限1.2.2插件自身权限 2. 油猴脚本API学习2.1 头文件2.2 油猴API 一、环境配置 1.1油猴插件开始编写代码 在vscode 中写入如下代码‘ // UserScript // name cds_test // namespace …...

网站不收录没排名降权怎么处理-紧急措施可恢复网站

网站降权对于SEO人员来说是非常致命的打击&#xff0c;因为网站一旦被搜索引擎降权&#xff0c;排名会严重地下降&#xff0c;网站的流量也会大幅下降&#xff0c;直接影响到收益。而且处理不好的话会导致恢复的时间周期无限拉长&#xff0c;所以网站被降权后我们要第一时间采取…...

C++vector模拟实现

vector模拟实现 1.构造函数2.拷贝构造3.析构赋值运算符重载4.iterator5.modifiers5.1push_back5.2pop_back5.3empty5.4insert5.5erase5.6swap 6.Capacity6.1size6.2capacity6.3reserve6.4resize6.5empty 7.Element access7.1operator[]7.2at 8.在谈reserve vector官方库实现的是…...

《DATASET DISTILLATION》

这篇文章提出了数据浓缩的办法&#xff0c;在前面已有的知识浓缩&#xff08;压缩模型&#xff09;的经验上&#xff0c;提出了不压缩模型&#xff0c;转而压缩数据集的办法&#xff0c;在压缩数据集上训练模型得到的效果尽可能地接近原始数据集的效果。 摘要 模型蒸馏的目的是…...

GDPU 数据结构 天码行空1

1. 病历信息管理 实现病历查询功能。具体要求如下: 定义一个结构体描述病人病历信息(病历号,姓名,症状)&#xff1b;完成功能如下: 输入功能:输入5个病人的信息&#xff1b; 查询功能:输入姓名&#xff0c;在5个病历中进行查找&#xff0c;如果找到则显示该人的信息&#xff0c…...

【C++】红黑树的模拟实现

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…...

【多线程】Thread 类 详解

Thread 类 详解 一. 创建线程1. 继承 Thread 类2. 实现 Runnable 接口3. 其他变形4. 多线程的优势-增加运行速度 二. Thread 类1. 构造方法2. 常见属性3. 启动线程-start()4. 中断线程-interrupt()5. 线程等待-join()6. 线程休眠-sleep()7. 获取当前线程引用 三. 线程的状态1. …...

LINUX 网络管理

目录 一、NetworkManager的特点 二、配置网络 1、使用ip命令临时配置 1&#xff09;查看网卡在网络层的配置信息 2&#xff09;查看网卡在数据链路层的配置信息 3&#xff09;添加或者删除临时的网卡 4&#xff09;禁用和启动指定网卡 2、修改配置文件 3、nmcli命令行…...

refresh rate

1920 x 1080 显卡刷新率 60...

使用 NGINX Unit 实施应用隔离

原文作者&#xff1a;Artem Konev - Senior Technical Writer 原文链接&#xff1a;使用 NGINX Unit 实施应用隔离 转载来源&#xff1a;NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn NGINX Unit 特性集的最新动态之一是支持应用隔离&#xff0c;该特…...

2023/09/12 qtc++

实现一个图形类(Shape) &#xff0c;包含受保护成员属性:周长、面积&#xff0c; 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle) &#xff0c;继承自图形类&#xff0c;包含私有属性:半径 公共成员函数:特殊成员函数…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...