2026 Listmonk 自建邮件营销平台:Docker 部署打造个人 Newsletter
你想做一个技术博客的 Newsletter,定期给读者推送新文章?或者你的产品需要给用户发注册确认邮件、通知邮件?看看市面上的选择:Mailchimp 免费版只有 500 个联系人,超出后每月 19.95/月;Mautic 功能强大但基于 PHP+MySQL,部署臃肿、性能堪忧。
有没有一个轻量、快速、完全可控的邮件营销方案?
Listmonk 就是答案。它是一个用 Go 语言编写的开源邮件营销平台,GitHub 上 21.7k Star。整个应用只有一个二进制文件 + PostgreSQL 数据库,极致轻量。Docker 镜像只有十几 MB,支持百万级订阅者的邮件发送,还有漂亮的现代 Web 管理界面。
一、Listmonk vs 其他邮件营销方案
| 对比项 | Listmonk | Mailchimp | Mautic | Sendy |
|---|---|---|---|---|
| 语言 | Go | 商业闭源 | PHP | PHP |
| 价格 | 免费开源 | 免费 500 人,$13+/月 | 免费开源 | 一次性 $69 |
| 数据库 | PostgreSQL | 托管 | MySQL | MySQL |
| Docker 部署 | ✅ 一键 | ❌ | ✅ 可 | ⚠️ 需自行构建 |
| 模板编辑器 | ✅ 所见即所得 | ✅ | ✅ | ❌ 纯 HTML |
| 统计分析 | ✅ 详细 | ✅ | ✅ | ✅ 基础 |
| API | ✅ RESTful | ✅ RESTful | ✅ RESTful | ✅ RESTful |
| 自建可控 | ✅ 完全可控 | ❌ | ✅ 完全可控 | ✅ 完全可控 |
| 性能 | 🚀 极快(单二进制) | 托管 | 🐢 PHP 较重 | 🐢 PHP 较重 |
简单结论:如果你要自建,Listmonk 是最轻量、最快速的选择。 Mailchimp 适合不想折腾的团队,Mautic 适合需要高级自动化营销的场景但吃资源,Sendy 是付费 PHP 方案但性能不如 Listmonk。
二、Docker Compose 部署
Listmonk 需要 PostgreSQL 数据库,官方推荐用 Docker Compose 一键部署。
docker-compose.yml
version: '3.8'
services: db: image: postgres:15-alpine container_name: listmonk-db restart: unless-stopped environment: - POSTGRES_PASSWORD=请改成强密码 - POSTGRES_USER=listmonk - POSTGRES_DB=listmonk volumes: - ./listmonk_data/db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U listmonk"] interval: 10s timeout: 5s retries: 5
app: image: listmonk/listmonk:latest container_name: listmonk-app restart: unless-stopped ports: - "9000:9000" environment: - TZ=Asia/Shanghai volumes: - ./listmonk_data/config.toml:/listmonk/config.toml - ./listmonk_data/uploads:/listmonk/uploads depends_on: db: condition: service_healthy初始化配置
在启动前,需要先初始化数据库和配置文件:
# 1. 创建数据目录mkdir -p ./listmonk_data
# 2. 生成默认配置文件docker compose run --rm app ./listmonk --new-configcp config.toml ./listmonk_data/config.toml
# 3. 编辑配置文件,填入数据库连接信息和 SMTP 配置vim ./listmonk_data/config.toml
# 4. 初始化数据库(创建表结构)docker compose run --rm app ./listmonk --install
# 5. 创建管理员账号(按提示输入用户名、密码、邮箱)docker compose run --rm app ./listmonk --upgrade
# 6. 启动服务docker compose up -d启动成功后,访问 http://你的服务器IP:9000 就能看到 Listmonk 的管理面板登录页了。默认管理员账号是你在初始化时设置的用户名和密码。
三、配置详解
3.1 数据库配置
config.toml 中的数据库连接部分:
[db]host = "db"port = 5432user = "listmonk"password = "你设置的数据库密码"database = "listmonk"ssl_mode = "disable"max_open = 25max_idle = 10max_lifetime = "30m"注意这里的 host 填的是 Docker Compose 中的服务名 db,而不是 localhost。
3.2 SMTP 配置
这是最关键的部分——配置邮件发送通道:
[smtp]# 你可以配置多个 SMTP 池,用 enbaled 开关控制[[smtp]]enabled = truehost = "smtp.example.com"port = 587auth_protocol = "plain"username = "your-smtp-username"password = "your-smtp-password"max_conns = 50max_msg_retries = 2idle_timeout = "30s"wait_timeout = "5s"常见的 SMTP 服务推荐:
| SMTP 服务 | 用途 | 价格 | 日均发送上限 |
|---|---|---|---|
| 阿里云邮件推送 | 国内业务 | 免费 2000 封/天 | 2000 |
| SendGrid | 海外业务 | 免费 100 封/天 | 100 |
| Mailgun | 海外业务 | 免费 1000 封/天 | 1000 |
| 自建 Postfix | 完全可控 | 免费 | 取决于 ISP 限制 |
| Amazon SES | 海外业务 | $0.10/千封 | 可扩展 |
重要:国内 VPS 的 25 端口通常被封,建议用 587 端口(STARTTLS)或 465 端口(SSL)。推荐使用邮件推送服务商的 SMTP 接口,而非自建邮件服务器。
3.3 应用配置
[app]address = "0.0.0.0:9000"admin_username = "admin"admin_password = "你设置的管理员密码"# 上传文件限制max_file_size = 50_000_000 # 50MB# 并发限制concurrency = 100# 允许上传的文件类型allowed_upload_types = ["png", "jpg", "gif", "svg", "pdf", "txt"]
# 隐私与跟踪[privacy]# 是否启用打开跟踪enable_open_tracking = true# 是否启用点击跟踪enable_click_tracking = true# IP 地址匿名化anonymize_ip = true四、创建第一个 Newsletter
4.1 导入订阅者
在管理面板进入 Subscribers → Import,支持 CSV 批量导入:
email,name,attributesuser1@example.com,张三,{"city": "北京"}user2@example.com,李四,{"city": "上海"}也可以通过 API 导入:
curl -X POST 'http://localhost:9000/api/subscribers' \ -u 'admin:你的密码' \ -H "Content-Type: application/json" \ -d '{ "email": "newuser@example.com", "name": "王五", "status": "confirmed" }'4.2 创建邮件列表
在管理面板进入 Lists → New List,创建一个邮件列表(比如 “博客周报”)。
然后你可以把订阅者分配到不同的列表中,这样发 Campaign 时可以精确选择目标受众。
4.3 设计邮件模板
Listmonk 内置了所见即所得的模板编辑器,也支持手写 Go 模板语法:
<html><head> <title>{{ .Subject }}</title></head><body> <h1>你好,{{ .Name }}!</h1>
<p>这是你的定制内容:</p> <ul> {{ range .Articles }} <li><a href="{{ .URL }}">{{ .Title }}</a></li> {{ end }} </ul>
<hr> <p style="color: #999; font-size: 12px;"> 如果你不想再收到这些邮件,<a href="{{ .UnsubscribeURL }}">点击这里退订</a> </p></body></html>模板变量说明:
{{ .Subject }}— 邮件主题{{ .Name }}— 订阅者姓名{{ .Email }}— 订阅者邮箱{{ .UnsubscribeURL }}— 退订链接{{ .TrackViewURL }}— 打开跟踪像素
4.4 发送 Campaign
进入 Campaigns → New Campaign:
- 基本信息:填写标题、主题行、发件人名称和地址
- 选择列表:勾选目标邮件列表
- 选择模板:选择或编写邮件内容
- 安排发送:立即发送或定时发送
点击 Send Test 可以先给自己发一封测试邮件确认效果,然后点击 Send 正式发送。
五、统计分析
Listmonk 提供了实时统计数据:
- 发送总数:共发送了多少封
- 打开率:多少人打开了邮件(需启用打开跟踪)
- 点击率:多少人点击了邮件中的链接
- 退订率:发送后有多少人退订
- 失败率:发送失败的邮件数
数据在 Dashboard 上一目了然,也支持按 Campaign 查看详细数据。
六、搭配反向代理
和前面系列的文章一样,建议用 Caddy 或 Nginx Proxy Manager 加一层 HTTPS:
newsletter.你的域名.com { reverse_proxy app:9000}docker-compose.yml 中的网络配置:
services: app: # ... 配置同上 networks: - internal # 不需要对外暴露 9000 端口
caddy: networks: - internal
networks: internal: driver: bridgeFAQ
Q: Listmonk 适合大规模发送吗?
A: 完全可以。Listmonk 在性能测试中能轻松处理百万级订阅者的邮件发送。重要的是配置好 SMTP 池的并发数(max_conns),以及你 SMTP 服务商的上限。
Q: 需要 PostgreSQL 专业知识吗? A: 不需要。Docker Compose 会自动安装 PostgreSQL,初始化脚本会创建所需的表结构。日常使用完全不需要操作数据库。
Q: 发件成功率怎么样? A: 成功率取决于你使用的 SMTP 服务商。建议用专门的邮件推送服务(如 Amazon SES、SendGrid),而不是自建 Postfix(容易被标记为垃圾邮件)。
Q: 支持多语言模板吗? A: 支持。模板是纯 HTML 加上 Go 模板语法,你可以为不同语言创建不同的模板,在发送时根据用户属性选择合适的模板。
Q: 能不能导入现有的 Mailchimp 数据? A: 可以。Listmonk 支持 CSV 导入,你可以从 Mailchimp 导出订阅者 CSV,然后再导入到 Listmonk。API 也支持批量导入。
Q: 数据隐私有保障吗? A: 完全在你的服务器上,数据不经过任何第三方。你可以配置 IP 匿名化和禁用跟踪功能以保护用户隐私。
Q: 和前面文章讲的 Caddy 怎么配合?
A: 非常简单。把 Caddy 加入同一个 Docker 网络,用域名指向 Listmonk 的 app:9000 即可。这样你就不需要对外暴露 9000 端口了。
延伸阅读
- Docker 换源避坑指南 — 部署前的必备准备
- Nginx Proxy Manager 反代面板 — 统一管理所有服务的访问入口
- Stirling PDF 自建 PDF 工具箱 — 30多种PDF处理工具合一
Listmonk 是目前自建邮件营销平台的最佳选择,Go 的单二进制部署让运维变得异常简单。今天的两篇文章分别覆盖了全文搜索和邮件营销两个实用场景,希望能给自建爱好者们一些新思路。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!