译者 | 刘涛
审校 | 重楼
在本教程中,我将引导你逐步深入了解在Python环境中使用两种不同方式发送电子邮件的具体流程:
- 基于传统SMTP方式:利用 Python 内置的“smtplib”模块,按照传统的 SMTP 配置方式来发送电子邮件。
- 基于Mailtrap方式:通过使用Mailtrap提供的官方 SDK,调用其API来实现电子邮件的发送功能。
如果你对上述工具及相关工作流程尚不熟悉,在此简单介绍一下:简单邮件传输协议(SMTP)是一种广泛应用于各类应用程序和网站,用于发送电子邮件的标准协议。而 Mailtrap 则是一款专门设计的电子邮件投递平台,其目标在于实现高邮件投递成功率。该平台不仅配备了一系列聚焦于业务增长的实用功能,还拥有业内领先水平的分析工具,能够为用户提供全面且深入的邮件投递数据洞察。
在本文结尾,你将了解如何将发送电子邮件的功能集成到Python项目中,并在实际场景中使用Mailtrap实现可靠的电子邮件投递。
目录
- “smtplib”设置
- 如何使用Mailtrap SMTP发送电子邮件
- 如何使用Mailtrap电子邮件API发送电子邮件
- 总结
“smtplib”设置
若要开启使用Python发送电子邮件的操作,我们首先学会运用内置的 “smtplib”模块。此模块具备强大功能,能够让你的程序连接至SMTP服务器,进而直接从应用程序中发送电子邮件。
第一步,请使用以下语句导入“smtplib”模块:
接下来,创建一个“SMTP”对象,该对象的作用是对与SMTP服务器的连接进行配置。在后续的操作中,这个对象将负责处理电子邮件的发送任务。
- “host”指的是SMTP服务器端点,比如“live.smtp.mailtrap.io”这类具体的服务器地址。
- “port”指的是服务器使用的通信端口。通常推荐使用587端口,该端口用于通过TLS加密方式安全地发送电子邮件。
专业提示:“SMTP”对象包含一个名为“sendmail”的实例对象。该对象带有三个参数,其中每个参数均为字符串类型(需注意,“”receivers“” 这个参数是一个字符串列表)。
若要确认“smtplib”模块是否已正确导入,同时查看参数和类的完整描述信息,可运行以下命令:
如何使用Mailtrap SMTP发送电子邮件
此方法需要设置你从Mailtrap获取的自定义SMTP凭证。
重要提示:
- 使用 Mailtrap 的虚拟域名测试服务:若你希望试用 Mailtrap,无需即刻对你的域名进行验证。你可以使用 Mailtrap 提供的虚拟域名(在注册时即可获得访问权限)。使用该虚拟域名,你能够模拟电子邮件的发送过程,而无需担忧DNS记录相关问题。这种方式十分适合用于测试Mailtrap服务,并深入熟悉其各项功能。
- 生产环境中的域名验证:倘若你计划向收件人发送真实有效的邮件,那么就必须对你的域名进行验证。这一过程要求你在域名提供商的DNS设置中添加诸如 SPF、DKIM和DMARC等DNS记录。这些记录对于确保邮件能够成功投递至关重要,同时还有助于防范网络钓鱼以及伪造邮件等安全风险。在接下来的部分内容中,我将为你详细展示如何在域名提供商的控制面板中完成这些设置操作。
验证发件域名(SPF/DKIM和DMARC)
DNS 记录在确保电子邮件成功投递方面起着关键作用,诸如Gmail(谷歌邮箱)和雅虎等邮箱提供商均要求进行 DNS 认证。
在详细介绍操作方法之前,我们先对每种记录类型进行回顾,以便你深入理解它们的重要性:
- SPF(发件人策略框架):此记录的作用是协助邮件服务器判定发件人的 IP 地址是否被授权使用你的域名发送邮件。通俗来讲,添加 SPF 记录能够有效阻止垃圾邮件发送者冒用你的域名发送邮件,从而保障你的域名安全和邮件发送的合法性。
- DKIM(域名密钥识别邮件):DKIM使用加密技术对发件人的域名进行验证,同时确保邮件内容在传输过程中未被篡改。该技术为你的邮件提供了可靠的防伪保护,增强了邮件的可信度和安全性。
- DMARC(基于域名的消息认证、报告与一致性):DMARC将SPF和DKIM的功能相结合,不仅制定了针对未经身份验证的电子邮件的处理策略,还能够对邮件活动进行详细报告。通过 DMARC,你可以更好地掌控以你域名发送的邮件的安全性,确保邮件传输的合规性和可靠性。
以下是添加这些记录的具体步骤:
- 首先,你需要访问域名提供商的DNS设置。一般而言,你可以在域名注册平台或域名管理设置板块中找到该入口。例如,在GoDaddy平台(注:GoDaddy是一家知名的网络托管公司和域名注册商,提供多种互联网服务)上,该入口被命名为“管理 DNS”,其他域名提供商的相关入口名称虽有所不同,但功能类似。
- 接下来,将 Mailtrap 提供的 DNS 记录(通过复制粘贴的方式)添加至你域名提供商的 DNS 设置中。需要注意的是,Mailtrap提供的记录是经过精心设置的,其中SPF记录已预先解析完成。因此,你无需进行额外的创建操作,直接添加这些记录即可完成相应配置。
- 最后,你可以通过Mailtrap查看记录的状态。
以下展示的是使用Python通过Mailtrap发送电子邮件的最简脚本。出于安全方面的考量,在该脚本中,用户名和密码部分采用了占位符(SMTP 服务器端点和端口除外)。
当运行此脚本时,请务必将这些占位符替换为你实际的Mailtrap凭证,以确保电子邮件能够成功发送。
在该脚本中:
- 从 Python 标准库中导入了 smtplib 和 MIMEText 这两个模块。其中,smtplib 模块用于实现与 SMTP 服务器的交互,完成邮件发送相关操作;MIMEText 模块则用于处理邮件内容的格式。
- 正如前文所提及的,针对 SMTP 服务器的配置,需要使用你自己的凭证对相关部分进行更新。不过,服务器端点和端口这两个参数保持不变,它们是连接到特定邮件服务器的固定标识。
- 鉴于这是一个旨在展示基本功能的最简脚本,这里仅使用了包含 “plaintext”(纯文本) 格式的 MIMEText 来构建邮件内容。实际上,该脚本具备良好的扩展性,能够很方便地通过重构,使用MIMEMultipart 模块来同时处理 “plaintext” 和 “HTML” 格式的邮件内容。若你想了解具体的实现方式,可跳转到下面的快速教程部分查看。
- 在执行发送电子邮件的操作时,选用了 with 语句(即上下文管理器)。旨在确保邮件成功发送之后,能够立即关闭与 SMTP 服务器的连接。通过这种方式,可以有效避免资源的浪费以及可能出现的连接异常问题,保障系统的稳定性和资源的合理利用。
安全提示:
在编写发送邮件的脚本时,切勿将服务器信息和登录凭证直接硬编码到脚本中。当为生产环境配置脚本时,务必使用环境变量来存储这些敏感信息。这样做不仅能够增强代码的安全性,降低信息泄露的风险,还能使代码在不同开发阶段之间迁移时更加灵活。代码如下:
请注意,在运行脚本之前,你需要在操作系统中设置变量。
重构脚本以使用HTML邮件
HTML邮件能够显著提升用户体验。使用HTML 技术,你可以在邮件中嵌入格式化文本、图片、表格、可点击链接以及自定义样式等丰富元素。这一特性在营销邮件、时事通讯,以及任何对设计和品牌形象有较高要求的通信场景中,都具有极高的实用价值。
因此,若要对脚本进行重构以支持 HTML 邮件,你需要导入“MIMEMultipart”和“MIMEText”这两个模块。通过这种方式,你不仅能够精心自定义HTML格式的邮件内容,还能在收件人的设备或邮件客户端无法正常打开HTML邮件时,提供纯文本版本作为备用选项,确保邮件信息能够准确传达给收件人。
以下为修改后的脚本:
最后,我提供了关于SMTP方法的视频讲解。如果你觉得通过视频了解相关内容更符合你的习惯,欢迎随时查看。
https://www.youtube.com/watch?v=ufLpTc9up8s&t=1s。
如何使用Mailtrap电子邮件API发送电子邮件
若你不满足于仅使用 SMTP 方式发送电子邮件,而是期望将Mailtrap的电子邮件 API 集成到自己的 Python 应用程序中,本节内容将详细为你介绍具体操作方法。
Mailtrap 的 SMTP 电子邮件API具备诸多优势,它不仅能够使你更高效地发送电子邮件,还为整个邮件发送流程增添了灵活性与可扩展性。在着手进行集成操作之前,请务必确保你在 Mailtrap 平台上拥有一个已经过验证的发件域名,同时准备好用于验证请求的Mailtrap API令牌。
需要注意的是:接下来我将着重介绍如何使用 Mailtrap 官方的Python软件开发工具包(SDK)来完成 API 集成工作。
那么,第一步,请使用以下命令安装官方 SDK。
前提条件:请确保你的 Python 包版本为 3.6 或更高。
在成功安装软件开发工具包(SDK)之后,接下来的步骤是创建一个 Mail 对象。此对象将用于代表你即将发送的电子邮件,其中会涵盖发件人、收件人、主题以及邮件内容等关键信息。
快速说明:.
- 发件人与收件人:你需要明确指定发件人的电子邮件地址,此地址必须与你已验证的域名相匹配。同理,收件人的电子邮件地址也需准确设定。
- 主题与文本内容:需设置电子邮件的主题以及纯文本内容。后续将会提及,你同样能够添加HTML格式的内容。
- 客户端与发送:利用你的Mailtrap API令牌对“MailtrapClient”进行初始化操作,该令牌用于对 API 请求进行验证。然后在客户端调用“send”方法,并将“mail”对象作为参数传入。若要使用 Mailtrap API令牌创建客户端,可在 Mailtrap 中按照以下路径进行操作:
这样,你可以使用以下命令发送电子邮件:
最后,以下为使用Python SDK 发送基本“纯文本”电子邮件的SDK脚本。
在该脚本中:
- 考虑到此次要发送的是纯文本消息,因此所导入的类有“MailtrapClient”、“Mail” 以及“Address”。
- “Mail”对象包含以下部分:
a.构造函数:即用于创建对象的“Mail”构造函数。
b.发件人信息:“Sender”字段,使用“Address”类来定义发件人的姓名和电子邮件地址。
c.收件人信息:“to”字段,在通常情况下可以是一个由“Address”对象构成的列表。不过由于这里是一封纯文本电子邮件,所以它一般直接包含收件人信息,而非以列表形式呈现。
d.主题:电子邮件的主题,通过“subject”字段表示。
e.邮件内容:“text”字段,其中包含了电子邮件的内容,且是以纯文本(“plaintext”)形式存在。
f.可选字段:“headers”和“category”,这两个字段属于可选设置,合理使用它们有助于你更高效地管理电子邮件。
g.客户端创建与验证:利用 API 令牌创建“MailtrapClient”,并完成相应的验证工作。
h.邮件发送:调用“MailtrapClient”的“send”方法,将“mail”对象作为参数传入,以此来实现电子邮件的发送操作。
i.操作确认:打印“Plain text email sent successfully.(纯文本电子邮件发送成功)” 这一消息,用于确认电子邮件发送操作已成功完成。
- 电子邮件的发送流程如下:
重构脚本以包含 HTML 和附件
同样地,使用“MIMEMultipart”类对脚本进行重构,从而实现更为复杂的电子邮件结构,则会变得非常简单。
以下展示的是重构后的代码:
生产环境设置
在详细探讨具体设置细节之前,在此提醒你一些安全方面的最佳实践:
- 安全存储 API 密钥和凭证:在生产环境下,切勿将 API 密钥、电子邮件登录凭证或其他诸如机密信息这类敏感数据,直接硬编码到源代码中。一旦发生这样操作,你的应用程序将面临极大的安全风险。
- 使用环境变量:采用这种方式,不仅能够有效保障凭证的安全性,还能让你在不同的配置环境(例如开发环境、预发布环境【staging:指的是在正式生产环境之前的一个测试环境。它是软件开发过程中的一个阶段,用于模拟生产环境,进行最终的测试和验证】以及生产环境)之间轻松实现切换。
接下来为你介绍具体的设置方法:
- 使用“python - dotenv”包从“.env”文件中加载环境变量,使用以下命令安装该库: pip install python-dotenv
- 在项目的根目录下创建一个名为“.env”的文件,用于安全地存储环境变量。该文件会存放诸如你的 Mailtrap API 密钥、登录凭证以及 SMTP 服务器详细信息等敏感信息。以下为一个示例:
重要提示:确保此“.env”文件永远不会推送到版本控制系统(如Git)中。请将它添加到你项目里的“.gitignore”文件中,以此避免敏感信息因意外情况而被暴露。
- 在创建好“.env”文件之后,你需要将其中的变量加载到Python脚本中。具体操作是,在脚本的顶部位置,导入“dotenv”包,然后调用“load_dotenv()”函数,以此来实现环境变量的加载。
- 完成环境变量的加载后,你便能够将脚本中原本硬编码的凭证替换为这些环境变量。以下为一个示例:
专业提示:
首先,务必保证环境变量仅能被授权用户访问。在生产服务器环境下,通常表示仅通过部署配置来设定对环境变量的访问权限(例如,使用 Heroku 的配置变量、AWS Secrets Manager,或者其他基于云的机密管理工具来实现)。
其次,建议在开发、预发布以及生产环境中使用不同的环境变量。这样做能够有效确保生产环境与开发流程中的其他阶段相互隔离,进而为生产环境提供更妥善的保护。
一旦在本地完成环境变量的配置后,接下来就需要将应用程序部署到生产环境中。在此过程中,一定要在生产服务器或服务里设置相同的环境变量。
倘若你计划将应用程序部署到诸如 Heroku、AWS或者谷歌云这类平台,你可以使用这些平台各自提供的环境变量管理工具,安全地存储和访问机密信息,由此一来便无需手动管理“.env”文件。
总结
这个快速教程为你提供了充足的内容,以帮助你使用Python发送电子邮件。需要注意的是,上述脚本具备进一步扩展的空间,能够涵盖 HTML 格式内容、多个收件人、附件、图片等更多功能。
倘若你对这方面内容感兴趣,或者希望了解更多安全提示与最佳实践相关知识,可以访问 Mailtrap 博客,获取更为详尽的教程。
译者介绍
刘涛,51CTO社区编辑,某大型央企系统上线检测管控负责人。
原文标题:How to Send Emails in Python using Mailtrap SMTP and the Email API,作者:Alex Tray