美文网首页
【Go Web开发】发送邮件

【Go Web开发】发送邮件

作者: Go语言由浅入深 | 来源:发表于2022-03-10 21:40 被阅读0次

在接下来的几篇文章中,我们将在API中注入一些交互,并调整用户注册API处理函数registerUserHandler,以便在用户成功注册后向其发送欢迎电子邮件。

在这个过程中,我们将讨论一些有趣的话题。你将学习:

  • 如何在开发中使用Mailtrap SMTP服务来发送和监控测试邮件。
  • 如何使用html/template包和Go 1.16的嵌入文件功能来创建动态易管理的邮件内容模版。
  • 如何为应用创建可复用的internal/mailer包来发送邮件。
  • 如何实现后台协程发送邮件模式,以及优雅关闭时候,如何等待这些操作完成。

配置SMTP服务器

为了开发邮件发送功能,需要访问SMTP(简单邮件传输协议)服务器来进行测试。

现在有很多STMP服务提供商(例如Postmark,Sendgrid或Amazon SES)可以用来发送邮件,你甚至可以自己安装搭建SMTP服务器。但在本书中我们将使用Mailtrap

使用Mailtrap的原因是因为它是在开发和测试期间发送电子邮件的专业服务。从本质上讲,它将所有电子邮件发送到一个你可以访问的收件箱,而不是发送给真正的收件人。

作者和这家公司没有任何联系,只是觉得这家公司的服务很好,使用起来也很简单。他们还提供了一个“永久免费”的计划,这对任何编写代码的人来说都应该足够了。

注意:如果你已经有自己的STMP服务器,或想选择别的服务提供商也是可以的。请直接跳到过。

配置Mailtrap

要设置一个Mailtrap帐户,请前往注册页面,在那里可以使用您的电子邮件地址、谷歌或GitHub帐户注册。注册并登录后,应该会看到一个列出可用收件箱的页面,类似于下面的截图。


每个Mailtrap帐户都有一个免费的收件箱,默认情况下被称为演示收件箱。如果您愿意,可以通过单击Actions下面的铅笔图标来更改名称。继续点击收件箱,将看到当前是空的没有任何邮件,如下所示:

每个收件箱都有自己的SMTP认证信息,您可以通过单击Show credentials链接(在上面的屏幕截图中由红色框突出显示)来显示这些认证信息。类似于下面的截图。

您使用这些SMTP认证信息发送的任何邮件最终都会进入这个收件箱,而不是发送到实际的收件人。如果你跟随本文操作,请记住自己屏幕显示的认证信息,后面将会使用到。

上面显示的认证信息已经重置过了不在生效,请不要使用。

创建邮件模版

首先,我们将欢迎电子邮件的内容设置的非常简单,仅包括一条短消息,让用户知道他们的注册已成功,并确认了他们的ID号。类似于:

Hi,

Thanks for signing up for a Greenlight account. We're excited to have you on board! 

For future reference, your user ID number is 123.

Thanks,

The Greenlight Team

注意:在欢迎邮件中包含用户ID可能不是你想做的事情,但这是我们演示如何在邮件中包含动态数据的简单方法——不仅仅是静态内容。

我们可以采用几种不同的方法来定义和管理这封电子邮件的内容,但一个方便灵活的方法是使用html/template包中的模版功能。

如果你跟随本系列文章操作,请在项目根目录中创建internal/mailer/template文件夹,然后添加user_welcome.tmpl文件,如下所示:

$ mkdir -p internal/mailer/templates
$ touch internal/mailer/templates/user_welcome.tmpl

在这个文件中,我们将定义三个命名模版来作为我们欢迎邮件的一部分:

  • "subject"模版包含邮件的主题行
  • "plainBody"模版包含邮件邮件消息体的文本变量
  • "htmlBody"模版包含邮件消息体的HTML变量

更新internal/mailer/tmeplates/user_welcome.tmpl文件包含以下模版内容:

{{define "subject"}} Welcome to Greenlight!{{end}}

{{define "plainBody"}}
Hi,

Thanks for singing up for a Greenlight account. We're excited to have you on board!

for future reference, your use ID number is {{.ID}}.

Thanks,

The Greenlight Team
{{end}}

{{define "htmlBody"}}

<!doctype html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body> 
    <p>Hi,</p>
    <p>Thanks for signing up for a Greenlight account. We're excited to have you on board!</p> <p>For future reference, your user ID number is {{.ID}}.</p>
    <p>Thanks,</p>
    <p>The Greenlight Team</p>
</body>
</html> 
{{end}}

模版内容包含:

  • 使用{{define "..."}}...{{end}}标签定义了三个命名模版。
  • 可以使用动态数据来渲染模版。下一节我们将传入用户结构体作为模版动态数据,将用户ID填入模版的{{.ID}}位置。

注意:如果你经常修改邮件文本或要求用户可编辑,可能需要将模版作为字符串存储在数据库中。但我发现,将它们存储在一个文件中,就像上面操作的,是一种不那么复杂的方法,也是大多数项目使用的方式。

相关文章

网友评论

      本文标题:【Go Web开发】发送邮件

      本文链接:https://www.haomeiwen.com/subject/srsqdrtx.html