使用Django构建简单的邮件服务

2020-05-17 06:50:38

在创建Web应用程序时,经常会要求发送电子邮件:无论是用户在我们的平台注册时必须发送电子邮件,还是忘记密码,或者购买后必须发送付款确认。电子邮件需求实际上非常重要,如果我们不从一开始就构建电子邮件服务,它可能会变得混乱不堪。

这篇文章的目的不仅是帮助你从头开始定义一个灵活的电子邮件服务,让你可以轻松地改变电子邮件交付平台,而且在实际电子邮件内容方面也是灵活的。

这一次我将使用Django展示一个示例,但我希望其主要思想可以传播到您可能正在使用的其他框架和编程语言。

假设我们想要在用户注册我们的Web应用程序之后向他或她发送一封电子邮件。在运行所有验证并创建用户之后,我们可以使用Django的文档在视图中发送电子邮件。我们会想出这样的东西:

当然,您必须在您的设置中设置一些重要的配置,如EMAIL_HOST和EMAIL_PORT,正如文档所述。

正如我前面所说的,我们可能需要在应用程序的几个部分发送电子邮件,所以如果有一个电子邮件服务或邮件发送程序来处理所有的电子邮件请求,这会很好,这样可以更容易地添加修复或更改,因为我们不必搜索整个代码。

现在我们已经将所有的“电子邮件代码”移到了一个地方,我们可以利用这一点了!创建知道在被调用时发送什么内容的特定邮件程序怎么样?让我们添加一个将在每次新用户注册时生效的邮件程序和另一个发送订单确认的邮件程序!

这表明,根据不同的情况合并更多的邮件程序是非常容易的。您只需让基本邮件程序处理实现,然后由子类设置内容。

现在,我们的注册视图将看起来干净得多,因为它不必处理所有的电子邮件内容:

假设我们必须使用SendGrid的官方python库将电子邮件后端移动到SendGrid(一个用于交易和营销电子邮件的客户通信平台)。我们将不再使用Django的Send_Email。相反,我们将不得不使用新库的语法。井…。我们很幸运!我们将所有与电子邮件管理相关的代码都放在一个位置,这样我们就可以更轻松地重构😉。

请注意,您必须在您的设置中设置SendGrid的API密钥,还请注意,html模板将直接从SendRID的网页进行管理,并且您需要拥有模板的ID来指定应该使用哪个模板。

太棒了!这并不是很困难,我们不需要修改我们想要发送电子邮件的每一行代码!

当然,当我们发送电子邮件时,很可能会使用一些域数据来填写电子邮件的模板。例如,如果我们的欢迎电子邮件中包含新用户名,会更友好。SendGrid允许您在模板中定义变量,这些变量将被从我们那里接收到的实际信息替换。那么让我们添加这个数据吧!

我在这里看到的唯一问题是这个替换方案不太灵活。很可能会发生这样的情况,我们必须根据用户无法访问的上下文传递其他数据,例如:新订单编号、重置密码链接等。可能有相当多的这些变量,将它们作为命名参数传递可能会使代码变得更混乱、更肮脏。(=。我们需要一个关键字可变长度的参数列表,通常称为**kwargs,但为了使其更具表现力,我们将其命名为**替换:

如果您必须向邮件程序传递额外的信息,您将执行以下操作:

我们已经创建了一个灵活的邮件程序,它将所有与电子邮件相关的代码封装在一个位置,使其更易于维护,并且还可以接收可变的上下文参数来填充电子邮件内容!一次考虑整个方法可能很困难,但逐步实现会更简单,好处也很多。我鼓励您使用此设计在电子邮件中添加附加文件的功能!

非常感谢您阅读这篇文章,我希望它能对您的项目有所帮助。请关注我即将发布的帖子,我祝您好运,并祝您编码愉快!