Skip to content

邮件通知

Artalk 支持通过 SMTP 协议、阿里云邮件推送、调用系统 Sendmail 命令等方式向用户发送邮件通知。

你可以在 控制中心 的设置界面修改此配置,也可以通过 配置文件环境变量 进行配置。

配置文件

完整的 email 配置如下:

yaml
# 邮件通知
email:
  enabled: false # 总开关
  send_type: smtp # 发送方式 [smtp, ali_dm, sendmail]
  send_name: '{{reply_nick}}' # 发信人昵称
  send_addr: example@qq.com # 发信人地址
  mail_subject: '[{{site_name}}] 您收到了来自 @{{reply_nick}} 的回复'
  mail_tpl: default # 邮件模板文件
  smtp:
    host: smtp.qq.com
    port: 587
    username: example@qq.com
    password: ''
  ali_dm: # https://help.aliyun.com/document_detail/29444.html
    access_key_id: '' # 阿里云颁发给用户的访问服务所用的密钥 ID
    access_key_secret: '' # 用于加密的密钥
    account_name: example@example.com # 管理控制台中配置的发信地址

选择发件方式

配置项 enabled 启用邮件,send_type 用于选择发送方式,可选:smtp, ali_dm, sendmail

yaml
email:
  enabled: true
  send_type: smtp # 发送方式
  # 省略其他配置...
  smtp:
    # SMTP 配置...
  ali_dm:
    # 阿里云推送配置...

SMTP 配置

yaml
# 邮件通知
email:
  enabled: true
  send_type: smtp # 选择 smtp
  smtp:
    host: smtp.qq.com
    port: 587
    username: example@qq.com
    password: ''

阿里云推送配置

yaml
email:
  enabled: true
  send_type: ali_dm # 选择 ali_dm
  ali_dm:
    access_key_id: '' # 阿里云颁发给用户的访问服务所用的密钥 ID
    access_key_secret: '' # 用于加密的密钥
    account_name: example@example.com # 管理控制台中配置的发信地址

可参考:阿里云官方文档

评论回复

邮件中会有一个评论回复按钮,该链接指向前端给定的页面 PageKey,若你提供的 pageKey 配置项为页面的「相对路径」,你需要在「控制中心」-「站点」为你的站点设置一个 URL:

邮件模板

模板变量

你可以在 mail_subjectmail_subject_to_admin 以及邮件模板文件中使用模板变量:

yaml
email:
  # 省略其他配置...
  mail_subject: '[{{site_name}}] 您收到了来自 @{{reply_nick}} 的回复'
  mail_subject_to_admin: '[{{site_name}}] 您的文章 "{{page_title}}" 有新回复'
  mail_tpl: default # 邮件模板文件

变量是 “Mustache” 的语法,双大括号 + 变量名 的形式即可输出一个变量:

基本内容变量

yaml
{{content}}        # 评论内容
{{link_to_reply}}  # 回复链接
{{nick}}           # 评论者昵称
{{page_title}}     # 页面标题
{{page_url}}       # 页面 PageKey (URL)
{{reply_content}}  # 回复对象的内容
{{reply_nick}}     # 回复对象的昵称f
{{site_name}}      # 站点名
{{site_url}}       # 站点 URL
查看其他变量
yaml
# 评论创建者
{{comment.badge_color}}
{{comment.badge_name}}
{{comment.content}}
{{comment.content_raw}}
{{comment.date}}
{{comment.datetime}}
{{comment.email}}
{{comment.email_encrypted}}
{{comment.id}}
{{comment.is_allow_reply}}
{{comment.is_collapsed}}
{{comment.is_pending}}
{{comment.link}}
{{comment.nick}}
{{comment.page.admin_only}}
{{comment.page.id}}
{{comment.page.key}}
{{comment.page.site_name}}
{{comment.page.title}}
{{comment.page.url}}
{{comment.page.vote_down}}
{{comment.page.vote_up}}
{{comment.page_key}}
{{comment.page_title}}
{{comment.rid}}
{{comment.site.first_url}}
{{comment.site.id}}
{{comment.site.name}}
{{comment.site.urls.0}}
{{comment.site.urls_raw}}
{{comment.site_name}}
{{comment.time}}
{{comment.ua}}
{{comment.visible}}
{{comment.vote_down}}
{{comment.vote_up}}

# 父评论(评论创建者回复的评论)
{{parent_comment.badge_color}}
{{parent_comment.badge_name}}
{{parent_comment.content}}
{{parent_comment.content_raw}}
{{parent_comment.date}}
{{parent_comment.datetime}}
{{parent_comment.email}}
{{parent_comment.email_encrypted}}
{{parent_comment.id}}
{{parent_comment.is_allow_reply}}
{{parent_comment.is_collapsed}}
{{parent_comment.is_pending}}
{{parent_comment.link}}
{{parent_comment.nick}}
{{parent_comment.page.admin_only}}
{{parent_comment.page.id}}
{{parent_comment.page.key}}
{{parent_comment.page.site_name}}
{{parent_comment.page.title}}
{{parent_comment.page.url}}
{{parent_comment.page.vote_down}}
{{parent_comment.page.vote_up}}
{{parent_comment.page_key}}
{{parent_comment.page_title}}
{{parent_comment.rid}}
{{parent_comment.site.first_url}}
{{parent_comment.site.id}}
{{parent_comment.site.name}}
{{parent_comment.site.urls}}
{{parent_comment.site.urls_raw}}
{{parent_comment.site_name}}
{{parent_comment.time}}
{{parent_comment.ua}}
{{parent_comment.visible}}
{{parent_comment.vote_down}}
{{parent_comment.vote_up}}
查看数据样例
json
{
  "content": "<p>测试内容</p>\n",
  "link_to_reply": "https://artalk.js.org/?atk_comment=8100&atk_notify_key=44a9b2f08312565fba47c716df9d177f",
  "nick": "用户名",
  "page_title": "Artalk",
  "page_url": "https://artalk.js.org/",

  "reply_content": "<p>回复者内容</p>\n",
  "reply_nick": "回复者",
  "site_name": "ArtalkDemo",
  "site_url": "http://localhost:3000/",

  "comment.badge_color": "",
  "comment.badge_name": "",
  "comment.content": "<p>回复者内容</p>\n",
  "comment.content_raw": "回复者内容",
  "comment.date": "2021-11-22",
  "comment.datetime": "2021-11-22 22:22:42",
  "comment.email": "replyer@example.com",
  "comment.email_encrypted": "249898bd50e0febc5799485cf10b345a",
  "comment.id": 8100,
  "comment.is_allow_reply": true,
  "comment.is_collapsed": false,
  "comment.is_pending": false,
  "comment.link": "",
  "comment.nick": "回复者",
  "comment.page.admin_only": false,
  "comment.page.id": 75,
  "comment.page.key": "https://artalk.js.org/",
  "comment.page.site_name": "ArtalkDemo",
  "comment.page.title": "Artalk",
  "comment.page.url": "https://artalk.js.org/",
  "comment.page.vote_down": 0,
  "comment.page.vote_up": 0,
  "comment.page_key": "https://artalk.js.org/",
  "comment.page_title": "Artalk",
  "comment.rid": 8099,
  "comment.site.first_url": "http://localhost:3000/",
  "comment.site.id": 2,
  "comment.site.name": "ArtalkDemo",
  "comment.site.urls.0": "http://localhost:3000/",
  "comment.site.urls_raw": "http://localhost:3000/",
  "comment.site_name": "ArtalkDemo",
  "comment.time": "22:22:42",
  "comment.ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
  "comment.visible": false,
  "comment.vote_down": 0,
  "comment.vote_up": 0,

  "parent_comment.badge_color": "",
  "parent_comment.badge_name": "",
  "parent_comment.content": "<p>测试内容</p>\n",
  "parent_comment.content_raw": "测试内容",
  "parent_comment.date": "2021-11-22",
  "parent_comment.datetime": "2021-11-22 22:21:17",
  "parent_comment.email": "test@example.com",
  "parent_comment.email_encrypted": "55502f40dc8b7c769880b10874abc9d0",
  "parent_comment.id": 8099,
  "parent_comment.is_allow_reply": true,
  "parent_comment.is_collapsed": false,
  "parent_comment.is_pending": false,
  "parent_comment.link": "https://qwqaq.com",
  "parent_comment.nick": "用户名",
  "parent_comment.page.admin_only": false,
  "parent_comment.page.id": 75,
  "parent_comment.page.key": "https://artalk.js.org/",
  "parent_comment.page.site_name": "ArtalkDemo",
  "parent_comment.page.title": "Artalk",
  "parent_comment.page.url": "https://artalk.js.org/",
  "parent_comment.page.vote_down": 0,
  "parent_comment.page.vote_up": 0,
  "parent_comment.page_key": "https://artalk.js.org/",
  "parent_comment.page_title": "Artalk",
  "parent_comment.rid": 0,
  "parent_comment.site.first_url": "http://localhost:3000/",
  "parent_comment.site.id": 2,
  "parent_comment.site.name": "ArtalkDemo",
  "parent_comment.site.urls.0": "http://localhost:3000/",
  "parent_comment.site.urls_raw": "http://localhost:3000/",
  "parent_comment.site_name": "ArtalkDemo",
  "parent_comment.time": "22:21:17",
  "parent_comment.ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",
  "parent_comment.visible": false,
  "parent_comment.vote_down": 0,
  "parent_comment.vote_up": 0
}

自定义模板

你可以将 mail_tpl 设置为一个「具体的文件路径」,使用外部的自定义邮件模板。

例如,将 mail_tpl 配置为 "/root/Artalk/data/mail_tpl/your_email_template.html"

yaml
email:
  mail_tpl: /root/Artalk/data/mail_tpl/your_email_template.html
  # 其他配置省略...

那么,在这个路径应该有一个文件:

html
<div>
  <p>Hi, {{nick}}:</p>
  <p>您在 “{{page_title}}” 收到了回复:</p>
  <div>
    <div>@{{reply_nick}}:</div>
    <div>{{reply_content}}</div>
  </div>
  <p><a href="{{link_to_reply}}" target="_blank">回复消息 »</a></p>
</div>

Artalk 内置许多预设的邮件模板,例如 mail_tpl: "default" 使用的就是:@ArtalkJS/Artalk:/internal/template/email_tpl/default.html

发向管理员的邮件

邮件通知目标为管理员和普通用户,你可通过如下配置,为发向管理员的邮件设定不同的标题:

yaml
admin_notify:
  enabled: true
  mail_subject: '[{{site_name}}] 您的文章「{{page_title}}」有新回复'

注:旧版 email.mail_subject_to_admin 配置项已弃用,请使用以上替代。

不局限于邮件,Artalk 支持多种方式向管理员发送通知,参考:多元推送

贡献者

页面历史