使用 Twilio SendGrid 从 Python Flask 应用程序发送电子邮件

已发表: 2020-06-30

确定是构建还是购买您的电子邮件基础设施不是一个小决定。 您是否有足够的带宽来支持可交付性问题? 随着你的成长,你能跟上你的发送吗? 什么更划算? 虽然有许多因素需要考虑,但这是另一个指南的对话(例如Build it 或 Buy It指南)。

相反,本教程将向您展示通过专用电子邮件服务发送电子邮件是多么容易。 我们将介绍如何使用Flask框架和Flask-Mail扩展通过 Twilio SendGrid 传递电子邮件

教程工具

要遵循本教程,您需要以下项目:

  • Python 3.6 或更新版本。 如果您的操作系统不提供 Python 3.6+ 解释器,您可以前往python.org下载安装程序。
  • 免费的 Twilio SendGrid 帐户。 如果您是 Twilio SendGrid 的新手,请注册一个试用帐户 使用试用帐户,您可以在 30 天内发送 40,000 封电子邮件,然后每天发送 100 封电子邮件。

使用 SendGrid 进行设置

在您可以通过 SendGrid 发送电子邮件之前,您必须创建一个 API 密钥,用于验证对 SendGrid 服务的访问。 登录到您的 SendGrid 帐户,然后单击左侧边栏选择“设置”,然后选择API Keys 单击“创建 API 密钥”。

为您的 API 密钥起一个友好的名称(保持简单明了,以便您记住它所指的内容!)。 对于本教程,我们选择了名称Flask-Mail 。 我们为权限选择了“完全访问”,这使密钥能够执行所有必要的电子邮件发送功能(访问 GET、PATCH、PUT、DELETE 和 POST 端点)。 如果您希望创建具有非常特定权限的密钥,请选择“受限访问”并根据需要配置您的访问权限。

当您单击“创建和查看”按钮时,您将看到您的密钥。 该键将永远不会再次显示,因此您需要单击它以将其复制到剪贴板。 然后将其粘贴到安全文档中,以便以后使用。 如果您丢失了密钥,则需要生成一个全新的密钥。 保存密钥后,您可以单击“完成”按钮。

构建 Python 环境

现在我们已经完成了设置,我们可以深入研究如何从 Python Flask 应用程序发送电子邮件。 我们将首先在您的计算机上创建一个名为 *twilio-sendgrid-tests*(或类似名称)的新目录,然后在其中创建一个新的 Python 虚拟环境。

对于 Mac 和 Unix 用户,命令是:

对于 Windows 用户,命令是:

接下来,在您的虚拟环境中安装 Flask、Flask-Mail 和 python-dotenv:

设置 Flask 应用程序

让我们在app.py文件中构建一个入门 Flask 和 Flask-Mail 应用程序

在这里,您可以看到如何正确配置 Flask-Mail 以使用 SendGrid 的 SMTP 服务。 重要的设置是:

  • 邮件服务器应该是`smtp.sendgrid.net`。
  • 邮件端口应该是 587。(你知道什么时候使用哪个端口吗?看看这篇博文。
  • 必须启用 TLS。SSL 和 TLS有什么区别?)
  • 需要进行身份验证。 对于用户名,您必须使用 `apikey`(所有 SendGrid 帐户都一样)。 密码是您在上一节中创建的 SendGrid API 密钥。

对于这个 Flask 应用程序,我们在 Flask-Mail 扩展的正确配置键中添加了上述设置。 出于安全原因,我们从名为“SENDGRID_API_KEY”的环境变量中导入了 API 密钥。 我们还从环境变量中设置了默认的发件人电子邮件地址。 这是默认情况下将出现在所有电子邮件的“发件人”字段中的电子邮件地址。

使用两个必需的变量创建一个.env文件:

Flask 会自动导入.env文件中定义的变量(只要你安装了 python-dotenv 包),所以这足以让这两个变量进入 Flask 应用程序配置。

发送测试电子邮件

让我们看看如何从 Python shell 给自己发送一封测试电子邮件:

请注意,我们使用 `flask shell` 命令启动了 Python shell。 这将确保我们在app.py中构建的 Flask 应用程序被导入。

进入 shell 后,导入我们在 app.py 中创建的 `mail` 实例Flask-Mail 中的 `Message` 类:

接下来创建一个 `Message` 实例:

最后一步是发送此电子邮件:

就是这样! 如果一切按计划进行,电子邮件应该会在几秒钟内到达您的收件箱。

如果您想查看集成此功能的 Flask 路由示例,可以在app.py底部添加一个简单的示例

要完成示例应用程序,您需要添加index.html模板文件。 首先为您的模板创建一个目录:

然后在文件templates/index.html中写入以下内容

运行测试应用程序:

然后在 Web 浏览器中导航到http://localhost:5000以访问该应用程序。

您现在可以输入收件人电子邮件地址,当您单击按钮时,一封测试电子邮件将发送到该地址。

解决交付问题

通过使用上面的 Flask 应用程序,您应该可以成功发送电子邮件。 但是,您的电子邮件有可能无法送达。 由于 SendGrid 异步发送电子邮件,大多数传递错误发生在发件人完成他们一方的事务之后,因此您的应用程序不会有任何指示出现错误。 如果发生这种情况,则很可能电子邮件被收件人的电子邮件服务器拒绝。

幸运的是,如果您通过发送我们所描述的电子邮件遇到这种情况,您可以使用 Twilio SendGrid 仪表板来帮助您调试发生的事情。 SendGrid 仪表板中,单击Activity ,然后单击页面中间的“显示所有活动”按钮。 这将向您显示您尝试发送的所有电子邮件的列表,指示它们是否已成功发送。

您可以在上图中看到发送到 example.com 地址的电子邮件未能送达。 对于任何未送达的电子邮件,您可以单击该电子邮件以查看详细信息,包括收件人电子邮件服务器发送的任何错误响应。

一旦确定了电子邮件未发送的原因,就有多种方法可以解决这些交付问题。 如果您在电子邮件中看到许多拼写错误(例如@yaho.com 或@gmal.com),可能值得探索一个电子邮件验证工具来捕获您的电子邮件联系人列表中的任何常见拼写错误。

还有许多其他问题可能导致发送失败,包括发送信誉不佳或 IP 地址被阻止。 在我们的2020 年电子邮件送达率指南中了解有关电子邮件送达率的所有信息

结论

从教程中可以看出,Twilio SendGrid 轻松集成到启动 Flask 电子邮件发送工作流中,使发送电子邮件成为一项简单的任务。

如果您现在想知道如何在 Python 中接收来自 Flask 框架的电子邮件,不用担心,我们已经为您服务! 查看这篇文章:如何使用 Flask Framework for Python 接收电子邮件

而且,有关如何与 Twilio SendGrid 集成或通过我们的 API 发送的更多资源,请查看我们的知识中心