Golang利用自定义模板发送邮件的方法详解
前言
在几周前,我开始工作于一个证券投资组合网站。虽然我只能使用 react 完成整个网站,但我决定使用 go 来创建一个可以处理某些任务(例如发送 email)的 api 服务器,相信这是一个很好的做法。
我其中的一个页面是一个 contact 页面,目前看起来像这样:
contact me
我想使用专门为此 contact 表单申请的 gmail 帐户发送一封邮件。除了我以前用过 javascript 发送电子邮件的事实,我没有特别选择 go。但为什么不尝试 go 呢?我觉得 go 很棒。
步骤一:创建必要的文件
你只需要两个文件,一个 html 文件和一个 go 文件。它们可以放置在同一目录中。只需确保您能正确地引用到 html 文件即可。
注意:您甚至不需要 html 文件,但您必须在 go 文件中以字符串形式编写 html。我假设你的 go 环境已经正确设置。如果没有,请参照这里:
步骤二:创建模板
该模板是一段非常简单的 html,而然您可以自定义。先忽略 .name,我们稍后再回来。
步骤三:go!
1、添加必要的包
当你阅读时,您应该知道为什么我们需要这些。
2、登录 gmail
第 14 行至第 16 行: 我从之前设置的环境变量中获取了 gmail 帐户的用户名和密码。 使用 smtp 包的 planeauth 方法结合 email 服务器的用户名、密码和主机名来登录。
3、解析模板并设置 email
第 20 行至第 26 行: 首先通过解析 html 来创建一个模板,然后把它存储在一个变量 t 中(稍后再用)。然后声明一个 bytes.buffer 用于保存 email 的 主题、header 和正文(自定义 html)。我发现使用 bytes.buffer 类型比在其他在线解决方案中使用的其他类型更加灵活。fmt 包中的 sprintf 是一个返回格式化字符串的方便方法。您可以使用它来返回包含 email 主题和 header 的字符串。然后将该字符串转换为字节数组,并使用 write 方法写入字节缓冲区。到目前为止,字节缓冲区包含了主题和 header。 接下来我们再补充一下。注意:像 http 一样,您必须在 header 之后添加两行新行。
4、填充数据模板并发送 email
第 28 行至第 37 行: 然后我们需要执行该模板,第一个参数必须实现 io.writer 接口。由于 bytes.buffer 类型实现了 io.writer 接口,我们可以通过传入一个指向 body 变量的指针来使用它。为什么我们使用指向 body 而不是该值的指针与 go 如何实现接口有关,您可以在中获取更多信息。第二个参数包含我们想要传入的模板(html)数据。还记得 html 中的 .name 么?那就是我们如何引用执行模板的数据。. 是我们的结构体,name 指的是属性。不要对 struct 语法感到困惑,我只是在一条语句中声明了结构体并初始化它。在 html 中使用变量只是您在 go 模板中可以做的事情之一。
最后,使用 sendmail 方法来带上主机与端口、之前创建的 auth 类型、from 字段字符串和包含要发送 email 的地址的字符串数组。据我所知,from 字段字符串什么都不做。也许它对其他 email 服务器有用?
如果您想了解有关 smtp 包的更多信息,这是指向文档的。您还可以在阅读关于 text/template 包的内容。我知道我们使用了 html/template 包,但在 godocs 中,template 的实现细节在 text/template 的文档中。
译者注
文末提到的 from 字段指定是 email 中的发件人。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。