发送邮件
ReactGO 集成邮件发送功能,可以通过 SMTP 协议发送邮件。
你可以从免费的邮件服务商注册账号,大部分的邮件服务商都是支持的,包括 Outlook,QQ 邮箱,163 等等。
配置
在使用邮件发送接口前,需要先进行配置,在 ReactGO 系统管理>系统设置
中,打开邮件页面,如下:
添加邮件传输代理
在上图中,可以添加邮件传输代理
,所谓邮件传输代理就是邮件服务商提供给你的 smtp 服务器登录信息,
如果你使用过其它的邮件客户端,可能已经配置过 SMTP 信息。
点击添加出现一个界面,需要录入一些信息,录入的信息如下:
字段名 | 说明 |
---|---|
名称 | 自定义的名称,方便识别,例如 QQ 邮箱 |
服务器地址 | SMTP 服务器的地址,一般是一个域名,例如 smtp.qq.com |
服务器端口 | 端口号,一般是 465 |
加密模式 | 2 个选项,SSL / StartTLS,一般选 SSL |
发件人地址 | 一般是你的账号,例如你的 QQ 邮箱账号 23456@qq.com ,地址可以包含名称,参考后面 |
登录用户 | 一般你不会需要使用它,而是使用 发件人地址 作为登录账号 |
登录密码 | 你的登录密码 |
标题前缀 | 在邮件标题前面添加字符串,一般是产品名称或公司名称,例如 [reactgo] |
回复地址 | 你可以指定一个回复地址,用户收到邮件后点回复时,将默认是用回复地址 |
抄送地址 | 你可以指定一个或多个抄送地址,每封邮件都会抄送到该地址 |
密送地址 | 类似于抄送地址,只是采用密送的方式 |
发件人地址
、回复地址
、抄送地址
、密送地址
可以采用普通地址和 带名称的地址
,
带名称的地址格式如下:
Lucky Byte, Inc <service@lucky-byte.com>
前面 Lucky Byte, Inc
是名称,后面 <service@lucky-byte.com>
是地址,
使用带名称的地址时,对方的邮件客户端会显示你设置的名称,而不是地址。
多个和排序
你可以添加多个邮件传输代理,并设置顺序,在发送邮件时,系统按照从上到下的顺序逐个尝试使用, 如果第一个不能发送邮件,则会使用第二个,依此类推,直到找到能够成功发送邮件的那个为止。
发送接口
import (
"net/mail"
"github.com/lucky-byte/reactgo/serve/email"
)
// 构造邮件
m := email.HTMLMessage("标题", "<h1>内容</h1>")
// 解析地址
addr, err := mail.ParseAddress("service@lucky-byte.com")
if err != nil {
return "", err
}
// 添加收件人
m.AddTO(addr)
// 发送邮件
if err = m.Send(); err != nil {
return "", err
}
可以用 email.TextMessage()
构造一个纯文本的邮件。
上面使用 HTMLMessage()
构造 HTML 邮件,第二个参数是完整的 HTML 文档,
一般不会硬编码,而是通过某种方式生成 HTML 内容,如果你的 HTML 内容已经准备好了,
那么到这里你就可以发送邮件了,后面的内容主要是围绕如何使用 MJML
和 html/template
等工具生成邮件 HTML 内容。
邮件模板
MJML 介绍
邮件客户端支持 HTML,但是和浏览器不一样,它们只支持有限的 HTML,要编写能够适应多个邮件客户端的 HTML 不是一件容易的事情。MJML 是为了解决这个问题而设计的一套标记语言,称为 MJML 标签,格式和 HTML 比较接近,你用 MJML 标签编写内容,写好之后,再编译成 HTML 内容。使用 MJML 的最大好处就是它提供比较好的客户端兼容性。
html/template 介绍
html/template
是 Go 语言的标准模块,它是一个模板语言,使用它可以生成 动态
的内容,想想
PHP
, JSP
之类的。
Mailfs
ReactGO 将上面的两个技术封装到了 mailfs
模块中,名称 mailfs 中的 fs
意思是指这个模块中的文件会采用 go embed 指令嵌入到执行文件中。
工作流程
使用 MJML 编写邮件内容
进入
mailfs/t/mjml
目录,增加一个文件,然后在其中编写邮件内容,你可以参考里面存在的文件。生成 HTML 文件
写好 mjml 文件后,在
mailfs/t
目录运行yarn compile
。如果你还没有安装 nodejs 的环境, 那么这里需要先安装好 nodejs 环境,然后安装需要的 npm 模块,关于这些内容请参考网上的教程。用下面的接口发送邮件
// 生成邮件
m, err := Message("邮件标题", "HTML文件名", map[string]interface{}{
"name": name,
"code": code,
})
if err != nil {
return "", err
}
addr, err := mail.ParseAddress(email)
if err != nil {
return "", err
}
m.AddTO(addr)
// 发送邮件
if err = m.Send(); err != nil {
return "", err
}上面
Message
的第二个参数是你在前面步骤创建的文件的名称(不需要 .html 后缀), 第三个参数是传递给模板的变量,例如上面传递了 2 个变量name
和code
, 你在模板中通过下面的语法引用变量:{{.code}}
{{.name}}LOGO 和标题
使用 mailfs 的接口会自动处理 LOGO 和标题。LOGO 图片通过内联附件的形式嵌入在邮件中, 标题取自于邮件标题。
如果要替换 LOGO,将你的 LOGO 放到
mailfs/t/logo
目录中,然后修改mailfs/fs.go
文件中的ReadLogo
函数读取你的 LOGO 文件即可。