2025 年第 1 周草梅周报:邮件订阅系统搭建与 RSS 转换指南

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。


通过 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 文件作为配置文件。

[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)。

使用

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

创建列表

首先是创建列表。

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 即可创建新的邮件。

例如:

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 和邮件

上一段讲述了很多有关邮件的内容,但我想并不是所有用户都喜欢通过邮件订阅博客更新。

RSSHub 的创始人 DIYgod 为例。

他在《对 Newsletter 说不》 一文中阐述了他反对邮件订阅时事通讯的五大理由:

  • 封闭限制
  • 繁琐低效
  • 信息过载
  • 更新周期长
  • 隐私和安全风险

但在这里,我不想讨论邮件订阅和 RSS 订阅哪个更好,我就想干一件事:来互相转换吧!

无论你是更喜欢邮件订阅,还是 RSS 订阅,都可以使用自己更喜欢的订阅方式!

将邮件转换为 RSS

在 RSSHub 中,就提供了邮件转 RSS 的功能:Email

具体的配置如下:

image-20250105195229408

这样就可以通过 RSS 来阅读邮件。

当然,该功能需要自部署的 RSSHub ,并且需要做好权限控制,以免邮件内容泄露。

将 RSS 转换为邮件

将 RSS 转换为邮件其实还更加简单一些。

image-20250105195503881

RSS Impact 为例,在 推送通知 Hook 中就有 自定义邮件 选项,可以将 RSS 直接发送到对应的邮箱。

除此之外,也可以考虑使用 Zapier 来将 RSS 发送到邮件。

Zapier 是一个无代码集成平台,其主要功能是帮助使用者在不用写代码的情况下,能连接多种互联网服务

以订阅 RSS 的需求为例,需要先订阅 RSS,然后再推送到邮件

选择 Trigger

image-20230924204924701

Trigger这边选择 RSS by Zapier
image-20230924205034437

然后选择 New ltem in Feed,点击 Continue

image-20230924205116821

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

image-20230924205301966

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

image-20230924205409363

选择 Action

Action这边选择 Email by Zapier

image-20230924205643190

Event选择 Send Outbound Email

image-20230924205710363

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

image-20230924205738208

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

image-20230924205944207

最后别忘了启用这个Zap

image-20230924210113241

至此,我们就完成了通过邮件来订阅 RSS。

GitHub Release

rss-impact-server

  • v1.14.3 - 2025-01-04 20:40:48

    摘要:
    版本 1.14.3 更新摘要

  1. 代码重构:
    • 优化系统信息输出格式。
  2. 测试:
    • 修复 e2e 测试中的 app 关闭逻辑。
    • 优化测试数据库初始化逻辑,改用 beforeAll 和 afterAll。
    • 初始化测试数据库并启用会话中间件。
    • 修复 API 路径并添加响应头;优化服务逻辑。
  3. Bug 修复:
    • 更改常量名称从 RESOURCE_SAVE_DAYS 为 ARTICLE_SAVE_DAYS。

其他周刊推荐

阮一峰的网络日志

HelloGitHub 热点速览

阿猫的博客

潮流周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁

本文地址:2025 年第 1 周草梅周报:邮件订阅系统搭建与 RSS 转换指南

版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容