yagmail邮件发送库:如何用Python实现自动化邮件营销?
🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容
🌸个人主页: 长风清留杨的博客
🍃形式准则: 无论成就大小,都保持一颗谦逊的心,尊重他人,虚心学习。
✨推荐专栏: Python入门到入魔,Mysql入门到入魔,Python入门基础大全,Flink入门到实战
🍂若缘分至此,无法再续相逢,愿你朝朝暮暮,皆有安好,晨曦微露道早安,日中炽热说午安,星河长明寄晚安🍂
在Python编程中,发送电子邮件是一个常见的需求,无论是用于自动化报告、用户通知还是简单的信息交换。yagmail库以其简洁的API和强大的功能,成为了众多开发者发送邮件的首选工具。
一、yagmail简介
1.1 什么是yagmail?
yagmail是一个Python库,旨在简化通过SMTP协议发送电子邮件的过程。它封装了底层的SMTP连接细节,提供了直观的接口,让开发者能够以最少的代码实现邮件发送功能。
1.2 主要特点
易用性:极简的API设计,几行代码即可发送邮件。
安全性:支持SSL/TLS加密,保护邮件数据。
附件支持:轻松附加文件,包括图片、PDF等。
HTML邮件:支持HTML格式的邮件内容,提升邮件表现力。
多收件人:支持单个或多个收件人,以及CC(抄送)和BCC(密送)。
1.3 关键参数
参数名称 | 描述 | 示例值 |
---|---|---|
user | 发送邮件的邮箱账号 | 'your_email@qq.com' |
password | 邮箱的登录密码或授权码(注意:不建议在代码中硬编码密码,建议使用环境变量或配置文件存储) | 'your_password_or_auth_code' |
host | SMTP服务器地址,根据邮箱服务提供商不同而有所差异(例如QQ邮箱为’smtp.qq.com’) | 'smtp.qq.com' |
port | SMTP服务器端口,默认为25,但出于安全考虑,常使用加密端口如465或587 | 465 或 587 |
ssl | 是否使用SSL加密连接,通常与端口465配合使用 | True /False |
starttls | 是否启用STARTTLS加密(对于支持STARTTLS的服务器),通常与端口587配合使用 | True /False |
to | 收件人的邮箱地址,可以是一个字符串或字符串列表(支持多个收件人) | 'recipient@example.com' 或 ['recipient1@example.com', 'recipient2@example.com'] |
subject | 邮件的主题 | '邮件主题' |
contents | 邮件的正文内容,可以是字符串、HTML或包含附件的列表 | '邮件内容' 或 '<h1>HTML邮件</h1>' 或 ['正文1', '正文2'] (当为列表时,通常用于多部分邮件) |
attachments | 附件的路径,可以是一个字符串或路径列表(支持多个附件) | '/path/to/attachment.txt' 或 ['/path/to/attachment1.txt', '/path/to/attachment2.pdf'] |
cc | 抄送邮件的地址列表,将邮件同时发送给收件人以外的人 | ['cc_recipient1@example.com', 'cc_recipient2@example.com'] |
bcc | 密送邮件的地址列表,与抄送不同的是收件人看不到其他人的邮箱地址 | ['bcc_recipient1@example.com', 'bcc_recipient2@example.com'] |
headers | 自定义邮件头部信息,传递字典参数 | {'Reply-To': 'noreply@example.com', 'X-Priority': '1'} |
preview_only | 布尔型,表示仅预览邮件而不实际发送,可以用于测试邮件内容是否正确 | True /False |
from_ | 指定发件人的邮箱地址(注意:下划线是参数名的一部分,不是拼写错误) | 'another_email@example.com' (用于伪装发件人地址,但需注意邮件服务提供商的政策) |
debug | 是否开启调试模式,输出更多日志信息,有助于排查邮件发送过程中的问题 | True /False |
二、安装yagmail
2.1 安装方法
yagmail可以通过Python的包管理工具pip进行安装。在命令行中运行以下命令:
pip install yagmail
2.2 依赖项
yagmail依赖于smtplib(Python标准库的一部分)和requests库来处理HTTP请求(主要用于验证某些邮件服务)。
三、基本用法
3.1 配置SMTP服务器
在发送邮件之前,您需要配置SMTP服务器的信息,包括服务器地址、端口、用户名和密码。
3.2 发送简单文本邮件
以下是一个发送简单文本邮件的示例:
import yagmail# 连接到SMTP服务器
yag = yagmail.SMTP('your_email@example.com', 'your_password')# 发送邮件
yag.send('recipient@example.com', 'Subject', 'This is the body of the email.')
3.3 发送HTML邮件
yagmail同样支持发送HTML格式的邮件:
# 发送HTML邮件
yag.send('recipient@example.com', 'Subject', contents=['<h1>Hello World!</h1>'])
四、高级功能
4.1 添加附件
yagmail允许您轻松添加附件:
# 发送带有附件的邮件
yag.send('recipient@example.com', 'Subject', 'Here is your report.', attachments=['path/to/report.pdf'])
4.2 多收件人处理
您可以同时向多个收件人发送邮件,也可以设置抄送和密送:
# 多收件人
recipients = ['user1@example.com', 'user2@example.com']
yag.send(recipients, 'Subject', 'Message for multiple recipients.')# 抄送和密送
yag.send('user1@example.com', 'Subject', 'Message', cc=['user2@example.com'], bcc=['user3@example.com'])
4.3 自定义邮件头
您可以自定义邮件头信息,如回复地址、优先级等:
# 自定义邮件头
yag.send('recipient@example.com', 'Subject', 'Message', headers={'Reply-To': 'noreply@example.com', 'X-Priority': '1'})
五、错误处理与调试
5.1 常见错误
- 认证失败:检查用户名和密码是否正确。
- SMTP连接错误:确认SMTP服务器地址和端口无误,且服务器允许您的IP地址连接。
- 附件发送失败:确保附件路径正确,且文件可读。
5.2 调试技巧
- 开启调试模式:通过yagmail.SMTP的debug参数开启调试模式,获取更多发送过程中的日志信息。
- 检查邮件日志:查看邮件服务器的日志,了解邮件是否被成功接收或被拒绝的原因。
六、最佳实践
6.1 安全性
- 环境变量:避免在代码中硬编码敏感信息,如邮箱密码,建议使用环境变量或配置文件存储。
- OAuth2认证:对于支持OAuth2的邮件服务(如Gmail),使用OAuth2令牌代替密码进行认证,提高安全性。
6.2 性能优化
- 批量发送:如果需要发送大量邮件,考虑使用批量发送功能或分批发送,以减少服务器压力。
- 异步处理:对于实时性要求不高的邮件发送任务,可以使用异步编程模型,提高程序响应速度。
七、实例演示:发送带附件的HTML邮件
7.1 代码示例
import yagmail# 连接到SMTP服务器
yag = yagmail.SMTP('your_email@example.com', 'your_password')# 邮件内容
subject = 'Monthly Report'
body = '''
<h1>Monthly Sales Report</h1>
<p>Please find the attached report for the month of October.</p>
'''
attachments = ['/path/to/report.xlsx']# 发送邮件
yag.send('recipient@example.com', subject, body, attachments=attachments)
7.2 关键点总结
- SMTP配置:正确配置SMTP服务器信息。
- 邮件格式:使用HTML格式增强邮件可读性。
- 附件处理:确保附件路径正确,且文件类型支持。
八、总结
yagmail以其简洁的API和丰富的功能,为Python开发者提供了一个高效、安全的邮件发送解决方案。无论是简单的文本邮件,还是复杂的HTML邮件加附件,yagmail都能轻松应对。
相关文章:
yagmail邮件发送库:如何用Python实现自动化邮件营销?
🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…...
vue elementui layout布局组件实现规则的弹性布局
背景:遇到在一个容器里,采用弹性盒布局的时候,如果元素个数改变,元素的排列会错乱。 解决方式 方式一:之前遇到的时候,是采用计算元素个数的方式,采用透明元素补齐的方式(比如一个有…...
Python虚拟环境管理工具:Pipenv
Python虚拟环境管理工具:Pipenv 前言1. Pipenv的功能和特点2. 安装Pipenv3. 基本使用3.1 创建项目并初始化 Pipenv3.2 使用虚拟环境3.3 安装开发依赖3.4 查看当前依赖3.5 锁定依赖3.6 升级依赖3.7 卸载依赖 4. Pipenv vs. Poetry5. 常见问题 总结 前言 Pipenv 是一个…...
Tomcat使用教程
下载地址:https://tomcat.apache.org/ 配置环境变量 变量名: CATALINA_HOME 变量值: D:\tools\apache-tomcat-9.0.97 Path: %CATALINA_HOME%\bin 启动Tomcat(打开命令提示符) startup.bat 解决乱码问题(打开conf\logging.properties) java.util.logging.Conso…...
Flink历史服务器-History Server
在以session模式提交作业后,我们可以在session集群里查看作业的详细信息,但是假如session集群重启后,则不能再查看到之前作业的信息;或者以yarn application或per-job或k8s application模式提交,都存在一个问题,就是在作业完成后(即Flink集群关闭),无法查看作业信息,…...
redis核心命令全局命令 + redis 常见的数据结构 + redis单线程模型
文章目录 一. 核心命令1. set2. get 二. 全局命令1. keys2. exists3. del4. expire5. ttl6. type 三. redis 常见的数据结构及内部编码四. redis单线程模型 一. 核心命令 1. set set key value key 和 value 都是string类型的 对于key value, 不需要加上引号, 就是表示字符串…...
Java后端请求想接收多个对象入参的数据方法
在Java后端开发中,如果我们希望接收多个对象作为HTTP请求的入参,可以使用Spring Boot框架来简化这一过程。Spring Boot提供了强大的RESTful API支持,能够方便地处理各种HTTP请求。 1.示例:使用Spring Boot接收包含多个对象的HTTP…...
傅里叶变换FT——DFT——FFT(三者之间的关系)
FT 周期函数 f(t) 的傅里叶变换实质上是将函数信号分解为不同频率、不同幅值的正、余弦信号,如下图所示。换言之,无数个不同频率,不同幅值的正、余弦信号来不断逼近周期函数 f(t) 。 分解出的这些信号的频率都是基频 ω0 的整数倍࿰…...
华为HarmonyOS 让应用快速拥有账号能力 -- 2 获取用户头像昵称
场景介绍 如应用需要完善用户头像昵称信息,可使用Account Kit提供的头像昵称授权能力,用户允许应用获取头像昵称后,可快速完成个人信息填写。以下只针对Account kit提供的头像昵称授权能力进行介绍,若要获取头像还可通过场景化控…...
git命令-基本使用
#git安装后-指定名称和邮箱: $ git config --global user.name "Your Name" $ git config --global user.email "emailexample.com" #查看远程分支: git branch -a #查看本地分支: git branch #切换分支: git checkout…...
学习笔记050——SpringBoot学习1
文章目录 Spring Boot1、Spring Boot 配置文件2、Spring Boot 整合视图层3、Spring Boot 整合持久层 Spring Boot Spring Boot 可以快速构建基于 Spring 的 Java 应用,可以快速整合各种框架,不需要开发者进行配置,Spring Boot 会实现自动装配…...
【前端开发】微信裁剪图片上传
Cropper.js: 一款基于 JavaScript 的开源图片裁剪神器,支持图片裁剪、缩放、旋转 HTML页面引用: css:<link rel"stylesheet" type"text/css" href"css/cropper.css" /> js:<sc…...
【Golang】WaitGroup 实现原理
文章目录 前言一、介绍二、实现原理三、使用方式四、总结 前言 在并发编程中,协调多个 goroutine 的执行顺序和同步是一个常见的需求。Golang 提供了 sync.WaitGroup 来简化这一过程。WaitGroup 允许主 goroutine 等待一组 goroutine 完成工作。本文将详细介绍 syn…...
从被动响应到主动帮助,ProActive Agent开启人机交互新篇章
在人工智能领域,我们正见证着一场革命性的变革。传统的AI助手,如ChatGPT,需要明确的指令才能执行任务。但现在,清华大学联合面壁智能等团队提出了一种全新的主动式Agent交互范式——ProActive Agent,它能够主动观察环境…...
框架模块说明 #05 权限管理_03
背景 权限设计可以分为两个主要方面:操作权限和数据权限。前两篇文章已经详细介绍了操作权限的设计与实现,以及如何将其与菜单关联起来的具体方法。本篇将聚焦于数据权限,为您深入讲解相关的设计与实现方式。 全局开关 Value("${syst…...
autogen-agentchat 0.4.0.dev8版本的安装
1. 安装命令 pip install autogen-agentchat0.4.0.dev8 autogen-ext[openai]0.4.0.dev82. 版本检查 import autogen_agentchat print(autogen_agentchat.__version__)0.4.0.dev8import autogen_ext print(autogen_ext.__version__)0.4.0.dev83. 第一个案例 使用 autogen-age…...
JavaScript实现tab栏切换
JavaScript实现tab栏切换 代码功能概述 这段代码实现了一个简单的选项卡(Tab)切换功能。它通过操作 HTML 元素的类名(class)来控制哪些选项卡(Tab)和对应的内容板块显示,哪些隐藏。基本思路是先…...
yarn install遇到问题处理
1、Yarn在尝试安装一个依赖项时遇到了问题。具体来说,这个错误指出期望提升(hoist)的包的manifest文件丢失了,这通常是因为缓存中的数据损坏或不一致所致。 解决方法:有以下两种 1、清除Yarn缓存:运行 yarn…...
量化交易系统开发-实时行情自动化交易-8.9.通达信平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于通达信平台介绍。 通达信…...
qt QAnimationDriver详解
1、概述 QAnimationDriver是Qt框架中提供的一个类,它主要用于自定义动画帧的时间控制和更新。通过继承和实现QAnimationDriver,开发者可以精确控制动画的时间步长和更新逻辑,从而实现丰富和灵活的动画效果。QAnimationDriver与QAbstractAnim…...
Nginx篇之实现nginx转发兼容HTTP和Websocket两种协议
Nginx实现同时兼容http协议和websocket协议 map $http_upgrade $eop_gateway {default "eop-gateway-http";websocket "eop-gateway-ws"; }# 控制 Connection header map $http_upgrade $connection_upgrade {default "keep-alive"; # HTTP …...
底部导航栏新增功能按键
场景需求: 在底部导航栏添加power案件,单击息屏,长按 关机 如下实现图 借此需求,需要掌握技能: 底部导航栏如何实现新增、修改、删除底部导航栏流程对底部导航栏部分样式如何修改。 比如放不下、顺序排列、坑点如…...
Mac安装MINIO服务器实现本地上传和下载服务
0.MINIO学习文档 Minio客户端mc使用 | Elibaron学习笔记 1.Mac安装MINIO 中文官方网址:MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 (1) brew 安装 brew install minio/stable/minio (2)安装完成,执行brew i…...
SpringMVC:参数传递之日期类型参数传递
环境准备和参数传递请见:SpringMVC参数传递环境准备 日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如: 2088-08-182088/08/1808/18/2088… 针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类…...
【C语言基础】斐波那契数列
相信你是最棒哒!!! 文章目录 题目描述 正确代码: 总结 题目描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数k,要求菲波那契数列中第k个数…...
Ubuntu无法连接Linux
检查网络连接 确保你的机器能够正常连接互联网。你可以尝试 ping 一下 GitHub 或其他网站,确认是否有网络问题: ping github.com如果无法 ping 通 GitHub,检查一下你的网络连接。 检查 GitHub 状态 有时候 GitHub 本身可能会出现服务故障。你…...
T5模型、GPT和BERT
目录 T5模型、GPT和BERT 一、T5模型 二、GPT模型 三、BERT模型(词嵌入模型,一个单词4096维度) 四、区别与联系 T5模型、GPT和BERT T5模型、GPT模型和BERT模型都是基于Transformer架构的预训练语言模型,但它们在设计目标、架构和应用上存在一些区别和联系: 1. **模型架…...
51c自动驾驶~合集39
我自己的原文哦~ https://blog.51cto.com/whaosoft/12707676 #DiffusionDrive 大幅超越所有SOTA!地平线DiffusionDrive:生成式方案或将重塑端到端格局? 近年来,由于感知模型的性能持续进步,端到端自动驾驶受到了来…...
ThinkPHP场景动态验证
一、缘由 今天在用thinkphp8写东西的时候发现,写验证器规则和场景优点费时间,就算用tinkphp的命令行生成也是生成一个空壳。内容还是要自己填写感觉麻烦。 就突发奇想能不能自动生成验证器,也不能是说自动生成验证器,生成验证其的…...
3D基因组工具(HiC可视化)trackc--bioinfomatics tools 35
01 3D genome data analysis guides 茶树三维基因组-文献精读19 https://trackc.readthedocs.io/en/latest/install.html #官网 https://github.com/seqyuan/trackc #官网https://trackc.readthedocs.io/en/latest/analysis_guide/index.html #HiC可视化案例 …...
Maven进阶
前言 我们这一节讲一下Maven 1. 分模块开发的意义 同一个程序我们按功能划分为不同的模块 同一个模块导成jar之类的,这样就可以共享数据了 2. 分模块开发与设计 我们以原来的ssm整合的模块来考虑 我们来把domain这个模块搞消失,重新制造一个模块 我们…...
【k8s】kubelet 的相关证书
在 Kubernetes 集群中,kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同,下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…...
我们来学mysql -- 事务并发之脏写(原理篇)
事务并发之脏写 题记脏写防止脏写题记 在《事务之概念》提到事务对应现实世界的状态转换,这个过程要满足4个特性这世界,真理只在大炮射程之类,通往和平的道路,非“常人”可以驾驭一个人生活按部就班,人多起来,难免鸡飞狗跳同理现实世界的状态转换映射到数据库,满足4个特…...
AI×5G 市场前瞻及应用现状
本文为《5GAI时代:生活方式和市场的裂变》一书读后总结及研究。 本书的上架建议是“经营”,内容也更偏向于市场分析。书出版于2021年,现在是2024年,可以收集整理一些例子,看看书里的前瞻性5GAI应用预测,到…...
LLM:模拟o1的思维链实现
本文项目地址:https://github.com/stay-leave/enhance_llm/tree/main/like-o1 运行的流程: 1.输入用户消息,query 2.组装消息列表,包括系统提示词(关键),用户消息,助手消息ÿ…...
vue3+vite 批量引入组件动态使用
import { ref, reactive, toRaw, markRaw, defineAsyncComponent, onMounted } from vue import type { Component } from vue// vue3vite 批量引入组件动态使用 const modules import.meta.glob<Component>(./details/*.vue) // 明确指定导入的模块类型为Component con…...
PyQt 中的无限循环后台任务
在 PyQt 中实现一个后台无限循环任务,需要确保不会阻塞主线程,否则会导致 GUI 无响应。常用的方法是利用 线程(QThread) 或 任务(QRunnable 和 QThreadPool) 来运行后台任务。以下是一些实现方式和关键点&a…...
【python使用kazoo连ZooKeeper基础使用】
from kazoo.client import KazooClient, KazooState from kazoo.exceptions import NoNodeError,NodeExistsError,NotEmptyError import json# 创建 KazooClient 实例,连接到 ZooKeeper 服务器 zk KazooClient(hosts127.0.0.1:2181) zk.start()# 定义节点路径 path…...
【MySQL】内置函数
MySQL中的内置函数 一、日期函数1.1 current_date函数1.2 current_time函数1.3 current_timestamp函数1.4 date_add函数1.5 date_sub函数1.6 datediff函数1.7 now函数综合使用1综合使用2 二、字符串函数2.1 charset函数2.2 concat函数2.3 length函数2.4 replace函数2.5 substri…...
机器学习面试八股总结
下面是本人在面试中整理的资料和文字,主要针对机器学习面试八股做浅显的总结,大部分来源于ChatGPT,中间有借鉴一些博主的优质文章,已经在各文中指出原文。有任何问题,欢迎随时不吝指正。 文章系列图像使用动漫 《星游…...
【Android Debug Bridge】adb常用指令(更新中)
adb常用指令 ADB(Android Debug Bridge)是一个强大的命令行工具,用于与连接的Android设备进行通信。 1:安装软件包,假设app安装包为apk adb install [apk]2:查看当前连接PC的安卓设备编号 adb devices3…...
贵州大学oj平台软工24-11-27第5次小测
题目:阶乘和函数 题目描述 设计一个计算阶乘和的函数,用于求1!2!...n!并返回结果。 其中n是函数的参数。 程序的开始部分及main函数已经写好如下: #include <stdio.h> double factSum(int n); int main(){ int n; scanf("…...
【GPT】代谢概念解读
以下是对代谢中分解代谢和合成代谢两个概念的深入解读,用简单易懂的方式展开说明: 1. 分解代谢(Catabolism) 什么是分解代谢? 分解代谢是身体把大分子“拆开”的过程。就像把一个三明治分解成面包片、肉片和菜叶&#…...
Flutter如何适配RTL
阿拉伯语和希伯来语等是使用的从右到左书写的文字系统。世界上估计有4.22亿人以阿拉伯语做为母语。使用从右至左的人口可以说是更多了。所以对于出海项目来说,是不能忽视的一部分。 RTL可以说是本地化适配中比较麻烦的一项,并没有多语言适配来的简单。RT…...
Java中的“接口“详解
1.接口的概念 在Java中接口可以看成是:多个类的公共规范,是一种引用数据类型 2.语法规则 接口的定义格式与类的定义格式相同,将"class"关键字换成"interface"关键字,就定义了一个接口. //接口的关键字"interface"定义了一个名称为"USB&…...
Windows 10电脑无声问题的全面解决方案
Windows 10操作系统以其强大的功能和用户友好的界面赢得了广大用户的青睐,但在使用过程中,有时会遇到电脑突然没有声音的问题。这一问题可能由多种原因引起,包括音频驱动程序问题、音频设置错误、系统更新冲突等。本文将详细介绍Windows 10无…...
ElasticSearch学习篇19_《检索技术核心20讲》搜推广系统设计思想
目录 主要是包含搜推广系统的基本模块简单介绍,另有一些流程、设计思想的分析。 搜索引擎 基本模块检索流程 查询分析查询纠错 广告引擎 基于标签倒排索引召回基于向量ANN检索召回打分机制:非精确打分精准深度学习模型打分索引精简:必要的…...
IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置
NA消息用单播还是多播的判断理由 单播回复(Unicast): 如果客户端发送 RS 消息时,使用的是一个全局地址或链路本地地址作为源地址,则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量,…...
LearnOpenGL 学习(入门--三角形,着色器,纹理)
你好,三角形 下面,你会看到一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分。 图形渲染管线的第一个部分是顶点着色器(Vertex Shader),它把一个单独的顶点作为输入。顶点着色器主要的目的是…...
前端开发入门指南Day12:ES6进阶:面向对象的编程(Class类、继承、模块化)
今天,让我们探索ES6中面向对象编程的革新。想象一下,如果传统的JavaScript是一个手工作坊,那么ES6的类和模块化就是一个现代化工厂,让代码的组织和复用变得更加规范和高效。 一、为什么需要Class类的革新 🎯 在ES6之…...