在接下来的几篇文章中,我们将在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帐户注册。注册并登录后,应该会看到一个列出可用收件箱的页面,类似于下面的截图。
![](https://img.haomeiwen.com/i21436181/0bd969778b1002f9.png)
每个Mailtrap帐户都有一个免费的收件箱,默认情况下被称为演示收件箱。如果您愿意,可以通过单击Actions下面的铅笔图标来更改名称。继续点击收件箱,将看到当前是空的没有任何邮件,如下所示:
![](https://img.haomeiwen.com/i21436181/e65db92da6eeb5fb.png)
每个收件箱都有自己的SMTP认证信息,您可以通过单击Show credentials链接(在上面的屏幕截图中由红色框突出显示)来显示这些认证信息。类似于下面的截图。
![](https://img.haomeiwen.com/i21436181/8f85b228db6c5de3.png)
您使用这些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}}位置。
注意:如果你经常修改邮件文本或要求用户可编辑,可能需要将模版作为字符串存储在数据库中。但我发现,将它们存储在一个文件中,就像上面操作的,是一种不那么复杂的方法,也是大多数项目使用的方式。
网友评论