如何使用 Python 发送电子邮件:SMTP 和 API 方法说明
Posted: Tue Dec 03, 2024 3:50 am
Python 发送电子邮件?没问题。本文涵盖了使用 Python 发送电子邮件所需了解的所有内容,包括代码示例、安全性和电子邮件测试。
设置“smtplib”
Python 的“smtplib”模块简化了从应用程序直接从发送电子邮件的过程,提供了与 SMTP 服务器交互的直接界面。
本部分将指导您导入“smtplib”,为您的服务器创建 SMTP 对象,并利用其核心功能发送电子邮件。继续学习如何将电子邮件功能集成到您的 Python 脚本中。
可以使用以下语句导入内置的 smtplib 模块:
import smtplib
为了稍后发送电子邮件,请创建一个 SMTP(简单邮件传输协议)对象:
smtpObj = smtplib.SMTP( [host [, port]] )
参数详细信息:
host − 这是一个可选参数,是运行 SMTP 服务器的主机。可以指定主机的 IP 地址或域名。
port− 如果指定了主机参数,则指定 SMTP 服务器正在监听的端口。
local_hostname− 如果使用的 SMTP 服务器在您的本地机器上运行,请指定localhost。
SMTP 对象有一个名为的实例方法sendmail ,用于发送消息,并具有三个参数:
sender− 包含发件人地址的字符串。
receivers− 字符串列表,每个收件人一个。
message− 按照 RFC 中指定格式的字符串消息。
smtpObj.sendmail(sender, receivers, message)
为了确保电子邮件模块已正确导入并获取其类和参数的完整描述,请在交互式 Python 会话中输入:
help(smtplib)
请参阅Python 文档以进一步了解其余 SMTP 对象(例如smtp.ehlo;smtp.send_message(msg)等等)以及如何应用它们。
以下部分将向您介绍如何使用 Mailtrap 电子邮件发送(Mailtrap 电子邮件传递平台的一项功能)通过 Python 发送电子邮件。首先,我将介绍 SMTP 方法,然后向您展示如何使用我们的 Python SDK 来执行此操作。
使用 SMTP 发送电子邮件
该方法与我上面在“smtplib”中介绍的方法非常相似,但是,您需要 电话数据 设置自定义 SMTP 凭据。在这里,我假设您已经注册了 Mailtrap 并验证了您的域。
如果没有,请查看我们的详细指南。
另请务必查看我们的视频说明,了解如何使用 smtplib 通过 Mailtrap 在 Python 中发送电子邮件。
注意:以下代码包含虚拟 Mailtrap 凭证(禁止服务器端点),请确保将其替换为您的真实凭证。
这是一个使用 Mailtrap SMTP 通过 Python 发送“纯文本”电子邮件的基本脚本。
"""
print('Sent')
快速分解:
导入和设置– 我已经从 Python 的标准库中导入了电子邮件所需的模块(“smtplib”和“MIMEText”)。
电子邮件服务器配置– SMTP 服务器详细信息,包括服务器地址、端口号和身份验证凭据。
电子邮件内容– 我创建了一条MIMEText只能包含纯文本的消息。稍后,我将向您展示如何包含电子邮件的 HTML 和纯文本版本。
发送电子邮件——我使用了上下文管理器(with语句)来确保发送电子邮件后与 SMTP 服务器的连接正确关闭。
额外提示:在脚本中硬编码敏感数据(例如登录凭据和服务器信息)可能会带来安全风险。这就是为什么我建议使用环境变量来存储敏感信息。这可以使您的代码在不同环境(开发、测试、生产)之间移动时更加安全和灵活。
发送 HTML 电子邮件
如果您想了解有关使用 Python 发送 HTML 电子邮件的更多信息,请查看我们的专门教程。
为了修改发送 HTML 电子邮件的脚本(同时仍包含多个收件人),我将调整电子邮件正文的创建和附加方式。以下是修改后的脚本:
print('Sent')
快速分解:
附加 HTML 内容– 使用“MIMEText(html, “html”)”而不是“MIMEText (text, “plain”)”将 HTML 内容附加到电子邮件消息中。通过指定html第二个参数,我们通知电子邮件客户端应将电子邮件的这一部分解释为 HTML。
使用 Mailtrap 免费发送电子邮件
发送电子邮件给多个收件人
在这里,我将重复使用上面的脚本并调整接收者地址的处理方式。
print('Sent')
快速分析一下与原始脚本的不同之处plaintext:
多个收件人配置– 我将receiver_email变量更改为receiver_emails。它现在是电子邮件地址列表,而不是单个字符串。
设置To标题– ToMIMEText 消息对象中的标题是通过将收件人电子邮件列表合并为一个以逗号分隔的字符串来设置的。这对于电子邮件标题在收件人收到电子邮件时正确显示所有收件人非常重要。
注意:某些电子邮件客户端(Outlook、Yahoo、Gmail 等)可能会向每个收件人显示字段中的所有收件人To,出于隐私原因,这是不可取的。您可以使用CCand/或来“修复”它BCC。
循环发送电子邮件- 脚本现在不再发送一次电子邮件,而是循环遍历receiver_emails列表中的每个收件人并单独向他们发送电子邮件。
专业提示: 这种方法适用于收件人数量较少的情况。但是,如果要向大量收件人发送电子邮件,使用 SMTP 服务器在一次发送操作中处理多个收件人的功能可能会更有效,具体取决于服务器的限制和策略。
发送带附件的电子邮件
我将使用,MIMEMultipart因为附件需要多部分电子邮件。此外,我将使用该类MIMEBase来附加文件。以下是更新后的脚本:
print('Sent')
快速分解:
使用MIMEMultipart– 我从MIMEText正文切换到MIMEMultipart整体邮件结构。这样我们就可以添加文本部分和附件作为电子邮件的单独部分。
添加附件:
文件准备——以二进制模式打开附件文件rb,并读取其内容。
MIMEBaseobject –MIMEBase为附件创建一个对象,类型设置为application/octet-stream。此类型是通用二进制流,这意味着它适用于任何文件类型,并且电子邮件客户端通常会将其视为附件。
编码– 文件内容采用 base64 编码,以确保可以通过电子邮件安全传输。这是使用encoders.encode_base64(part)函数完成的。
添加标题– 在附件部分添加标题以指示文件名并且应将其视为附件(Content-Disposition标题)。
将文件附加到消息– 然后使用将附件部分附加到消息中message.attach(part)。
发送嵌入图像的电子邮件
要发送带有嵌入图像(在 HTML 内容中)的电子邮件,我将使用该类MIMEImage。
将图像直接嵌入电子邮件中可使其作为电子邮件内容的一部分显示,而不是作为单独的附件显示。操作方法如下:
print('Sent')
快速分解:
HTML 内容更新:HTML 内容现在包含一个<img>标签,该标签带有src指向Content-ID (cid)您要嵌入的图像的属性。这cid必须与Content-ID图像附件的标头值匹配。
嵌入图像:
使用MIMEImage– 脚本现在包含MIMEImage处理图像文件的类。此类专门用于将图像附加到电子邮件。
打开图像文件– 您想要嵌入的图像以二进制模式打开。
创建MIMEImage对象– 使用图像的二进制数据创建MIMEImage对象。此对象代表图像附件。
Content-ID 标头–MIMEImage对象被赋予一个标头,该标头由HTML 内容标签中的属性Content-ID引用。此链接允许电子邮件客户端将图像直接嵌入电子邮件正文中,而不是将其显示为可下载的附件。src<img>
附加图像– 该MIMEImage对象附加到多部分消息,类似于附加其他部分的方式。
异步电子邮件发送
对于异步电子邮件发送,您需要使用 Python 的asyncio库以及异步 SMTP 客户端 aiosmtplib 。
这种修改允许您的脚本发送电子邮件而不会阻塞程序的执行,从而提高效率,尤其是在发送多封电子邮件或同时执行其他任务时。
为简单起见,我将向单个收件人发送一封纯文本电子邮件,不包含附件和嵌入图像。以下是它的工作原理。
首先,确保安装了aiosmtplib。
pip install aiosmtplib
现在,脚本如下:
if __name__ == "__main__":
asyncio.run(main())
快速分解:
异步函数定义:脚本现在使用定义异步函数async def。
异步功能:利用“asyncio”和“aiosmtplib”,该脚本异步建立 SMTP 连接、登录并发送电子邮件。此方法允许无阻塞发送电子邮件,这对于需要在执行网络操作时保持响应能力的应用程序特别有用。
运行脚本:mainasync 函数设置电子邮件详细信息并调用 send_email_async 发送电子邮件。它演示了如何在 Python 中有效地运行异步任务,并asyncio.run(main())引导异步执行。
批量发送电子邮件
上述代码使用live.smtp.mailtrap.io事务性电子邮件的端点。但 Mailtrap 电子邮件传递平台的电子邮件包允许您bulk.smtp.mailtrap.io在同一计划下通过单独的流发送批量电子邮件。
Mailtrap Bulk Stream 设置
现在,唯一不同的是主机(端点),您需要调整脚本以适应它。但请记住,即使您的凭据几乎相同,事务性和批量电子邮件也有单独的基础架构。这有助于提高传递率和电子邮件管理。
为了说明这些变化,我使用给定的 SMTP 端点创建了一个简单的脚本。
设置“smtplib”
Python 的“smtplib”模块简化了从应用程序直接从发送电子邮件的过程,提供了与 SMTP 服务器交互的直接界面。
本部分将指导您导入“smtplib”,为您的服务器创建 SMTP 对象,并利用其核心功能发送电子邮件。继续学习如何将电子邮件功能集成到您的 Python 脚本中。
可以使用以下语句导入内置的 smtplib 模块:
import smtplib
为了稍后发送电子邮件,请创建一个 SMTP(简单邮件传输协议)对象:
smtpObj = smtplib.SMTP( [host [, port]] )
参数详细信息:
host − 这是一个可选参数,是运行 SMTP 服务器的主机。可以指定主机的 IP 地址或域名。
port− 如果指定了主机参数,则指定 SMTP 服务器正在监听的端口。
local_hostname− 如果使用的 SMTP 服务器在您的本地机器上运行,请指定localhost。
SMTP 对象有一个名为的实例方法sendmail ,用于发送消息,并具有三个参数:
sender− 包含发件人地址的字符串。
receivers− 字符串列表,每个收件人一个。
message− 按照 RFC 中指定格式的字符串消息。
smtpObj.sendmail(sender, receivers, message)
为了确保电子邮件模块已正确导入并获取其类和参数的完整描述,请在交互式 Python 会话中输入:
help(smtplib)
请参阅Python 文档以进一步了解其余 SMTP 对象(例如smtp.ehlo;smtp.send_message(msg)等等)以及如何应用它们。
以下部分将向您介绍如何使用 Mailtrap 电子邮件发送(Mailtrap 电子邮件传递平台的一项功能)通过 Python 发送电子邮件。首先,我将介绍 SMTP 方法,然后向您展示如何使用我们的 Python SDK 来执行此操作。
使用 SMTP 发送电子邮件
该方法与我上面在“smtplib”中介绍的方法非常相似,但是,您需要 电话数据 设置自定义 SMTP 凭据。在这里,我假设您已经注册了 Mailtrap 并验证了您的域。
如果没有,请查看我们的详细指南。
另请务必查看我们的视频说明,了解如何使用 smtplib 通过 Mailtrap 在 Python 中发送电子邮件。
注意:以下代码包含虚拟 Mailtrap 凭证(禁止服务器端点),请确保将其替换为您的真实凭证。
这是一个使用 Mailtrap SMTP 通过 Python 发送“纯文本”电子邮件的基本脚本。
"""
print('Sent')
快速分解:
导入和设置– 我已经从 Python 的标准库中导入了电子邮件所需的模块(“smtplib”和“MIMEText”)。
电子邮件服务器配置– SMTP 服务器详细信息,包括服务器地址、端口号和身份验证凭据。
电子邮件内容– 我创建了一条MIMEText只能包含纯文本的消息。稍后,我将向您展示如何包含电子邮件的 HTML 和纯文本版本。
发送电子邮件——我使用了上下文管理器(with语句)来确保发送电子邮件后与 SMTP 服务器的连接正确关闭。
额外提示:在脚本中硬编码敏感数据(例如登录凭据和服务器信息)可能会带来安全风险。这就是为什么我建议使用环境变量来存储敏感信息。这可以使您的代码在不同环境(开发、测试、生产)之间移动时更加安全和灵活。
发送 HTML 电子邮件
如果您想了解有关使用 Python 发送 HTML 电子邮件的更多信息,请查看我们的专门教程。
为了修改发送 HTML 电子邮件的脚本(同时仍包含多个收件人),我将调整电子邮件正文的创建和附加方式。以下是修改后的脚本:
print('Sent')
快速分解:
附加 HTML 内容– 使用“MIMEText(html, “html”)”而不是“MIMEText (text, “plain”)”将 HTML 内容附加到电子邮件消息中。通过指定html第二个参数,我们通知电子邮件客户端应将电子邮件的这一部分解释为 HTML。
使用 Mailtrap 免费发送电子邮件
发送电子邮件给多个收件人
在这里,我将重复使用上面的脚本并调整接收者地址的处理方式。
print('Sent')
快速分析一下与原始脚本的不同之处plaintext:
多个收件人配置– 我将receiver_email变量更改为receiver_emails。它现在是电子邮件地址列表,而不是单个字符串。
设置To标题– ToMIMEText 消息对象中的标题是通过将收件人电子邮件列表合并为一个以逗号分隔的字符串来设置的。这对于电子邮件标题在收件人收到电子邮件时正确显示所有收件人非常重要。
注意:某些电子邮件客户端(Outlook、Yahoo、Gmail 等)可能会向每个收件人显示字段中的所有收件人To,出于隐私原因,这是不可取的。您可以使用CCand/或来“修复”它BCC。
循环发送电子邮件- 脚本现在不再发送一次电子邮件,而是循环遍历receiver_emails列表中的每个收件人并单独向他们发送电子邮件。
专业提示: 这种方法适用于收件人数量较少的情况。但是,如果要向大量收件人发送电子邮件,使用 SMTP 服务器在一次发送操作中处理多个收件人的功能可能会更有效,具体取决于服务器的限制和策略。
发送带附件的电子邮件
我将使用,MIMEMultipart因为附件需要多部分电子邮件。此外,我将使用该类MIMEBase来附加文件。以下是更新后的脚本:
print('Sent')
快速分解:
使用MIMEMultipart– 我从MIMEText正文切换到MIMEMultipart整体邮件结构。这样我们就可以添加文本部分和附件作为电子邮件的单独部分。
添加附件:
文件准备——以二进制模式打开附件文件rb,并读取其内容。
MIMEBaseobject –MIMEBase为附件创建一个对象,类型设置为application/octet-stream。此类型是通用二进制流,这意味着它适用于任何文件类型,并且电子邮件客户端通常会将其视为附件。
编码– 文件内容采用 base64 编码,以确保可以通过电子邮件安全传输。这是使用encoders.encode_base64(part)函数完成的。
添加标题– 在附件部分添加标题以指示文件名并且应将其视为附件(Content-Disposition标题)。
将文件附加到消息– 然后使用将附件部分附加到消息中message.attach(part)。
发送嵌入图像的电子邮件
要发送带有嵌入图像(在 HTML 内容中)的电子邮件,我将使用该类MIMEImage。
将图像直接嵌入电子邮件中可使其作为电子邮件内容的一部分显示,而不是作为单独的附件显示。操作方法如下:
print('Sent')
快速分解:
HTML 内容更新:HTML 内容现在包含一个<img>标签,该标签带有src指向Content-ID (cid)您要嵌入的图像的属性。这cid必须与Content-ID图像附件的标头值匹配。
嵌入图像:
使用MIMEImage– 脚本现在包含MIMEImage处理图像文件的类。此类专门用于将图像附加到电子邮件。
打开图像文件– 您想要嵌入的图像以二进制模式打开。
创建MIMEImage对象– 使用图像的二进制数据创建MIMEImage对象。此对象代表图像附件。
Content-ID 标头–MIMEImage对象被赋予一个标头,该标头由HTML 内容标签中的属性Content-ID引用。此链接允许电子邮件客户端将图像直接嵌入电子邮件正文中,而不是将其显示为可下载的附件。src<img>
附加图像– 该MIMEImage对象附加到多部分消息,类似于附加其他部分的方式。
异步电子邮件发送
对于异步电子邮件发送,您需要使用 Python 的asyncio库以及异步 SMTP 客户端 aiosmtplib 。
这种修改允许您的脚本发送电子邮件而不会阻塞程序的执行,从而提高效率,尤其是在发送多封电子邮件或同时执行其他任务时。
为简单起见,我将向单个收件人发送一封纯文本电子邮件,不包含附件和嵌入图像。以下是它的工作原理。
首先,确保安装了aiosmtplib。
pip install aiosmtplib
现在,脚本如下:
if __name__ == "__main__":
asyncio.run(main())
快速分解:
异步函数定义:脚本现在使用定义异步函数async def。
异步功能:利用“asyncio”和“aiosmtplib”,该脚本异步建立 SMTP 连接、登录并发送电子邮件。此方法允许无阻塞发送电子邮件,这对于需要在执行网络操作时保持响应能力的应用程序特别有用。
运行脚本:mainasync 函数设置电子邮件详细信息并调用 send_email_async 发送电子邮件。它演示了如何在 Python 中有效地运行异步任务,并asyncio.run(main())引导异步执行。
批量发送电子邮件
上述代码使用live.smtp.mailtrap.io事务性电子邮件的端点。但 Mailtrap 电子邮件传递平台的电子邮件包允许您bulk.smtp.mailtrap.io在同一计划下通过单独的流发送批量电子邮件。
Mailtrap Bulk Stream 设置
现在,唯一不同的是主机(端点),您需要调整脚本以适应它。但请记住,即使您的凭据几乎相同,事务性和批量电子邮件也有单独的基础架构。这有助于提高传递率和电子邮件管理。
为了说明这些变化,我使用给定的 SMTP 端点创建了一个简单的脚本。