← 返回首页

给 Waline 做自己的通知邮箱!

为了一个简简单单的域名邮箱,我花了很久很久。

无尽敲打, 教程, 原创

号外!

这是无尽敲打系列的第一篇文章!这里是我的折腾合集。slug 用 articles/tinkering/

没有买专业域名邮箱服务的钱,但是发现 Resend 可以自定义发件邮箱,所以简单做个记录,说说用在 Waline 设置评论回复通知的操作。

市面常见的免费邮箱虽然已经够用,但是当需要给自己的服务做收发邮件时,有一个自己域名的邮箱会美观很多。比如我的域名是 karlbaey.top,我希望我的读者收到评论回复通知时,是来自于 notifications at karlbaey dot top 这个邮箱,就需要自己折腾折腾 Resend 和 Cloudflare。不会太难,设置几个 DNS 记录的事。

要是自购 VPS 而且开了一大堆端口1而且你前一任租客是个纯良公民拿了 VPS 什么都不干就当我什么都没说,自己拉个 docker 开邮局就行,反正我没有这个折腾的闲心。一个推荐的方案是 Mailu。

叫 Cloudflare 给你自动转发邮件

这至少需要你购买一个域名。免费域名也行,但是要能放在 Cloudflare 上。

这个页面,就能看到接入域名的提示。

我已经把 karlbaey.top 接入了
我已经把 karlbaey.top 接入了

转发到 Gmail 是可选的,转发到 QQ 邮箱也行,因为我们不依赖 Cloudflare 发邮件。然后设置 Cloudflare 的邮箱白名单。

会向你发送认证邮件,随指示操作即可
会向你发送认证邮件,随指示操作即可

这样其实就好了。但是为了防止 Cloudflare 乱发邮件,还得给特定的邮箱设置转发到 Gmail。比如我的邮箱是 hi at karlbaey dot top(记作邮箱 A),就设置一个。

_image

这样就可以了。下面就是 Resend 那一边的事。

用 Resend 自定义发件邮箱

目前的自定义发件域名服务只有 Resend 一家是免费且额度充足的2,免费版每天可以发 100 封邮件,这儿有官网。跟 Resend 比起来,QQ 邮箱不能绑自定义域名;Gmail 会显示由你的 Gmail 邮箱代发,泄露风险大;Outlook 则是逼着用户开 Microsoft 365。综合考量,Resend 是最佳的选择。

嫌弃发信额度少,就考虑日后换成 Larksuite 也可以,那个一天可以发 450 封邮件,非常慷慨。

先注册一个 Resend,这个很简单,你甚至可以用你的域名邮箱注册。反正上面已经配置好了 Cloudflare 的 catch-all 规则,Resend 的验证邮件会飞到 Gmail 邮箱里边。

注册成功之后就能进入 Dashboard。选择侧栏的 Domains。

_image

如果你照着上面 Cloudflare 配置域名邮件转发的话,下面应该会自动跳出来一个小黄云跟“Auto configure”,点那个就行。一共是 1 条 MX 记录和 3 条 TXT 记录。

创建新 API Key 里边写给 Waline 的 Key,Name 随意填。然后你就能看见只显示一次的 Key,把它复制好,下面给 Waline 用。

这样就好了。我用的是 notifications at karlbaey dot top 来发件。

Waline 配置邮件传递

少来了,真以为有人会发评论啊。

Waline 的文档里已经写好了怎么配置评论通知的环境变量。我是把 Waline 部署在 Vercel 上的,跳到环境变量(Environment Variables)页面添加就行。下面是一个参考的表格。

变量名 示例值 说明
SMTP_SERVICE Resend 固定填 Resend
SMTP_USER resend 固定填 resend
SMTP_PASS re_123456789... 你的 Resend API Key
SMTP_SECURE true Resend 推荐
SENDER_NAME 你的博客名称 邮件显示的发送者名称
SENDER_EMAIL [email protected] 你用来发信的邮箱
AUTHOR_EMAIL [email protected] 接收通知的管理员邮箱

这样就配置完了。要是你愿意继续折腾可以往下看。

Waline 的邮件模板

我基于 Waline 给的东西自己魔改了一番,由于它用的是 Nunjunks 模板(不是我熟悉的 Hugo 模板🙁),所以可以插入一些条件语法。

⚠️重要!每一个环境变量都需要压缩成一行之后输入 Vercel。HTML 找个地方压缩就行,压缩后不影响解析。

先是两个邮件标题模板。

vercel.env
# 访客收到博主的回复时,邮件的标题
MAIL_SUBJECT="您在 【{{site.name}}】 的评论收到了 {{self.nick}} 的回复"
# 博主收到新评论(或新回复)时,邮件的标题
MAIL_SUBJECT_ADMIN="【{{site.name}}】新评论:{{self.nick}} 的留言"

然后是给访客评论用的 MAIL_TEMPLATE

MAIL_TEMPLATE.html
<div style="max-width:600px;margin:0 auto;font-family:Arial,sans-serif;background:#f6f8fa;padding:20px">
  <h2 style="color:#24292e">{{site.name}}</h2>
  <p>您在 <a href="{{site.postUrl}}" style="color:#0366d6">【{{site.name}}】</a> 的评论:</p>
  <blockquote style="background:#fff;padding:12px;border-left:4px solid #d1d5da;margin:12px 0;white-space:pre-wrap">{{parent.comment | safe}}</blockquote>
  <p><strong>{{self.nick}}</strong> 回复了您:</p>
  <blockquote style="background:#fff;padding:12px;border-left:4px solid #2ea44f;margin:12px 0;white-space:pre-wrap">{{self.comment | safe}}</blockquote>
  <a href="{{site.postUrl}}" style="display:inline-block;padding:8px 16px;background:#0366d6;color:#fff;text-decoration:none;border-radius:6px;margin-top:8px">点击查看详情</a>
  <p style="color:#586069;font-size:12px;margin-top:24px">此邮件由系统自动发送,请勿直接回复。</p>
</div>

还有最后给博主的通知模板 MAIL_TEMPLATE_ADMIN

MAIL_TEMPLATE_ADMIN.html
<div style="max-width:600px;margin:0 auto;font-family:Arial,sans-serif;background:#f6f8fa;padding:20px">
  <h2 style="color:#4169E1">🔔 新评论通知</h2>
  <p><strong>评论者:</strong>{{self.nick}}</p>
  <p><strong>来源:</strong>{{self.os}} · {{self.browser}}
{% if parent %}
  <div style="background:#fff3cd;padding:8px 12px;margin:12px 0;border-left:4px solid #f0ad4e">
    <p style="margin:0"><strong>回复给:</strong>{{parent.nick}}</p>
    <blockquote style="margin:8px 0 0;white-space:pre-wrap;color:#586069">{{parent.comment | safe}}</blockquote>
  </div>
{% endif %}
  <blockquote style="background:#fff;padding:12px;border-left:4px solid #0366d6;margin:12px 0;white-space:pre-wrap">{{self.comment | safe}}</blockquote>
  <a href="{{site.postUrl}}" style="display:inline-block;padding:8px 16px;background:#2ea44f;color:#fff;text-decoration:none;border-radius:6px">查看评论</a>
  <p style="color:#586069;font-size:12px;margin-top:16px">系统自动发送,来自 {{self.os}} · {{self.browser}}</p>
</div>

效果图大概是下面这样。我把评论通知推到 QQ 邮箱,没有测试过其他家的样子。配色乱搞的,好奇我怎么配色的参考这里

访客端
访客端
管理员端
管理员端

反正我是看过各种各样花里胡哨的评论提醒,有信封式的、有黑黑绿绿黑客式的,甚至还有一点 CSS 都不会写、把整个版面搞得乱七八糟的。我这个重在简单明了,不考虑那么多七七八八的了,关于我的哲学,感兴趣的看漫漫长路去(发稿时只有一篇文😅)。

See Also

  1. 【Cloudflare Docs】Enable Email Routing(英文)←本文基于 Cloudflare 的邮件路由文档写成。

脚注

  1. 包括:25(SMTP)、465(SMTPS)、587(SMTP提交)、143(IMAP)、993(IMAPS)、110(POP3)、995(POP3S)。其中,25 端口(TCP)用于邮件服务器间投递,至关重要且常被 VPS 厂商封锁,需申请解封。此外,如果使用 Web 界面管理邮局,需开放 80(HTTP)和 443(HTTPS)端口。 ↩︎

  2. 其余的就是 AWS SES 这一类服务了,个人没有负担这费用的必要。 ↩︎

评论