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.基本使用…...
基于SSM网上招投标管理系统的设计
管理员账户功能包括:系统首页,个人中心,用户管理,招标者管理,专家管理,项目分类管理,招标项目管理,系统管理 前台账号功能包括:系统首页,个人中心࿰…...
「C/C++」C++ 设计模式 之 单例模式(Singleton)
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
WPF的行为(Behavior)
WPF(Windows Presentation Foundation)是微软.NET框架中用于构建Windows客户端应用程序的UI框架。它提供了一种声明性的方式来定义用户界面,并且支持MVVM(Model-View-ViewModel)设计模式。 在WPF中,“行为…...
SpringBoot框架:闲一品交易平台的新突破
摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,闲一品交易平台当然也不能排除在外。闲一品交易平台是以实际运用为开发背景,运用软件工程原理和开发方法&…...
关于AI绘画 | Stable Diffusion 技术专栏推荐文章
AI绘画 | Stable Diffusion 技术专栏推荐文章 引言 随着人工智能技术的发展,AI绘画逐渐成为艺术创作的新潮流。在众多的AI绘画工具中,Stable Diffusion因其强大的功能和易用性受到了广泛的关注。本文将详细介绍由“泰山AI”创建的技术专栏“AI绘画 | S…...
Oracle 第13章:事务处理
在数据库管理系统(DBMS)中,事务处理是一个非常重要的概念,它确保了数据的一致性和可靠性。下面我将解释事务的概念与特性,并讨论如何进行事务管理。 事务的概念与特性 事务是指作为一个工作单元的一组有序的SQL操作。…...
String的长度有限,而我对你的思念却无限延伸
公主请阅 1. 为什么学习string类?2. string类的常用接口2.1 string类对象的常见构造2.1.1 string 2.2 operator[]2.3 迭代器2.4 auto自动推导数据类型2.5 范围for2.6 迭代器第二层2.7 size和length获取字符串的长度2.8 max_size 获取这个字符串能设置的最大长度2.9 …...
二叉树的后序遍历
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1] 解释: 示例 2: 输入:root [1,2,3,4,5,null,8,null,null,6,7,9] 输出…...
Nvidia未来的Blackwell Ultra GPU将更名为B300系列
据TrendForce报道,英伟达(Nvidia)计划将其Blackwell Ultra产品线重新命名为B300系列,以更好地与即将推出的B100和B200产品进行区分。Blackwell Ultra系列将是一个具有更高性能的升级版本。但据报道,这种升级后的内存配…...
BUUCTF靶场Misc练习
在BUUCTF中,你需要留意各种关于涉及 flag{ } 的信息。只要找的到flag,你就算成功。本文记录我刷BUUCTF的Misc类方法和个人感悟。 Misc第一题 签到 题解在题目中,如图所示 flag是 flag{buu_ctf} 第二题 (题目如图所示ÿ…...
盛泽网站建设/网站优化最为重要的内容是
/*** 用户登录接口* * * 1明确事务方法前的命名规则* 2保证事务方法执行的时间尽可能的短,不允许出现循环操作,不允许出现RPC等网络请求操作* 3不允许所有的方法都使用事务,节省服务器性能和缩短数据库连接时间* 4如果出现有多个地方需要事务…...
阿里云共享云主机做网站/百度信息流投放
1.请自我介绍一下? 答:我叫 xxx,来自北京,20xx 年毕业于 xx 大学计算机 xx 系,毕业后在武汉从事了 x 年的 php 开发工作,公司是一个外包公司,主要做微信开发,公众号推广,商城,论坛的开发2.你在公司负责那些项目? 答:由于我们公司是一个外包公司,不可能只做一个项目,公司的项…...
文章 wordpress/seoyoon
我这个人走得很慢,但是我从不后退。----亚伯拉罕林肯前言: 本周我们主要了解Java中与面向对象的程序设计(OOP)有关的关键字。后面会逐一详细说明各个关键字的用法。其中特别注意的是this关键字,是Java中最常用的关…...
做企业网站的步骤/东莞seo优化
今天晕晕沉沉的创建一个JOB,用PLSQL图形化界面没成功,SQL语句也没成果,最后发现竟然是job变量未定义,留个坑在这里…… SQL> begin 2 sys.dbms_job.submit(job > :job, 3 what > proc_export_containers;, 4…...
网站建设以及运营方面/乐事薯片软文推广
是不是觉得target有点眼熟?! 今天要讲的不是HTML的<a>标签里面有个target属性。 target伪类是css3的新属性。 说到伪类,对css属性的人肯定都知道:hover、:link、:visited、:focus等等,target用法跟他们是同出一辙的。 官方定义是: URL…...
秦皇岛建设工程交易网/长沙seo服务哪个公司好
转自:http://www.cnblogs.com/aiguozhe/p/3541941.html 一、总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applicati…...