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

如何使用Python自动发送邮件?

Python 提供了强大的内置库 smtplib 和 email,让我们能够轻松地发送各种类型的电子邮件。本指南将带你逐步了解如何使用 Python 发送邮件,从简单文本邮件到包含 HTML 内容、附件和内嵌图片的复杂邮件。

1. 准备工作:

1.1 安装必要的库

确保你的 Python 环境中安装了 smtplib 和 email 库。如果未安装,可以使用 pip 进行安装:

 
pip install smtplib email

1.2 启用第三方应用访问权限

许多邮箱服务商 (如 Gmail) 默认情况下会阻止第三方应用访问。你需要在邮箱设置中启用第三方应用访问权限,或者生成应用专用密码 (授权码)。

2. 发送简单文本邮件

让我们从最简单的文本邮件开始。以下是使用 smtplib 和 email.mime.text 发送文本邮件的代码示例:

import smtplib
from email.mime.text import MIMETextdef send_plain_email(sender_email, sender_password, receiver_email, subject, message):"""发送简单文本邮件。Args:sender_email: 发送方邮箱地址。sender_password: 发送方邮箱密码 (或授权码)。receiver_email: 接收方邮箱地址。subject: 邮件主题。message: 邮件内容。"""msg = MIMEText(message, 'plain', 'utf-8')msg['Subject'] = subjectmsg['From'] = sender_emailmsg['To'] = receiver_emailtry:with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:server.login(sender_email, sender_password)server.send_message(msg)print("邮件发送成功!")except Exception as e:print(f"邮件发送失败:{e}")# 示例用法
send_plain_email("your_email@gmail.com", "your_password", "recipient@example.com", "测试邮件", "这是一封测试邮件。")

代码解释:

  1. 导入库: 导入 smtplib 和 email.mime.text。

  2. 定义函数 send_plain_email: 该函数接收发送方邮箱、密码、接收方邮箱、主题和内容作为参数,用于发送邮件。

  3. 创建邮件内容: 使用 MIMEText(message, 'plain', 'utf-8') 创建一个文本邮件对象 msg, 并设置主题、发件人和收件人。

  4. 发送邮件:

    • 使用 smtplib.SMTP_SSL() 连接到 Gmail 的 SMTP 服务器 (smtp.gmail.com, 端口号 465)。

    • 使用 server.login() 登录你的邮箱账号。

    • 使用 server.send_message() 发送邮件。

3. 发送 HTML 格式邮件

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartdef send_html_email(sender_email, sender_password, receiver_email, subject, html_content):"""发送 HTML 格式的邮件。Args:sender_email: 发送方邮箱地址。sender_password: 发送方邮箱密码 (或授权码)。receiver_email: 接收方邮箱地址。subject: 邮件主题。html_content: 邮件 HTML 内容。"""msg = MIMEMultipart('alternative')  # 创建多部分邮件msg['Subject'] = subjectmsg['From'] = sender_emailmsg['To'] = receiver_email# 添加 HTML 部分part = MIMEText(html_content, 'html', 'utf-8')msg.attach(part)# 发送邮件try:with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:server.login(sender_email, sender_password)server.send_message(msg)print("邮件发送成功!")except Exception as e:print(f"邮件发送失败:{e}")# 示例用法
html_content = """
<html><head></head><body><p>这是一封<b>HTML</b>格式的邮件,包含图片和链接:</p><img src="cid:image1" alt="图片"><p><a href="https://www.example.com">这是一个链接</a></p></body>
</html>
"""send_html_email("your_email@gmail.com", "your_password", "recipient@example.com", "HTML 邮件测试", html_content)

要点:

  • 使用 MIMEMultipart('alternative') 创建多部分邮件,以支持纯文本和 HTML 两种格式。

  • 使用 MIMEText(html_content, 'html', 'utf-8') 创建 HTML 格式的邮件内容。

4. 发送带附件的邮件

你可以使用 email.mime.base.MIMEBase 和 email.encoders 模块发送带附件的邮件:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encodersdef send_email_with_attachment(sender_email, sender_password, receiver_email, subject, message, attachment_path):"""发送带附件的邮件。Args:sender_email: 发送方邮箱地址。sender_password: 发送方邮箱密码 (或授权码)。receiver_email: 接收方邮箱地址。subject: 邮件主题。message: 邮件内容。attachment_path: 附件文件路径。"""msg = MIMEMultipart()msg['Subject'] = subjectmsg['From'] = sender_emailmsg['To'] = receiver_email# 添加邮件正文msg.attach(MIMEText(message, 'plain', 'utf-8'))# 添加附件with open(attachment_path, "rb") as attachment:part = MIMEBase("application", "octet-stream")part.set_payload(attachment.read())encoders.encode_base64(part)  # 对附件进行 base64 编码part.add_header("Content-Disposition",f"attachment; filename= {attachment_path}",)msg.attach(part)# 发送邮件try:with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:server.login(sender_email, sender_password)server.send_message(msg)print("邮件发送成功!")except Exception as e:print(f"邮件发送失败:{e}")# 示例用法
send_email_with_attachment("your_email@gmail.com", "your_password", "recipient@example.com", "附件测试", "这是一封带附件的邮件。", "/path/to/your/attachment.pdf")

要点:

  • 使用 MIMEBase("application", "octet-stream") 创建附件部分。

  • 使用 encoders.encode_base64(part) 对附件进行 base64 编码,确保能够通过邮件发送。

  • 使用 part.add_header("Content-Disposition", f"attachment; filename= {attachment_path}") 设置附件的文件名。

5. 发送内嵌图片的 HTML 邮件

为了在邮件正文中直接显示图片,可以使用内嵌图片:

python
复制代码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImagedef send_html_email_with_embedded_image(sender_email, sender_password, receiver_email, subject, html_content, image_path):"""发送包含内嵌图片的 HTML 邮件。Args:sender_email: 发送方邮箱地址。sender_password: 发送方邮箱密码 (或授权码)。receiver_email: 接收方邮箱地址。subject: 邮件主题。html_content: 邮件 HTML 内容。image_path: 图片路径。"""msg = MIMEMultipart('related')msg['Subject'] = subjectmsg['From'] = sender_emailmsg['To'] = receiver_email# 创建 HTML 部分msg_alternative = MIMEMultipart('alternative')msg.attach(msg_alternative)part = MIMEText(html_content, 'html', 'utf-8')msg_alternative.attach(part)# 添加内嵌图片with open(image_path, 'rb') as f:img = MIMEImage(f.read())img.add_header('Content-ID', '<image1>') # 设置图片 IDimg.add_header('Content-Disposition', 'inline')msg.attach(img)# 发送邮件try:with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:server.login(sender_email, sender_password)server.send_message(msg)print("邮件发送成功!")except Exception as e:print(f"邮件发送失败:{e}")# 示例用法
html_content = """
<html><head></head><body><p>这是一封包含<b>内嵌图片</b>的邮件:</p><img src="cid:image1" alt="图片"></body>
</html>
"""send_html_email_with_embedded_image("your_email@gmail.com", "your_password", "recipient@example.com", "内嵌图片测试", html_content, "/path/to/your/image.jpg")

要点:

  • 使用 MIMEMultipart('related') 创建多部分邮件,用于关联内嵌图片和 HTML 内容。

  • 使用 MIMEImage(f.read()) 创建图片部分。

  • 使用 img.add_header('Content-ID', '<image1>') 为图片设置 ID,并在 HTML 代码中使用 cid:image1 引用该 ID。

6. 总结

本指南介绍了使用 Python 发送各种类型邮件的基本方法,包括简单文本邮件、HTML 邮件、带附件的邮件以及包含内嵌图片的邮件。你可以根据自己的需求选择合适的方法,并根据实际情况修改代码示例。

到这里所有的教程都已经完成了,如果对你有帮助,记得点赞分享支持一下~

相关文章:

如何使用Python自动发送邮件?

Python 提供了强大的内置库 smtplib 和 email&#xff0c;让我们能够轻松地发送各种类型的电子邮件。本指南将带你逐步了解如何使用 Python 发送邮件&#xff0c;从简单文本邮件到包含 HTML 内容、附件和内嵌图片的复杂邮件。 1. 准备工作&#xff1a; 1.1 安装必要的库 确保…...

C#中读写INI配置文件

在作应用系统开发时&#xff0c;管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起&#xff0c;现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config&#xff0c;Asp.Net的配置文件Web.Config&#xff0…...

深入解析Spring中的@RequestMapping注解

RequestMapping是Spring框架中的一个核心注解&#xff0c;用于映射Web请求到处理器类的方法上。本文将详细介绍RequestMapping注解的用途、支持的属性以及如何在Spring MVC和Spring WebFlux中应用它。 1. 引言 在Spring框架中&#xff0c;RequestMapping是一个用于简化请求映…...

Python:lambda函数

lambda函数解释 Lambda函数&#xff0c;也被称为匿名函数&#xff0c;是Python等编程语言中用于创建简单、一次性使用的函数对象的一种快捷方式。在Python中&#xff0c;lambda函数使用lambda关键字定义&#xff0c;其后紧跟一个或多个参数&#xff08;用逗号分隔&#xff09;…...

MySQL查询语句

1. 一般查询 select * from table&#xff1b; 创建表&#xff1a;并插入数据&#xff0c;为下面的查询做例 create table info ( id int primary key, name varchar(10), score decimal(5,2), address varchar(20), hobbid int(5));insert into info values(1,liuyi,80,bei…...

远程连接服务

1.SSH协议握手流程 TCP三次握手后当前主机与远程服务器之间协商用哪种协议版本&#xff0c;ssh有两个&#xff08;ssh1/ssh2&#xff09;一般用ssh2&#xff0c;协商完后进入到密钥交换的阶段&#xff0c;客户端会生成一个公钥和一个私钥&#xff0c;公钥用来上锁&#xff0c;私…...

系统架构设计师——软件开发方法分类

分类 软件开发方法是指软件开发过程所遵循的办法和步骤&#xff0c;从不同的角度可以对软件开发方法进行不同的分类。 按照开发风范 软件开发过程中&#xff0c;开发方法的选择对项目的成功至关重要。这些方法可按照特定的开发风范分为自顶向下和自底向上两种主要策略&#…...

《看漫画学Python》全彩PDF教程,495页深度解析,零基础也能轻松上手!

前言 说起编程语言&#xff0c;Python 也许不是使用最广的&#xff0c;但一定是现在被谈论最多的。随着近年大数据、人工智能的兴起&#xff0c;Python 越来越多的出现在人们的视野中。 在各家公司里&#xff0c;Python 还常被用来做快速原型开发&#xff0c;以便更快验证产品…...

用户画像系列——Spark任务调优实践

在画像标签的加工和写入hbase中&#xff0c;我们采用了spark来快速进行处理和写入。但是在实际线上运行的过程中&#xff0c;仍然遇到了不少问题&#xff0c;下面来总结下遇到的一些问题 1.数据倾斜问题 其实spark 数据倾斜思路和hive、mapreduce 数据倾斜思路处理类似&…...

前端面试宝典【HTML篇】【4】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…...

【UbuntuDebian安装MySQL】在线安装MySQL8

云计算&#xff1a;腾讯云轻量服务器 系统&#xff1a;Ubuntu-v22 1.更新系统软件包列表 打开终端并运行以下命令来确保你的系统软件包列表是最新的&#xff1a; sudo apt update2.安装 MySQL 存储库 MySQL 提供了官方的 APT 存储库&#xff0c;可以确保你安装的是最新版本…...

PDF翻译神器:这四款可以实现一键搞定,留学党必备!

外文的阅读还是需要一定的语言功底&#xff0c;现在大家也对外文越来越重视起来了&#xff0c;但是借助一些翻译工具进行翻译可以很大程度地提升工作的效率&#xff0c;就算是遇到批量的文件处理也可以一键翻译出来&#xff0c;所以今天借此文章整理了四款好用的pdf翻译工具&am…...

精心准备的高水平的博客【点评语】,来抄啊!

大家好&#xff0c;我是一名_全栈_测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家关注我&#xff0c;和我一起【分享测试知识&#xff0c;交流测试技术&#xff0c;趣聊行业热点】。 第 1 条 这篇博客文章如同灯塔般照亮了技…...

gitlab汉化

承接上文安装好gitlab 首先查看好gitlab的版本&#xff08;ps&#xff1a;要启动gitlab&#xff09; cat /opt/gitlab/embedded/service/gitlab-rails/VERSION我的版本是10.0.0 然后安装git yum install -y git然后克隆一下汉化的仓库 git clone https://gitlab.com/xhang/g…...

SSH访问控制:精确管理你的服务器门户

“ 在数字世界中&#xff0c;服务器的安全性是任何网络管理员的首要任务。特别是对于远程登录协议如SSH&#xff0c;确保只有授权用户可以访问是至关重要的。 今天&#xff0c;记录两种有效的方法来控制用户对特定服务器的访问&#xff1a;通过sshd_config实现黑/白名单机制和利…...

Java中的SSL/TLS安全通信实现

Java中的SSL/TLS安全通信实现 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Java中实现SSL/TLS安全通信。 一、什么是SSL/TLS SSL&#xff08;Secure Sockets La…...

2959. 关闭分部的可行集合数目

2959. 关闭分部的可行集合数目 题目链接&#xff1a;2959. 关闭分部的可行集合数目 代码如下&#xff1a; //参考链接:https://leetcode.cn/problems/number-of-possible-sets-of-closing-branches/solutions/2844227/guan-bi-fen-bu-de-ke-xing-ji-he-shu-mu-b-85ov class S…...

第十九天培训笔记

上午 1 、构建 vue 发行版本 [rootserver eleme_web]# nohup npm run serve& // 运行 vue 项目 [rootserver eleme_web]# mkdir /eleme [rootserver eleme_web]# cp -r /root/eleme_web/dist/* /eleme/ // 将项目整体 移动到 /eleme 目录下 [rootserver eleme_web]# …...

初学者编程指南:方法与资源推荐

一、引言 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&#xff1f;编程不仅是技术领域的一项基本技能&#…...

【SpringBoot】数据验证之URL参数校验

URL参数校验 Validated public class UserController{ RequestMapping("/query"); public String query(Length(min2,max10,message"姓名长度错误&#xff0c;姓名长度2-10&#xff01;") RequestParam(name"name",requiredtrue)String name…...

深度学习草图到全栈代码生成:技术原理、实现挑战与工程实践

1. 项目概述&#xff1a;从草图到全栈应用的智能跃迁在软件开发领域&#xff0c;从产品原型到最终上线的代码实现&#xff0c;中间横亘着一条巨大的“实现鸿沟”。产品经理或设计师用Sketch、Figma等工具绘制出精美的界面草图&#xff0c;而工程师则需要将这些静态的视觉稿&…...

开源物联网平台SiteWhere:微服务架构下的设备管理与数据流实战

1. 项目概述&#xff1a;一个开源的物联网应用平台如果你正在寻找一个能帮你快速搭建、管理和扩展物联网应用的核心平台&#xff0c;而不是从零开始造轮子&#xff0c;那么SiteWhere这个开源项目绝对值得你花时间深入了解。它不是一个简单的设备连接网关&#xff0c;而是一个功…...

基于MCP协议与向量数据库构建AI编程助手私有记忆系统

1. 项目概述&#xff1a;为你的AI编程助手打造一个“记忆宫殿”如果你和我一样&#xff0c;重度依赖Cursor这类AI编程助手&#xff0c;那你肯定遇到过这个痛点&#xff1a;昨天刚和它深入讨论过一个复杂的业务逻辑实现&#xff0c;今天想参考一下&#xff0c;却发现在浩如烟海的…...

AJV布尔验证终极指南:掌握JSON Schema中最简单的数据类型处理技巧

AJV布尔验证终极指南&#xff1a;掌握JSON Schema中最简单的数据类型处理技巧 【免费下载链接】ajv The fastest JSON schema Validator. Supports JSON Schema draft-04/06/07/2019-09/2020-12 and JSON Type Definition (RFC8927) 项目地址: https://gitcode.com/gh_mirror…...

C# 图像清晰度“核武器”:8个PictureBox永不模糊的硬核实战技巧

在 Windows Forms 开发中&#xff0c;PictureBox 是我们展示视觉效果的窗口。然而&#xff0c;你是否曾因为图片在缩放或背景色不匹配时变得模糊、锯齿横生&#xff0c;甚至出现难看的“黑边”而感到抓狂&#xff1f;这不仅影响用户体验&#xff0c;更是对完美主义开发者的一种…...

告别环境报错!保姆级教程:从JRE到STM32CubeMX 6.10.0的完整安装与配置

从零搭建STM32开发环境&#xff1a;CubeMX 6.10.0避坑全指南 刚拿到STM32开发板时的兴奋&#xff0c;往往在环境配置阶段就被各种报错消磨殆尽。作为过来人&#xff0c;我深刻理解那种看着红色错误提示却无从下手的挫败感。本文将带你用最稳妥的方式完成从Java环境到CubeMX的全…...

实战部署Funannotate基因组注释工具:3种高效配置方案指南

实战部署Funannotate基因组注释工具&#xff1a;3种高效配置方案指南 【免费下载链接】funannotate Eukaryotic Genome Annotation Pipeline 项目地址: https://gitcode.com/gh_mirrors/fu/funannotate Funannotate是一款专业的真核生物基因组注释工具&#xff0c;特别针…...

从用户态到内核态:Linux Hook技术的全景实践与攻防解析

1. Linux Hook技术入门&#xff1a;从概念到实践 第一次接触Hook技术是在十年前的一个安全分析项目中&#xff0c;当时需要监控某个可疑进程的行为。那时候我才明白&#xff0c;原来Linux系统里藏着这么多可以"截胡"程序执行的秘密通道。简单来说&#xff0c;Hook技术…...

别再折腾源码编译了!Ubuntu 20.04下用apt-get一键安装Asterisk PBX(附SIP账号配置详解)

别再折腾源码编译了&#xff01;Ubuntu 20.04下用apt-get一键安装Asterisk PBX&#xff08;附SIP账号配置详解&#xff09; 如果你正在寻找一种快速搭建企业级电话系统的方法&#xff0c;那么Asterisk PBX绝对值得考虑。作为开源PBX领域的标杆&#xff0c;Asterisk提供了完整的…...

告别手动配网!用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解

告别手动配网&#xff01;用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解 想象一下&#xff0c;当你需要为三层别墅部署全屋Wi-Fi覆盖&#xff0c;或是为小型办公室搭建多AP无线网络时&#xff0c;传统方式需要逐个登录每个AP的后台&#xff0c;重复输入SSID、密码、…...