Skip to main content

发送邮件

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 内容已经准备好了, 那么到这里你就可以发送邮件了,后面的内容主要是围绕如何使用 MJMLhtml/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 指令嵌入到执行文件中。

工作流程

  1. 使用 MJML 编写邮件内容

    进入 mailfs/t/mjml 目录,增加一个文件,然后在其中编写邮件内容,你可以参考里面存在的文件。

  2. 生成 HTML 文件

    写好 mjml 文件后,在 mailfs/t 目录运行 yarn compile。如果你还没有安装 nodejs 的环境, 那么这里需要先安装好 nodejs 环境,然后安装需要的 npm 模块,关于这些内容请参考网上的教程。

  3. 用下面的接口发送邮件

        // 生成邮件
    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 个变量 namecode, 你在模板中通过下面的语法引用变量:

    {{.code}}
    {{.name}}
    LOGO 和标题

    使用 mailfs 的接口会自动处理 LOGO 和标题。LOGO 图片通过内联附件的形式嵌入在邮件中, 标题取自于邮件标题。

    如果要替换 LOGO,将你的 LOGO 放到 mailfs/t/logo 目录中,然后修改 mailfs/fs.go 文件中的 ReadLogo 函数读取你的 LOGO 文件即可。