前言
欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。
本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的
原文链接查看最新版本。
通过 listmonk 搭建属于自己的邮件订阅系统
最近又折腾了一下邮件订阅系统。
最新版本的邮件订阅地址:草梅友仁的博客订阅
上一次迁移邮件订阅系统还要追溯到去年,在 2024-01-09 如何迁移 Newsletter 到 phplist 中就已经迁移过一次邮件订阅系统。
而这次总算下定决心,改成 listmonk 了,使用了自部署版本。
至于为什么,且容我慢慢道来。
首先是第一个问题:phpList API 仅支持付费用户。
官方版本的发件额度只有每月 300 封不说,还不能直接调用 API 来创建邮件。
然后是第二个问题:
通过 RSS 订阅来生成新邮件的功能一直不可用,至少我个人尝试下来就没成功过。
最后则是一个更主观的看法,那就是 phpList 的界面实在有点陈旧。
主观感觉 PHP 项目都有类似的风格,可以说是一个时代的网站风格。

当然还有一些细节问题,例如简体中文的翻译是一坨的问题。
鉴于 phpList 有种种问题,因此迁移邮件订阅系统也要提上日程了。
界面展示
经过各方面的调研,listmonk 进入我的视野。

首先是 listmonk 有着现代网页的设计风格,界面看起来十分舒适。
其次,还有着完善的多语言翻译,对中文支持也非常好。
然后就是一些邮件订阅系统的核心功能了:订阅列表、用户列表和营销邮件列表。
在之前试用过一些邮件订阅系统,普遍存在着限制订阅列表数量、限制订阅用户数量等问题。
而对 listmonk 来说,这一切都不是问题!
只要你的数据库够大,listmonk 可以存放无限制的列表、用户等数据。
部署
既然那么优秀,listmonk 又要怎么部署呢?
更多部署方式可参考 installation
在这里使用 Docker 部署。
创建一个 config.toml 文件作为配置文件。
[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 配置参考如下:
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"]
然后执行
docker-compose up -d
命令启动。
随后就可以访问 127.0.0.1:9000端口访问了(如果在本地部署,在服务器部署则是服务器 IP)。
使用
先前只是简单展示了下页面,接下来聊聊使用上的细节。
创建列表
首先是创建列表。

列表在 listmonk 中是用来管理用户订阅的,每个列表中都存在若干用户。这样一来就可以指定邮件发送的对象,从而实现用户分类。
对博客订阅而言,一般是公开类型(毕竟不公开,用户怎么订阅),加入方式则是 单选订阅或 双重选择加入均可(两者区别在于是否要用户确认)。
在创建完列表后,就要发布订阅页面了。

listmonk 中,可以在表格中查看公开的订阅列表。
草梅友仁的博客订阅地址如下:https://listmonk.cmyr.dev/subscription/form

启用验证码
你可能注意到另一个问题,如果订阅页面是公开的,那岂不是很容易被攻击?
实际上,在一开始的时候,我就遇到了这样的问题。
订阅列表中出现了很多随机字符的邮箱,一看就不是真实用户。
因此,需要增加验证码来避免虚假用户注册(当然,刻意留了假邮箱的还是管不了的)

在 listmonk 中,可以通过 设置 页面来启用验证码。
验证码服务由 hCaptcha 提供支持。
hCaptcha 提供每月一百万个请求的免费额度,对一般小网站来说是够用的了。
设置 SMTP 服务器
SMTP 是最终负责把邮件发送到用户邮箱的服务。
如果不设置的话,你的邮件就到不了用户邮箱。

在这里,本人使用 resend 作为发件服务。
就免费版而言,resend 提供了每日不超过 100 封、每月不超过 3000 封的发件额度。
这个额度虽然不是很多,在对新人来讲已经足够了,如果真有需要,再迁移到更加便宜的发件渠道(个人使用下来是已经够了)。

然后就是使用 resend 的 SMTP 服务有几个注意事项。
listmonk 默认设置的端口、身份验证协议、TLS 协议均需要修改,实测要以图上为准,不然会出现发件失败的问题。
即 端口 587 或 2587,身份验证协议 LOGIN,TLS 协议 STARTTLS。具体参考 SMTP Credentials
测试发件渠道
到这一步,就可以测试连接了。

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

目前这个问题还在排查中,不能确定是 listmonk 的问题还是 resend 的问题,具体可关注该 issue #2229。
如果一切顺利的话,你应该可以在测试邮箱中收到发件。

通过 API 创建邮件
当然,最后还有一个我心心念念的东西:通过 API 创建邮件。
在 listmonk 中,通过 REST API 即可创建新的邮件。
例如:
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}'
结果:
{
"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 自建邮件订阅系统的基本流程和使用方式,如有疏漏,欢迎指正。
如何互相转换 RSS 和邮件
上一段讲述了很多有关邮件的内容,但我想并不是所有用户都喜欢通过邮件订阅博客更新。
他在《对 Newsletter 说不》 一文中阐述了他反对邮件订阅时事通讯的五大理由:
- 封闭限制
- 繁琐低效
- 信息过载
- 更新周期长
- 隐私和安全风险
但在这里,我不想讨论邮件订阅和 RSS 订阅哪个更好,我就想干一件事:来互相转换吧!
无论你是更喜欢邮件订阅,还是 RSS 订阅,都可以使用自己更喜欢的订阅方式!
将邮件转换为 RSS
在 RSSHub 中,就提供了邮件转 RSS 的功能:Email
具体的配置如下:

这样就可以通过 RSS 来阅读邮件。
当然,该功能需要自部署的 RSSHub ,并且需要做好权限控制,以免邮件内容泄露。
将 RSS 转换为邮件
将 RSS 转换为邮件其实还更加简单一些。

以 RSS Impact 为例,在 推送通知 Hook 中就有 自定义邮件 选项,可以将 RSS 直接发送到对应的邮箱。
除此之外,也可以考虑使用 Zapier 来将 RSS 发送到邮件。
Zapier 是一个无代码集成平台,其主要功能是帮助使用者在不用写代码的情况下,能连接多种互联网服务
以订阅 RSS 的需求为例,需要先订阅 RSS,然后再推送到邮件
选择 Trigger

Trigger这边选择 RSS by Zapier 
然后选择 New ltem in Feed,点击 Continue

然后就是比较关键的 Feed URL了,这个是必填的,剩下的默认就好。

最后再测试一下你的 RSS 地址,一切正常的话就会看到博客的内容,确认无误之后点击 Continue with selected record

选择 Action
Action这边选择 Email by Zapier

Event选择 Send Outbound Email

To 这里填你自己的邮箱地址(要让哪个邮箱接收邮件),Subject和Body 就看自己的需要填写即可。

最后就可以点击Test step来测试一下了,如果一切顺利的话就可以在邮箱中看到邮件了。

最后别忘了启用这个Zap

至此,我们就完成了通过邮件来订阅 RSS。
GitHub Release
rss-impact-server
-
v1.14.3 - 2025-01-04 20:40:48
摘要:
版本 1.14.3 更新摘要
-
代码重构:
- 优化系统信息输出格式。
-
测试:
- 修复 e2e 测试中的 app 关闭逻辑。
- 优化测试数据库初始化逻辑,改用 beforeAll 和 afterAll。
- 初始化测试数据库并启用会话中间件。
- 修复 API 路径并添加响应头;优化服务逻辑。
-
Bug 修复:
- 更改常量名称从 RESOURCE_SAVE_DAYS 为 ARTICLE_SAVE_DAYS。
其他周刊推荐
阮一峰的网络日志
- 科技爱好者周刊(第 332 期):西蒙·威利森的年终总结,梁文锋的访谈 - 2025-01-03 09:10:55
HelloGitHub 热点速览
- 神仙打架的一期「GitHub 热点速览」 - 2024-12-31 09:15:37
阿猫的博客
- 2024 年度总结 - 2024-12-30 02:39:32
潮流周刊
- 第 206 期 - 标致的狗 - 2024-12-30 08:00:00
总结
本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:
往期回顾
- 2024 年第 53 周草梅周报:2024 年度项目总结与展望 - 2024-12-29 20:27:51
- 2024 年第 52 周草梅周报:GitHub Copilot 免费支持与最新更新 - 2024-12-22 18:47:26
- 2024 年第 51 周草梅周报:Windsurf,比 Cursor 更好用的 AI 编辑器 - 2024-12-15 18:59:26
本文作者:草梅友仁
本文地址:2025 年第 1 周草梅周报:邮件订阅系统搭建与 RSS 转换指南
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!