0%

如何通过 listmonk 搭建属于自己的邮件订阅系统

前言

最近又折腾了一下邮件订阅系统。

最新版本的邮件订阅地址:草梅友仁的博客订阅

上一次迁移邮件订阅系统还要追溯到去年,在 2024-01-09 如何迁移 Newsletter 到 phplist 中就已经迁移过一次邮件订阅系统。

而这次总算下定决心,改成 listmonk 了,使用了自部署版本。

至于为什么,且容我慢慢道来。

首先是第一个问题:phpList API 仅支持付费用户。

官方版本的发件额度只有每月 300 封不说,还不能直接调用 API 来创建邮件。

然后是第二个问题:

通过 RSS 订阅来生成新邮件的功能一直不可用,至少我个人尝试下来就没成功过。

最后则是一个更主观的看法,那就是 phpList 的界面实在有点陈旧。

主观感觉 PHP 项目都有类似的风格,可以说是一个时代的网站风格。

image-20250105184524899

当然还有一些细节问题,例如简体中文的翻译是一坨的问题。

鉴于 phpList 有种种问题,因此迁移邮件订阅系统也要提上日程了。

界面展示

经过各方面的调研,listmonk 进入我的视野。

image-20250105184814668

首先是 listmonk 有着现代网页的设计风格,界面看起来十分舒适。

其次,还有着完善的多语言翻译,对中文支持也非常好。

然后就是一些邮件订阅系统的核心功能了:订阅列表、用户列表和营销邮件列表。

在之前试用过一些邮件订阅系统,普遍存在着限制订阅列表数量、限制订阅用户数量等问题。

而对 listmonk 来说,这一切都不是问题!

只要你的数据库够大,listmonk 可以存放无限制的列表、用户等数据。

部署

既然那么优秀,listmonk 又要怎么部署呢?

更多部署方式可参考 installation

在这里使用 Docker 部署。

创建一个 config.toml 文件作为配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[app]
address = "0.0.0.0:9000"

# Database.
[db]
host = "listmonk_db" # Postgres container name in the compose file.
port = 5432
user = "listmonk"
password = "listmonk"
database = "listmonk"
ssl_mode = "disable"
max_open = 25
max_idle = 25
max_lifetime = "300s"

创建一个 docker-compose.yml 文件,并挂载 config.toml 配置文件。

完整的 docker-compose.yml 配置参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3.7"
services:
listmonk:
image: listmonk/listmonk:latest
container_name: listmonk
ports:
- "9000:9000"
environment:
TZ: Asia/Shanghai # 设置时区
volumes:
- ./config.toml:/listmonk/config.toml
- ./log:/listmonk/log
restart: unless-stopped
command: [sh, -c, "./listmonk --install --idempotent --yes --config /listmonk/config.toml && ./listmonk --upgrade --yes --config /listmonk/config.toml && ./listmonk --config /listmonk/config.toml > /listmonk/log/listmonk.log 2>&1"]

然后执行

1
docker-compose up -d 

命令启动。

随后就可以访问 127.0.0.1:9000端口访问了(如果在本地部署,在服务器部署则是服务器 IP)。

使用

先前只是简单展示了下页面,接下来聊聊使用上的细节。

创建列表

首先是创建列表。

image-20250105190230396

列表在 listmonk 中是用来管理用户订阅的,每个列表中都存在若干用户。这样一来就可以指定邮件发送的对象,从而实现用户分类。

对博客订阅而言,一般是公开类型(毕竟不公开,用户怎么订阅),加入方式则是 单选订阅双重选择加入均可(两者区别在于是否要用户确认)。

在创建完列表后,就要发布订阅页面了。

image-20250105190606767

listmonk 中,可以在表格中查看公开的订阅列表。

草梅友仁的博客订阅地址如下:https://listmonk.cmyr.dev/subscription/form

image-20250105190700087

启用验证码

你可能注意到另一个问题,如果订阅页面是公开的,那岂不是很容易被攻击?

实际上,在一开始的时候,我就遇到了这样的问题。

订阅列表中出现了很多随机字符的邮箱,一看就不是真实用户。

因此,需要增加验证码来避免虚假用户注册(当然,刻意留了假邮箱的还是管不了的)

image-20250105191025499

在 listmonk 中,可以通过 设置 页面来启用验证码。

验证码服务由 hCaptcha 提供支持。

hCaptcha 提供每月一百万个请求的免费额度,对一般小网站来说是够用的了。

设置 SMTP 服务器

SMTP 是最终负责把邮件发送到用户邮箱的服务。

如果不设置的话,你的邮件就到不了用户邮箱。

image-20250105191948994

在这里,本人使用 resend 作为发件服务。

就免费版而言,resend 提供了每日不超过 100 封、每月不超过 3000 封的发件额度。

这个额度虽然不是很多,在对新人来讲已经足够了,如果真有需要,再迁移到更加便宜的发件渠道(个人使用下来是已经够了)。

image-20250105192401406

然后就是使用 resend 的 SMTP 服务有几个注意事项。

listmonk 默认设置的端口、身份验证协议、TLS 协议均需要修改,实测要以图上为准,不然会出现发件失败的问题。

即 端口 587 或 2587,身份验证协议 LOGIN,TLS 协议 STARTTLS。具体参考 SMTP Credentials

测试发件渠道

到这一步,就可以测试连接了。

image-20250105192745801

如果你出现了类似 subscriber 3: 450 Invalid literal value, expected "" 的问题,请尝试关闭 包括 List-Unsubscribe 标头 选项。

image-20250105193030956

目前这个问题还在排查中,不能确定是 listmonk 的问题还是 resend 的问题,具体可关注该 issue #2229

如果一切顺利的话,你应该可以在测试邮箱中收到发件。

image-20250105193402541

通过 API 创建邮件

当然,最后还有一个我心心念念的东西:通过 API 创建邮件。

在 listmonk 中,通过 REST API 即可创建新的邮件。

例如:

1
curl -u "api_user:token" 'http://localhost:9000/api/campaigns' -X POST -H 'Content-Type: application/json;charset=utf-8' --data-raw '{"name":"Test campaign","subject":"Hello, world","lists":[1],"from_email":"listmonk <noreply@listmonk.yoursite.com>","content_type":"richtext","messenger":"email","type":"regular","tags":["test"],"template_id":1}'

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"data": {
"id": 1,
"created_at": "2021-12-27T11:50:23.333485Z",
"updated_at": "2021-12-27T11:50:23.333485Z",
"views": 0,
"clicks": 0,
"bounces": 0,
"lists": [{
"id": 1,
"name": "Default list"
}],
"started_at": null,
"to_send": 1,
"sent": 0,
"uuid": "90c889cc-3728-4064-bbcb-5c1c446633b3",
"type": "regular",
"name": "Test campaign",
"subject": "Hello, world",
"from_email": "listmonk \u003cnoreply@listmonk.yoursite.com\u003e",
"body": "",
"altbody": null,
"send_at": null,
"status": "draft",
"content_type": "richtext",
"tags": ["test"],
"template_id": 1,
"messenger": "email"
}
}

总结

以上就是通过 listmonk 自建邮件订阅系统的基本流程和使用方式,如有疏漏,欢迎指正。

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/listmonk-email-subscription-system-guide.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

坚持原创技术分享,您的支持将鼓励我继续创作!