简介Mailcow是一套基于Docker容器化技术构建的开源邮件服务器解决方案面向企业IT运维、中小团队及有自建邮件系统需求的开发者。它把SMTP/IMAP/POP3、Webmail、反垃圾与反病毒能力以及DKIM、DMARC、SPF等安全校验组件整合为统一部署栈适合用来搭建安全、易管理的邮件平台。压缩包共2000个文件主体为1515个PHP源文件对应Web界面与核心逻辑另有Shell脚本负责容器维护YAML和Dockerfile用于服务编排与镜像构建JSON与XML存放各类配置Markdown文档提供使用说明。整体约10.98MB目录结构直观便于按需检索。已有202人学习或下载适合需要系统理解容器化邮件系统设计或在现有功能上做二次开发的读者。包内除源码外还包含完整部署脚本、安全策略配置、证书及常用工具脚本可帮助节省搭建与测试时间直接用于学习、验证或落地部署。1. Mailcow 是什么把自建邮件服务器从「高危动作」变成二十分钟可交付的方案自建邮件服务器是运维里翻车率最高的方向之一Postfix 要配、Dovecot 要配反垃圾和杀毒又是两套独立系统链路一长出问题时连日志该先看哪个都不知道。Mailcow 把这一整条链路用 Docker Compose 编排成整体装完自带 Web 管理面板、Rspamd 反垃圾、ClamAV 杀毒和 SOGo Webmail不需要你从零拼装。对想拿回邮件数据主权、又不打算全职养服务器的个人开发者和小团队来说这是目前最接近开箱即用的开源方案。它不需要你精通 master.cf也不用手写证书脚本——面板里点几下就能生成 DKIM 密钥、签发 TLS 证书。下面从架构讲起一路到部署、调参、备份与踩坑排查。2. Mailcow 的组件分工与编排逻辑谁在收信、谁在判垃圾、谁在存邮件先记住一条主线Mailcow 不是一个单体软件而是一组各自成熟的开源组件通过 Docker Compose 粘在同一张容器网络上。理解这张网络后面所有排障就都有了地图。2.1 核心组件一览Postfix、Dovecot、Rspamd、SOGo 各管哪一段把邮件从收到发的生命周期拆成四段入站出站 SMTP、存储取信、内容过滤、用户界面。Mailcow 为每一段选了一个久经生产验证的开源项目而不是自己重写协议逻辑这是它可靠性较高的根本原因。入站与出站由 Postfix 承担。它是 MTA负责和外部邮件服务器握手、传输邮件、生成退信bounce。Mailcow 让 Postfix 以两组角色出现smtpd 对外收信smtp 对外发信中间由内容过滤服务决定是否拦截。存储与取信落在 Dovecot 上。它按 Maildir 格式把邮件写入磁盘卷对外提供 IMAP、POP3 端口供桌面客户端和 Webmail 读取。Dovecot 的认证并不直接读自己的文本配置而是统一查询 MariaDB 数据库里的 mailbox 表。这意味着你在面板里创建邮箱时密码是落库的Dovecot 不会像我早期手工搭建时那样在 passwd 文件里裸存。内容过滤由两套系统协作。Rspamd 对每封邮件做打分SPF、DKIM、DMARC 的校验结果、Header 特征、发件方信誉都会折算成分数超过阈值就标记或拒收。ClamAV 负责扫附件里的病毒特征。默认编排下Postfix 收到邮件后先交给 Rspamd 与 ClamAV通过检查才真正投递到 Dovecot。用户层是 SOGo提供浏览器里的 Webmail、日历、通讯录还支持 ActiveSync手机自带的邮件应用可以直接同步。管理端则是另一套独立 Web 应用也就是常说的 Mailcow UI域名、邮箱、别名、DKIM、反垃圾策略都在这里操作。底层还有三个容易被忽略的角色。MariaDB 存域名、邮箱、别名等元数据Redis 做会话缓存和限频计数防止认证接口被爆破打崩Nginx 作为七层入口统一接管 80 与 443 端口流量把 UI、API、Webmail 以及客户端回连的 IMAP/POP3/SMTP 协议路由到对应容器。TLS 证书的申请与续期由 Mailcow 内置的 ACME 客户端自动完成。组件职责数据落点PostfixSMTP 收发、退信postfix 配置卷DovecotIMAP/POP3、Maildir 存储dovecot 数据卷Rspamd垃圾邮件打分过滤Redis 与本地配置ClamAV附件病毒扫描clamav 数据卷SOGoWebmail、日历、通讯录MariaDB 与偏好存储MariaDB域名、邮箱、别名元数据mysql 数据卷Redis会话缓存、限频计数redis 数据卷NginxTLS 卸载、流量路由证书与配置卷2.2 为什么整套方案坚持用 Docker Compose隔离、升级与回滚的取舍第一次接触 Mailcow 的人都会问这些组件裸机装一遍不也能跑吗能但裸机方案最头疼的是升级。邮件安全更新频率很高Postfix、OpenSSL、ClamAV 任何一个出漏洞你都得在一台可能还跑着其它服务的机器上动系统包动完谁也不敢保证别的服务不受影响。Docker Compose 的做法是把风险隔离在容器边界内。每个组件一个镜像版本由 compose 编排锁定升级时拉新镜像、重启对应容器即可出问题就把镜像 tag 回退。数据全部落在宿主机目录上容器是无状态的删掉重建不丢邮件。这是它最核心的选型理由。代价也存在。容器网络比裸机多一层端口映射排障必须先用 docker compose ps 和 docker compose logs 确认容器状态如果宿主机本身占用了 80、443、25 端口Mailcow 会直接起不来。资源占用也不小1GB 内存的机器跑全组件会很吃力ClamAV 扫大附件时尤其吃内存。常见做法是 2GB 内存起步并把 ClamAV 并发扫描数调低。另一个容易被忽略的选型理由是备份边界清晰。裸机邮件系统的备份要分别照顾系统文件、数据库 dump、邮件目录和密钥漏一个恢复时就抓瞎。Mailcow 的持久化数据集中在几个标注好的 Docker 卷里备份只需打包这些卷和 mailcow.conf恢复顺序也基本固定下文第 4 章会展开。还有一个隐性理由是配置入口收敛。裸机方案改配置要手工编辑文本文件再 reload 服务Mailcow 把绝大多数配置入口收进面板操作落库后再由内部机制分发到 Postfix 与 Dovecot。对不熟悉文本配置的团队维护门槛大幅降低。代价是面板没暴露的深度参数仍需进容器改文件改之前务必先备份。3. 用 Mailcow 在服务器上跑通最小邮件系统从 DNS 解析到发出第一封邮件这一章按最小可用路径走一遍从准备域名解析开始到拉起容器再到面板里创建域名和第一个邮箱。链路熟练后约二十分钟第一次建议多预留一小时看日志。3.1 三步准备好 DNSA 记录、MX 记录与 PTR 反向解析邮件服务器和普通网站最大的区别在于 DNS 决定生死。收件方服务器收到连接后会反向验证你的域名解析是否符合常理任何一步缺失都可能导致退信或进垃圾箱。常见的做法是先定一个子域名作为邮件服务器主机名比如 mail.example.com。第一步是 A 记录把 mail.example.com 指向服务器公网 IP。第二步是 MX 记录把 example.com 的邮件交换记录指向 mail.example.com优先级设 10。第三步是 PTR 反向解析这一步必须在服务器服务商一侧配置把公网 IP 反解成 mail.example.com。不少云厂商控制台里叫「反向 DNS」需要提交工单或在 IP 管理页面设置。配完用下面几个命令确认# 确认 MX 记录指向正确主机 dig MX example.com # 确认邮件服务器主机名的 A 记录 dig A mail.example.com # 确认发件域的 TXT 记录SPF没加则显示无记录 dig TXT example.com输出里 MX 记录应显示 example.com 的交换目标为 mail.example.comA 记录返回服务器公网 IP。SPF 可以等 DKIM 一起配但在发出第一封测试信前必须补上否则大概率进垃圾箱。dig 未安装时先装 dnsutils 包或者用在线 DNS 检测工具效果相同。3.2 生成部署配置generate_config.sh 与 mailcow.conf 的关键项Mailcow 的部署入口是一个交互式配置脚本会询问服务器主机名然后自动生成一份 mailcow.conf 和 compose 所需的环境文件。标准操作序列如下# 进入一个专门目录比如 /opt避免和其它项目混在一起 cd /opt # 拉取 mailcow-dockerized 源码 git clone https://github.com/mailcow/mailcow-dockerized cd mailcow-dockerized # 执行配置生成脚本按提示填写主机名 mail.example.com ./generate_config.sh脚本执行时要求输入 Mailcow 主机名也就是准备好的 mail.example.com不要带 http 前缀。生成完成后会输出一个随机 admin 初始密码务必复制保存。之后打开生成的 mailcow.conf重点确认这几个键值# 查看关键配置项 grep -E MAILCOW_HOSTNAME|HTTP_PORT|HTTPS_PORT|TZ mailcow.confMAILCOW_HOSTNAME 是整套系统的对外主机名后续所有证书、DKIM 记录都围绕它生成HTTP_PORT 与 HTTPS_PORT 默认 80 和 443如果服务器已有 Web 服务占用可以改成 8080 和 8443但 SMTP 收发不受影响Web 入口地址会变成带端口的 URLTZ 建议改为 Asia/Shanghai否则日志和邮件时间戳会差 8 小时。数据库账号和密码也在这个文件里备份时整份带走。3.3 启动服务并创建域名和邮箱Web 面板的第一轮操作配置生成后启动容器。首次启动要拉取全部镜像体积较大给足时间# 拉取镜像并启动全部服务 docker compose pull docker compose up -d # 确认所有容器处于运行状态 docker compose psdocker compose ps 的输出里应该看到 postfix、dovecot、rspamd、clamd、sogo、mysql、redis、nginx 等容器都处于 Up 状态。如果某个容器反复重启先停在这里看日志排查方法见第 5 章。服务起来后用浏览器访问 https://mail.example.com使用 admin 账号和初始密码登录系统会强制修改密码。第一件事是创建域名在「域名」页面添加 example.comMX 记录选由 Mailcow 处理保存后该域名下所有邮箱都以 example.com 结尾。然后创建邮箱。在「邮箱」页面添加邮箱填用户名密码比如 postmasterexample.com。个人使用建议配额给 10GB 起步按磁盘余量调整。创建完成后这个邮箱立即可登录 SOGo Webmail也可以配到 Thunderbird、Outlook 或手机邮件应用。测试收发建议双向验证先用自己邮箱向外部邮箱发一封再外部回一封。外部收不到时优先检查 25 端口从外部是否可达收到但进了垃圾箱直接跳到第 4 章的三件套配置。4. Mailcow 必调参数DKIM 三件套、反垃圾档位与备份恢复部署跑通只是第一步真正决定邮件进收件箱还是垃圾箱的是身份验证与发件信誉。这一章讲三个必做项SPF、DKIM、DMARC 三件套Rspamd 阈值以及备份恢复方案。4.1 SPF、DKIM、DMARC 三件套的配置与验证命令三件套是邮件身份验证的三个层级SPF 声明哪些 IP 可以代发该域名邮件DKIM 给邮件加数字签名DMARC 告诉接收方验证失败时怎么处理。Mailcow 面板里 DKIM 是图形化生成的SPF 和 DMARC 需要自己写 DNS 记录。在面板「配置」菜单里找到 ARC/DKIM 密钥选择域名后点击生成密钥对。把 DKIM._domainkey 的主机名和整段 p 值复制到 DNS 管理后台。添加完成后用命令确认# 查看 DKIM 公钥是否已经解析 dig TXT dkim._domainkey.example.com # 查看 SPF 记录是否包含当前服务器 IP dig TXT example.com # 如果配置了 DMARC查看结果 dig TXT _dmarc.example.comSPF 建议写成允许本机发送的格式vspf1 mx ip4:你的服务器IP ~all。DMARC 先从宽松策略开始vDMARC1; pnone; ruamailto:收报告的邮箱跑两周确认无误判后再把 pnone 换为 pquarantine。注意 DKIM 新记录有 DNS 传播时间几分钟到几小时不等不要刚配完就下结论。4.2 Rspamd 反垃圾参数从宽松到严格的推荐档位Rspamd 的默认阈值对个人邮件系统偏保守经常出现正常邮件被判垃圾的情况。面板「配置」里有反垃圾设置入口可以调几个关键参数。第一是垃圾邮件分数阈值。个人使用建议先保持默认或放宽 0.5 分跑两周看误判报表再收紧。第二是垃圾邮件动作——拒收、放入垃圾箱、或仅打标记。我一般建议个人用户选「放入垃圾箱」而不是拒收误判时还能在垃圾箱找回来。第三是发件人白名单把客户、家人、常用服务商的域名加进去避免系统通知邮件第二天全堆进垃圾箱。4.3 备份与恢复配置文件、数据库与邮件卷的三种场景需要备份的内容分四类mailcow.conf、MySQL 卷里的域名与邮箱元数据、Dovecot 卷里的邮件存储、Redis 持久化文件。实际操作里最常见的方式是停服后对卷目录打包# 进入 mailcow 目录先停服务再打包避免文件写到一半 cd /opt/mailcow-dockerized docker compose stop # 备份配置和三个核心数据卷 tar -czf /backup/mailcow-$(date %F).tar.gz \ mailcow.conf \ /var/lib/docker/volumes/mailcowdockerized_mysql-data \ /var/lib/docker/volumes/mailcowdockerized_dovecot-data \ /var/lib/docker/volumes/mailcowdockerized_redis-data # 打包完成恢复运行 docker compose start这里的卷路径按实际 compose 配置核对不同版本命名可能带不同前缀。注意不要整个打包 docker 目录里面混着其它容器的数据恢复时会互相污染。恢复顺序也要讲究先解压把卷目录放回原位置把 mailcow.conf 放回项目目录最后 docker compose up -d。如果只是误删了某个邮箱优先用 SQL 查询 MariaDB 恢复元数据不必走全量恢复。5. Mailcow 部署避坑指南5 个典型故障的现象、原因与排查路径这一章写五个最常见的问题每一条按「现象 → 原因 → 解决」展开。建议先复制好日志命令遇到问题按顺序查。5.1 现象外发邮件没有退信外部邮箱也收不到本机日志正常原因很多云服务器默认封禁 25 出站端口或入站 25 也被防火墙挡掉。Postfix 日志看起来正常实际握手永远超时。解决宿主机上先用 telnet 或 nc 测试到外部 MX 的 25 端口连通性不通就提交工单开通。部分服务商对 25 入站出站管得很严开通不了就只能改用邮件中继服务这也是合规的常见替代路径。5.2 现象发出的信全部进对方垃圾箱原因缺少 PTR 反向解析、SPF 不完整、DKIM 签名未生效或所在 IP 段信誉不佳。四件事任意一个没做都容易被判垃圾。解决把 4.1 的三件套全部补齐重点确认 dkim._domainkey 的 TXT 记录与私钥能对上。PTR 在服务商侧配置本地改不了。IP 信誉需要时间恢复新 IP 头两周发信要克制避免批量群发。5.3 现象Web 管理面板反复提示证书无效或无法访问原因acme 容器申请证书时要求 80 端口能被外部访问且 A 记录解析到本机。防火墙端口没放行或本地 hosts 文件干扰续期就会失败。解决确认 80 和 443 没有被宿主机的其它服务占用确认 A 记录指向当前服务器 IP然后进入 acme 容器手动强制续期。注意这期间不要改 mailcow.conf 里的主机名改名等于重新部署证书和 DKIM 全部得重来。5.4 现象带大附件的邮件卡住Rspamd 队列持续积压原因ClamAV 扫描大附件时内存激增1GB 内存的机器容易触发 OOM容器被杀后邮件队列堆积。解决内存提到 2GB 以上或在面板里调低 ClamAV 并发扫描数。也可以在系统层面设置附件大小上限超过 50MB 的附件让用户走网盘而不是邮件。5.5 现象docker compose pull 后部分容器起不来原因版本跳跃过大数据库结构迁移没跑完或 mailcow.conf 里的参数与新版本不兼容。解决更新前先做 4.3 的全量备份。拉新镜像后使用官方升级脚本不要直接 docker compose up。起不来的容器单独看日志确认是否卡在数据库迁移步骤必要时用备份回滚到上一版镜像 tag。6. 进阶用法API 批量运维、日志定位与管理员双因子6.1 用 Mailcow API 批量创建邮箱一条 curl 顶十次点击Mailcow 面板的「API」页面可以生成只读或读写 API Key授权给指定域名。生成后批量创建邮箱就变成一条 curl# 用 API 创建邮箱注意替换 URI 和 API Key curl -X POST https://mail.example.com/api/v1/add/mailbox \ -H X-API-Key: 你的APIKey \ -H Content-Type: application/json \ -d {local_part:newuser,domain:example.com,password:初始密码,quota:10240}返回 HTTP 200 表示邮箱创建成功。批量入职时把 local_part 逐行替换循环调用即可比自己手动点几百次面板省太多时间。6.2 日志与加固看哪几个容器、把管理面板锁上 TOTP排障不要只看宿主机的 journalctl邮件链路的日志分散在对应容器里。Postfix 看 mailcow-postfixDovecot 看 mailcow-dovecot垃圾判定看 mailcow-rspamd证书问题看 mailcow-acme。一条命令盯实时输出# 实时跟踪 postfix 日志发不出信时最先看这里 docker compose logs --tail 200 mailcow-postfix安全加固最后一步是在管理面板里给 admin 账号开启 TOTP 双因子。这样即使面板密码泄露没有手机验证码也进不了后台比任何防火墙规则都直接。我自己的习惯是每季度做一次全量备份并实际演练恢复而不是备份完就以为万事大吉——邮件系统的数据丢失没有后悔药。这套方案跑顺之后维护成本比裸机拼装低一个量级值得按上面的顺序完整做一遍希望帮到你。本文还有配套的精品资源点击获取