简介Mailcow 是一套基于 Docker 容器化技术构建的开源邮件服务器解决方案面向需要自建企业邮箱、搭建邮件系统的运维人员与开发者帮助解决邮件收发、反垃圾、反病毒及域名认证等一体化部署难题。资源包共约 2000 个文件整体约 10.98MB以 1515 个 PHP 文件为核心业务代码辅以 78 个 Markdown 说明文档、61 个 JSON 配置、54 个 Shell 脚本、42 个 XML 与 36 个 JavaScript 文件并包含 Dockerfile、yml、conf 等容器编排与配置模板以及少量 Python、Lua、Sieve 脚本用于扩展与过滤逻辑。已有 202 人学习下载。通过该资源可获取完整的邮件服务组件结构涵盖 SMTP、IMAP、POP3、Webmail 及 Antispam、Antivirus、DKIM、DMARC、SPF 等安全机制便于理解容器化邮件系统的目录组织、配置方式与升级维护思路适合作为自建邮件服务的参考实现。1. Mailcow 邮件服务器从零搭建一套能收能发的自托管邮件系统公司邮箱续费又涨了三个域名二十个账号一年要小一万而且附件存储还另算钱。去年我把整套邮件系统迁到了 Mailcow 上一台 4G 内存的 VPS 跑了大半年日常收发、反垃圾、多域名别名、客户端同步全部正常。Mailcow 是一个基于 Docker 的开源邮件服务器解决方案把 Postfix、Dovecot、Rspamd、ClamAV、SOGo 等一堆组件打包成开箱即用的容器编排自带 Web 管理后台。它解决的核心问题是让没有专职运维的团队也能自建一套功能完整的邮件系统而不是花几周去啃 Postfix 配置。适合谁中小团队运维、独立开发者、需要多域名邮箱又不想被 SaaS 按人头收费的人。但前提是你得有一台能开 25 端口的机器并且愿意花一个下午把 DNS 记录配明白。2. 部署前的硬性条件端口、DNS 与主机名怎么定2.1 为什么 25 端口和 PTR 记录是绕不过去的坎自建邮件服务器最大的翻车点不在软件本身而在网络层。绝大多数云厂商默认封禁 25 端口出站你装完 Mailcow 发现能收不能发日志里全是 Connection timed out这就是典型症状。常见做法是开工单申请解封或者直接选那些明确允许邮件服务的厂商。除了端口反向解析PTR必须由 IP 所属方设置成你的邮件域名否则 Gmail、Outlook 基本会把你的邮件判为垃圾。PTR 不是你在自己 DNS 面板里加的得在 VPS 控制台提交。主机名建议用mail.example.com这种独立子域不要用根域A 记录指向服务器 IP同时把mail.example.com设成 PTR 的值三者一致才过得了基础信誉检查。2.2 最小 DNS 记录清单与填写示例下面这张表是我每次新部署都会照着填的记录缺一条都可能导致收不到信或进垃圾箱。MX 记录指向主机名SPF 用 TXT 记录声明允许发信的 IPDKIM 和 DMARC 在 Mailcow 后台生成后再回填。记录类型主机名值说明Amail.example.com你的服务器 IP邮件主机地址MXexample.commail.example.com (优先级 10)收信路由TXTexample.comvspf1 mx ~allSPF 声明TXT_dmarc.example.comvDMARC1; pquarantine; ruamailto:adminexample.comDMARC 策略CNAMEautodiscover.example.commail.example.com客户端自动发现CNAMEautoconfig.example.commail.example.com同上DKIM 记录不在这张表里因为它的公钥要在 Mailcow 装好之后由系统生成你再去域名 DNS 面板加一条dkim._domainkey.example.com的 TXT。顺序不能反先生成后添加添加完在后台点验证。注意DNS 生效有延迟改完记录别急着测等 TTL 过了再排查否则你会对着一个还没生效的解析怀疑人生。2.3 服务器规格与系统选择官方推荐最低 2 核 4G 内存、20G 磁盘。我实际跑下来4G 内存是底线Rspamd 和 ClamAV 比较吃内存2G 的机器会在收信高峰时 OOM。系统选 Debian 12 或 Ubuntu 22.04干净系统不要预装 Nginx 或 Postfix否则端口冲突。磁盘建议 SSD邮件附件多了之后 IO 会成为瓶颈。如果你打算跑多个域名、几百个账号直接上 8G 内存别省这个钱。3. 用 Docker Compose 把 Mailcow 跑起来命令与参数逐条拆3.1 获取源码与首次配置生成Mailcow 的部署入口是generate_config.sh它会问你主机名和时区然后生成mailcow.conf。这个文件是整个系统的配置中心后面所有端口、路径、数据库密码都在里面。# 克隆仓库到 /opt 下这是官方推荐路径 cd /opt git clone https://github.com/mailcow/mailcow-dockerized cd mailcow-dockerized # 运行配置生成脚本交互式输入主机名 # 主机名填 mail.example.com时区填 Asia/Shanghai ./generate_config.sh脚本执行完会生成mailcow.conf。逻辑说明这个脚本做了三件事——检测系统环境、根据你输入的主机名写入配置、生成随机数据库密码。参数说明主机名必须和你的 PTR、A 记录完全一致时区影响日志和邮件时间戳。如果你输错了主机名直接删掉mailcow.conf重新跑脚本不要手动改容易漏字段。3.2 拉镜像并启动全部容器配置生成后一条命令拉起整套服务。首次执行会拉取十几个镜像视网络情况需要几分钟到十几分钟。# 拉取镜像并后台启动所有容器 docker compose pull docker compose up -d # 查看容器状态确认全部是 running 或 healthy docker compose ps逻辑说明docker compose pull先把所有镜像拉到本地避免启动时超时up -d按依赖顺序启动。参数说明-d是后台运行调试阶段可以去掉它看实时日志。启动完成后用docker compose ps检查正常情况下应该有二十个左右的容器在跑包括postfix-mailcow、dovecot-mailcow、rspamd-mailcow、nginx-mailcow、mysql-mailcow等。如果有容器反复重启先看它的日志docker compose logs 服务名八成是端口被占或内存不足。3.3 首次登录后台与管理员账号浏览器打开https://mail.example.com首次访问会提示证书不受信任这是因为 Mailcow 自签了证书接受后进入登录页。默认管理员账号是admin密码是moohoo。# 如果你忘了改默认密码可以用命令行重置 docker compose exec mysql-mailcow mysql -u root -p mailcow -e \ UPDATE admin SET password SHA2(新密码, 256) WHERE username admin;逻辑说明这条 SQL 直接改数据库里的管理员密码哈希。参数说明SHA2(新密码, 256)是 Mailcow 存储密码的方式别用明文。改完刷新后台即可。登录后第一件事是改密码第二件事是进「系统配置」把主机名、时区、管理员邮箱核对一遍。3.4 添加域名、邮箱账号与 DKIM 密钥后台左侧「邮件设置」→「域名」→「添加域名」填入example.com。保存后进入该域名详情页找到 DKIM 部分点击生成密钥。系统会给你一段公钥复制到 DNS 面板添加 TXT 记录主机名是dkim._domainkey。# 生成后可以用 dig 验证 DKIM 记录是否生效 dig TXT dkim._domainkey.example.com short逻辑说明DKIM 用私钥签名外发邮件收件方用 DNS 里的公钥验签验签通过才认为邮件未被篡改。参数说明short只输出结果值方便肉眼比对。如果返回为空说明 DNS 还没生效或记录填错。域名配好后进「邮箱」→「添加邮箱」填账号名、密码、配额。配额按需设默认 3072MB小团队够用。4. 收发链路调通从发一封测试邮件到看日志定位4.1 用 swaks 做端到端发信测试装好账号后别急着用 Outlook 连先用命令行工具swaks测发信链路它能直接告诉你卡在哪一步。# 安装 swaks apt install swaks -y # 用刚创建的账号发一封测试邮件到 Gmail swaks --to yourtestgmail.com \ --from userexample.com \ --server mail.example.com \ --auth LOGIN \ --auth-user userexample.com \ --auth-password 你的密码 \ --tls逻辑说明--server指定发信服务器--auth走认证--tls强制加密。参数说明如果返回250 OK说明投递成功如果卡在认证阶段检查密码和账号是否启用如果卡在 TLS检查证书。发完后去 Gmail 收件箱看是否收到同时检查垃圾箱——第一次发信大概率进垃圾箱这是正常的等 DKIM、SPF、DMARC 全部生效并积累一点信誉后会好转。4.2 收信测试与日志追踪收信测试反过来用外部邮箱发到你的域名然后看 Mailcow 日志确认投递路径。# 实时跟踪 postfix 日志观察收信过程 docker compose logs -f postfix-mailcow # 查看 dovecot 日志确认邮件是否写入用户邮箱 docker compose logs -f dovecot-mailcow逻辑说明Postfix 负责 SMTP 收发Dovecot 负责 IMAP 存储。一封邮件进来先过 Postfix再经 Rspamd 反垃圾最后交给 Dovecot 落盘。参数说明-f是持续输出按 CtrlC 退出。如果 Postfix 日志显示statussent但用户收不到去 Dovecot 日志看是不是配额满了或用户不存在。如果日志显示statusdeferred看delay原因常见的是 DNS 解析失败或对端拒收。4.3 反垃圾与病毒扫描的默认策略Mailcow 默认启用 Rspamd 和 ClamAV。Rspamd 的规则比较激进初期可能误判正常邮件。我一般会先观察一周把误判的邮件在后台「 quarantine」里放出来同时把发件人加白名单。# 查看 Rspamd 的统计信息 docker compose exec rspamd-mailcow rspamc stat # 查看被隔离的邮件列表 docker compose exec rspamd-mailcow rspamc history逻辑说明rspamc stat给出处理总量、垃圾比例、学习样本数rspamc history列出最近处理记录。参数说明如果垃圾比例异常高检查是不是有账号密码泄露被用来发垃圾。ClamAV 吃内存如果服务器内存紧张可以在mailcow.conf里关掉它但会失去病毒扫描能力。5. 避坑与排查自建邮件服务器最容易翻车的五件事5.1 能收不能发日志报 Connection timed out现象外部邮件能进来自己发出去全部超时Postfix 日志里一堆Connection timed out连向 25 端口。原因云厂商封了 25 端口出站这是最常见的新手翻车点。解决提交工单申请解封或者换一家允许邮件服务的厂商。申请时说明用途一般一两个工作日能开。开之前可以用telnet gmail-smtp-in.l.google.com 25测试通了才说明端口放行。5.2 邮件进垃圾箱SPF 或 DKIM 验证失败现象能发出去但对方收到在垃圾箱邮件头显示spfsoftfail或dkimfail。原因DNS 记录没生效、填错或者 PTR 和主机名不一致。解决用dig TXT example.com short查 SPF用dig TXT dkim._domainkey.example.com short查 DKIM逐条比对后台生成的值。PTR 在 VPS 控制台确认必须等于mail.example.com。三条全绿之后信誉需要时间积累不会立刻进收件箱。5.3 容器反复重启内存被 OOM Killer 干掉现象docker compose ps里某个容器状态是Restarting日志显示Killed。原因内存不足ClamAV 和 Rspamd 是内存大户2G 机器必崩。解决升到 4G 以上或者在mailcow.conf里禁用 ClamAV把SKIP_CLAMDy打开然后docker compose down docker compose up -d。禁用后病毒扫描没了但反垃圾还在小团队可以接受。5.4 Web 后台打不开Nginx 报 502现象浏览器访问https://mail.example.com显示 502 Bad Gateway。原因Nginx 容器起来了但后端 PHP 或 MySQL 没就绪或者证书生成失败。解决先docker compose ps看php-fpm-mailcow和mysql-mailcow是否 running。如果 MySQL 在重启看它日志是不是磁盘满了。如果都正常检查mailcow.conf里的HTTP_PORT和HTTPS_PORT有没有被其他服务占用ss -tlnp | grep 443能查。5.5 客户端配置反复失败IMAP 连不上现象Outlook 或手机自带邮件客户端配置时提示「服务器无响应」或「证书错误」。原因端口填错或证书不被信任。解决IMAP 用 993 端口 SSLSMTP 用 465 端口 SSL不要用 143 和 587 的 STARTTLS虽然也支持但客户端兼容性差。证书问题如果是自签的客户端会警告建议用 Lets Encrypt 签正式证书。Mailcow 支持在后台申请域名解析正确的前提下点一下就行。6. 进阶多域名别名、邮件归档与备份恢复的实操习惯跑通基础收发之后真正让 Mailcow 值回票价的是它的多域名和别名能力。我手上三个域名共用一个 Mailcow 实例每个域名独立 DKIM账号可以跨域名收信。后台「别名」功能可以做到salesexample.com转发到多个账号也可以做 catch-all 把整个域名的未匹配邮件兜到一个邮箱。这里有个细节catch-all 会招来大量垃圾除非你确实需要否则别开。邮件归档我用的方案是 Mailcow 自带的「邮件归档」功能在域名设置里开启后所有进出邮件会额外存一份到归档邮箱满足合规留痕需求。存储会翻倍磁盘要留够。备份方面Mailcow 官方提供了一个backup_and_restore.sh脚本我每周跑一次全量备份备份文件包含 MySQL 数据、邮件存储和配置。# 创建全量备份备份文件默认放在 /opt/mailcow-backup cd /opt/mailcow-dockerized ./helper-scripts/backup_and_restore.sh backup all # 恢复时先停服务再执行恢复 docker compose down ./helper-scripts/backup_and_restore.sh restore逻辑说明backup all备份数据库、vmail 邮件目录和配置文件restore会提示你选择备份时间点。参数说明备份目录可以在脚本里改建议挂到独立磁盘或同步到异地。恢复前务必停容器否则数据不一致。我踩过的坑是没停 MySQL 就恢复结果数据库和邮件文件对不上白折腾一晚上。验证备份是否可用的方法很简单找一台测试机装好同版本 Mailcow把备份文件拷过去跑恢复看账号和邮件是否完整。别等真出事才验证那时候后悔药没地方买。我的习惯是每月做一次恢复演练花半小时换来的是一年多的安稳。自建邮件服务器这件事前期配置麻烦但跑顺之后基本不用管成本只有 VPS 费用。希望帮到你。本文还有配套的精品资源点击获取