Python——自动化发送邮件
在数字化时代,电子邮件是商务沟通和个人联络的重要工具。自动化邮件发送可以节省时间,提高效率。Python,作为一种强大且灵活的编程语言,提供了多种库来支持邮件的自动化发送。本文将详细介绍如何使用Python的
smtplib
和
目录
1一、环境准备
二、构建邮件内容
2.1 创建邮件对象
2.2 设置邮件头部
2.3 添加邮件正文
2.3.1 纯文本邮件
2.3.2 HTML邮件
2.4 添加附件
2.5 构建复杂邮件
三、 发送邮件
3.1 连接到SMTP服务器
3.2 发送邮件
3.3 关闭连接
四、 完整的邮件发送函数
5五、注意事项和最佳实践
5.1 安全性
5.2 使用安全的连接
5.3 错误处理
5.4 邮件服务商的限制
5.5 邮件内容的优化
5.6 测试
1一、环境准备
在开始之前,确保你的Python环境已经安装了必要的库。我们将使用smtplib
来发送邮件,以及email
库来构建邮件内容。
如果你的环境中还没有这些库,可以通过以下命令安装:
pip install smtplib email
二、构建邮件内容
邮件内容可以通过email
库中的几个类来构建,包括MIMEText
和MIMEMultipart
。MIMEText
用于纯文本内容,而MIMEMultipart
则可以包含多种类型的数据,如文本、HTML和附件。
2.1 创建邮件对象
首先,我们需要创建一个MIMEMultipart
对象,它将作为邮件的容器。
from email.mime.multipart import MIMEMultipartmsg = MIMEMultipart()
2.2 设置邮件头部
邮件头部包括发件人、收件人和主题等信息。
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = '邮件主题'
2.3 添加邮件正文
邮件正文是邮件的主要内容,可以是纯文本或HTML格式。我们将使用MIMEText
来添加邮件正文。
2.3.1 纯文本邮件
对于纯文本邮件,我们使用MIMEText
的plain
参数。
from email.mime.text import MIMEText# 纯文本邮件正文
text = '这是一封纯文本邮件。'
part = MIMEText(text, 'plain')# 将正文部分添加到邮件消息中
msg.attach(part)
2.3.2 HTML邮件
对于HTML邮件,我们使用MIMEText
的html
参数。
# HTML邮件正文
html = '<h1>这是一封HTML邮件</h1>'
part = MIMEText(html, 'html')# 将正文部分添加到邮件消息中
msg.attach(part)
2.4 添加附件
除了正文,我们还可以向邮件中添加附件。附件可以是任何类型的文件。
from email.mime.base import MIMEBase
from email import encoders# 创建一个附件对象
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(open('filename.txt', 'rb').read())
encoders.encode_base64(attachment)# 设置附件的头部信息
attachment.add_header('Content-Disposition', 'attachment', filename='1.txt')# 将附件添加到邮件消息中
msg.attach(attachment)
2.5 构建复杂邮件
在实际应用中,邮件可能包含多种内容类型,如文本、HTML和附件。MIMEMultipart
允许我们将这些内容组合在一起。
# 创建一个MIMEMultipart对象
msg = MIMEMultipart()# 添加文本正文
text = '这是邮件的文本部分。'
text_part = MIMEText(text, 'plain')
msg.attach(text_part)# 添加HTML正文
html = '<h1>这是邮件的HTML部分</h1>'
html_part = MIMEText(html, 'html')
msg.attach(html_part)# 添加附件
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(open('filename.txt', 'rb').read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename='1.txt')
msg.attach(attachment)
三、 发送邮件
使用smtplib
库来发送邮件。你需要知道SMTP服务器的地址和端口,以及你的邮箱账号和密码。
3.1 连接到SMTP服务器
import smtplibserver = smtplib.SMTP_SSL('smtp.example.com', 465) # 使用SSL连接
server.login('sender@example.com', 'your_password')
3.2 发送邮件
将之前构建的邮件对象发送出去。
server.send_message(msg)
3.3 关闭连接
发送完毕后,不要忘记关闭与SMTP服务器的连接。
server.quit()
四、 完整的邮件发送函数
将上述步骤整合到一个函数中,可以方便地重复使用。
import subprocess
import sys# 检测并安装库的函数
def install(package):subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])# 检查所需的库并安装
required_packages = ['smtplib', 'email']
for package in required_packages:try:__import__(package)except ImportError:print(f"{package} 未安装,正在安装...")install(package)# 导入所需的库
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartdef send_email(sender_email, sender_password, recipient_email, subject, body):msg = MIMEMultipart()msg['From'] = sender_emailmsg['To'] = recipient_emailmsg['Subject'] = subjectmsg.attach(MIMEText(body, 'plain'))try:# 使用 SSL 连接server = smtplib.SMTP_SSL('smtp服务器地址', 465)server.login(sender_email, sender_password)server.send_message(msg)print("邮件发送成功!")except Exception as e:print(f"发送邮件时出错: {e}")finally:if 'server' in locals():server.quit()# 使用示例
if __name__ == "__main__":# 请将以下信息替换为您的实际信息sender_email = '' # 发件人邮箱sender_password = '' # 发件人邮箱密码# 用户输入收件人邮箱recipient_email = input("请输入收件人邮箱: ")subject = '邮件标题'body = '这是邮件的内容。'send_email(sender_email, sender_password, recipient_email, subject, body)
5五、注意事项和最佳实践
在使用Python发送邮件时,有几个重要的注意事项和最佳实践可以帮助你确保邮件的成功发送,同时保护你的账户安全。
5.1 安全性
不要硬编码敏感信息:在代码中直接包含邮箱账号和密码是不安全的。这些敏感信息可能会被泄露,尤其是当你的代码库被上传到公共代码托管平台时。考虑使用以下方法来更安全地处理敏感信息:
- 环境变量:将敏感信息存储在环境变量中,而不是直接在代码中。这样,你的代码库中就不会包含这些信息,而且可以根据不同的运行环境轻松更改这些值。
- 配置文件:使用配置文件来存储敏感信息,并确保这些文件不被上传到版本控制系统中。你可以在版本控制的
.gitignore
文件中排除这些配置文件。 - 密钥管理服务:对于更复杂的应用,可以考虑使用密钥管理服务来安全地存储和访问敏感信息。
5.2 使用安全的连接
使用SSL或TLS:在发送邮件时,确保你的连接是加密的。smtplib
库支持使用SSL(在465端口)和TLS(在587端口)来加密你的连接。使用SSL或TLS可以防止你的敏感信息(如密码)在传输过程中被截获。
# 使用SSL
server = smtplib.SMTP_SSL('smtp.example.com', 465)# 或者使用TLS
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()
5.3 错误处理
添加错误处理逻辑:在发送邮件时,可能会遇到各种错误,如网络问题、认证失败或邮件服务器拒绝发送。添加错误处理逻辑可以帮助你诊断问题,并在邮件发送失败时采取适当的措施。
try:server.send_message(msg)print("邮件发送成功!")
except smtplib.SMTPAuthenticationError:print("认证失败,请检查你的邮箱账号和密码。")
except smtplib.SMTPException as e:print(f"发送邮件时出错: {e}")
finally:server.quit()
5.4 邮件服务商的限制
了解邮件服务商的限制:不同的邮件服务商可能有不同的限制,如发送频率限制、每日发送量限制等。确保你的邮件发送行为符合服务商的政策,否则你的账号可能会被暂时或永久封禁。
5.5 邮件内容的优化
避免垃圾邮件过滤器:确保你的邮件内容不会触发垃圾邮件过滤器。避免使用过多的感叹号、全大写字母或可疑的链接。同时,确保邮件的标题和内容相关,并且对收件人有价值。
5.6 测试
在生产环境之前进行测试:在将邮件发送功能部署到生产环境之前,确保在开发环境中进行充分的测试。测试不同的邮件服务商、不同的网络环境和不同的邮件内容,以确保你的邮件发送功能在各种情况下都能正常工作。
通过遵循这些注意事项和最佳实践,你可以确保你的邮件发送功能既安全又可靠。这些实践不仅可以帮助你避免潜在的问题,还可以提高你的邮件发送成功率。
进群一起交流https://qm.qq.com/q/H8C416r92S
相关文章:

Python——自动化发送邮件
在数字化时代,电子邮件是商务沟通和个人联络的重要工具。自动化邮件发送可以节省时间,提高效率。Python,作为一种强大且灵活的编程语言,提供了多种库来支持邮件的自动化发送。本文将详细介绍如何使用Python的smtplib和email库来编…...

MTKLauncher_布局页面分析
文章目录 前言遇到的困难点针对性解决困难 需求相关资料Launcher3 源码 目录简单介绍Launcher3 简介及页面布局分析UI整体架构数据加载布局加载布局加载核心思想device_profiles.xml 加载InvariantDeviceProfileinitGrid(context, gridName)getPredefinedDeviceProfilesinvDist…...

C#实现隐藏和显示任务栏
实现步骤 为了能够控制Windows任务栏,我们需要利用Windows API提供的功能。具体来说,我们会使用到user32.dll中的两个函数:FindWindow和ShowWindow。这两个函数可以帮助我们找到任务栏窗口,并对其执行显示或隐藏的操作 引入命名空…...

基于springboot+vue实现的公司财务管理系统(源码+L文+ppt)4-102
基于springbootvue实现的公司财务管理系统(源码L文ppt)4-102 摘要 本系统是基于SpringBoot框架开发的公司财务管理系统,该系统包含固定资产管理、资产申领管理、资产采购管理、员工工资管理等功能。公司财务管理系统是一种帮助公司进行有效资金管理、会…...

rnn/lstm
tip:本人比较小白,看到july大佬的文章受益匪浅,现在其文章基础上加上自己的归纳、理解,以及gpt的答疑,如果有侵权会删。 july大佬文章来源:如何从RNN起步,一步一步通俗理解LSTM_rnn lstm-CSDN博…...

袋鼠云产品功能更新报告12期|让数据资产管理更高效
本期,我们更新和优化了数据资产平台相关功能,为您提供更高效的产品能力。以下为第12期袋鼠云产品功能更新报告,请继续阅读。 一、【元数据】重点更新 |01 元数据管理优化,支持配置表生命周期 之前系统中缺少一个可以…...

MATLAB——入门知识
内容源于b站清风数学建模 目录 1.帮助文档 2.注释 3.特殊字符 4.设置MATLAB数值显示格式 4.1.临时更改 4.2.永久改 5.常用函数 6.易错点 1.帮助文档 doc sum help sum edit sum 2.注释 ctrl R/T 3.特殊字符 4.设置MATLAB数值显示格式 4.1.临时更改 format lon…...

C#从零开始学习(用户界面)(unity Lab4)
这是书本中第四个unity Lab 在这次实验中,将学习如何搭建一个开始界面 分数系统 点击球,会增加分数 public void ClickOnBall(){Score;}在OneBallBehaviour类添加下列方法 void OnMouseDown(){GameController controller Camera.main.GetComponent<GameController>();…...

Axure PR 9 多级下拉清除选择器 设计交互
大家好,我是大明同学。 Axure选择器是一种在交互设计中常用的组件,这期内容,我们来探讨Axure中选择器设计与交互技巧。 OK,这期内容正式开始 下拉列表选择输入框元件 创建选择输入框所需的元件 1.在元件库中拖出一个矩形元件。…...
分布式项目pom配置
1. 父项目打包方式为 pom <packaging>pom</packaging> 2. 父项目版本配置 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncod…...

2. Flink快速上手
文章目录 1. 环境准备1.1 系统环境1.2 安装配置Java 8和Scala 2.121.3 使用集成开发环境IntelliJ IDEA1.4 安装插件2. 创建项目2.1 创建工程2.1.1 创建Maven项目2.1.2 设置项目基本信息2.1.3 生成项目基本框架2.2 添加项目依赖2.2.1 添加Flink相关依赖2.2.2 添加slf4j-nop依赖2…...

Java-I/O框架06:常见字符编码、字符流抽象类
视频链接:16.16 字符流抽象类_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tz4y1X7H7?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p16 1.常见字符编码 IOS-8859-1收录了除ASCII外,还包括西欧…...

计算机网络-MSTP的基础概念
前面我们大致了解了MSTP的由来,是为了解决STP/RSTP只有一根生成树导致的VLAN流量负载分担与次优路径问题,了解MSTP采用实例映射VLAN的方式实现多实例生成树,MSTP有很多的理论概念需要知道,其实与其它的知识一样理论复杂配置还好的…...
P1037 [NOIP2002 普及组] 产生数
[NOIP2002 普及组] 产生数 题目描述 给出一个整数 n n n 和 k k k 个变换规则。 规则: 一位数可变换成另一个一位数。规则的右部不能为零。 例如: n 234 , k 2 n234,k2 n234,k2。有以下两个规则: 2 ⟶ 5 2\longrightarrow 5 2⟶5。 …...

【分布式知识】分布式对象存储组件-Minio
文章目录 什么是minio核心特点:使用场景:开发者工具:社区和支持: 核心概念什么是对象存储?MinIO 如何确定对对象的访问权限?我可以在存储桶内按文件夹结构组织对象吗?如何备份和恢复 MinIO 上的…...

跨平台开发支付组件,实现支付宝支付
效果图: custom-payment : 在生成预付订单之后页面中需要弹出一个弹层,弹层中展示的内容为支付方式(渠道),由用户选择一种支付方式进行支付。 该弹层组件是以扩展组件 uni-popup 为核心的,关于…...
API 接口:为电商行业高效发展注入强劲动力
一、动力之源:API 接口在电商中的角色剖析 在电商行业的广袤版图中,API 接口宛如一台强劲的发动机,是推动其高效发展的核心动力来源。它不再仅仅是一个技术工具,而是成为了连接电商各个环节的 “神经系统”,使得信息、…...

Golang的跨平台开发
Golang的跨平台开发 一、Golang跨平台开发概述 语言是一种开源的编程语言,由Google开发,广泛应用于云计算和网络编程领域。Golang具有并发性好、性能优异、内存管理自动化等特点,因此备受开发者青睐。其中,Golang的跨平台特性使得…...
txt数据转为pdf格式并使用base64解密输出
使用该方法请注意:因为此方法使用了base64解密,需要保证txt中的数据首先用了base64加密,如果只是普通的二进制数据,该方法并不适用 第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId&…...

鸿蒙开发-状态+判断+循环
🌈个人主页:前端青山 🔥系列专栏:鸿蒙开发篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来鸿蒙开发篇专栏内容:鸿蒙开发-状态判断循环 目录 1.状态1原始类型 2.引用类型 2.判断 3.循环 1.基本使用…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...