说在前面
有了密码管理器之后,下一步自然就是——邮件服务器。不想把邮件扔给 Gmail 或腾讯企业邮?那就自己搭一个 Mailcow。
Mailcow 是一个 Docker 化的全功能邮件方案,包含 Postfix、Dovecot、Nginx、Rspamd、Solr 等,界面现代,维护方便。
我的环境:
- 系统:Ubuntu 22.04(Debian 系通用)
- 服务器:香港(dddd)
- 域名:
mail.nkcdn.net.cn(示例,请替换成你的)
这篇教程完全按照“装依赖 → 克隆项目 → 生成配置 → 启动 → 宝塔证书 → 反代”的顺序,每一步都附带了避坑说明。
和上一篇 Vaultwarden 一样,我会把踩过的坑全写出来,让你少掉几根头发。
整体顺序:
> 安装依赖与 Docker → 克隆 Mailcow → 生成配置 → 启动容器 → 宝塔证书并写入 → 外部 Nginx 反代(可选)→ 问题排查
开干。
补充更新🛠️ 前置优化 & 冲突处理(CentOS / Debian 通用)
🔗 1. 添加 docker-compose 执行权限与软链接
如果你单独安装了 docker-compose(非 Docker 官方插件),建议添加执行权限并建立软链接,便于全局调用:
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
验证:docker-compose --version
📧 2. 卸载系统自带的 Postfix(避免端口冲突)
部分 CentOS 7 / Debian 系统预装了 Postfix,会占用 25 端口,与 Mailcow 冲突。建议先卸载:
# CentOS / RHEL 系列
yum -y remove postfix
# Debian / Ubuntu 系列
apt-get remove -y postfix
卸载后重启一次系统,确保 25 端口释放。
🌐 3. 设置 Linux 主机名与 /etc/hosts 解析
邮件服务器的主机名必须为二级域名(如 mail.yourdomain.com),并正确解析到公网 IP。
# 设置主机名(将 mail.domain.com 替换为你的实际域名)
hostnamectl set-hostname mail.yourdomain.com
# 添加 hosts 解析(将 IP 和域名替换为真实值)
echo '173.0.xx.xxx mail.yourdomain.com' >> /etc/hosts
检查:hostname -f 应输出完整域名,ping $(hostname -f) 应指向正确 IP。
📦 4. 安装 Git 并克隆 Mailcow 项目
如果你的系统尚未安装 Git,先安装:
# CentOS
yum -y install git
# Debian / Ubuntu
apt-get install -y git
然后进入 /opt 目录克隆 Mailcow 仓库:
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
之后就可以继续执行 ./generate_config.sh 了。
💡 以上步骤能够避免常见的端口冲突、命令找不到、主机名解析错误等问题,建议在正式部署前全部完成。
一、安装依赖与基础环境
更新系统并安装必要工具:
apt update
apt install -y git curl docker.io docker-compose
启动 Docker 并设置开机自启:
systemctl enable docker
systemctl start docker
验证 Docker 版本(插图位置①:docker --version 输出)

docker –version 显示版本号
二、克隆 Mailcow 项目
进入 /opt 目录并拉取官方仓库:
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
如果 git 速度慢,可以换代理或使用加速镜像,但耐心等待一般没问题。
三、生成配置文件
运行交互式配置脚本:
./generate_config.sh
按提示输入:
- 域名:
mail.nkcdn.net.cn(换成你自己的) - 时区:
Asia/Shanghai
脚本会自动生成 mailcow.conf 以及其他环境变量文件。
四、启动 Mailcow 容器
第一次启动会自动拉取所有需要的镜像(大约 10 个),时间取决于网络:
docker compose up -d
等待所有容器变为 Up 状态。查看运行中的容器:
docker compose ps
(插图位置③:docker-compose ps 显示所有容器 healthy 或 up)

Mailcow 容器全部正常运行
如果你遇到端口 80/443 被占用报错,先别慌,第七节“常见问题”第1条有解决办法。
五、宝塔面板申请 SSL 证书并写入
注意:这一步要放在 Mailcow 启动之后,因为证书目录已经由 Mailcow 自动生成。
5.1 宝塔面板操作
- 登录宝塔面板 → 左侧 网站 → 添加站点,域名填
mail.nkcdn.net.cn(PHP 选纯静态) - 点击域名进入设置 → SSL → 申请免费证书(Let’s Encrypt 或宝塔免费证书)
- 申请成功后,分别复制 证书(CRT) 和 私钥(KEY)
(插图位置④:宝塔 SSL 界面,证书已部署,显示复制按钮)

宝塔SSL证书申请成功(或者1panel)
5.2 替换 Mailcow 中的证书文件
进入 Mailcow 的 SSL 目录:
cd /opt/mailcow-dockerized/data/assets/ssl
备份原有证书(可选):
mv cert.pem cert.pem.bak
mv key.pem key.pem.bak
写入新证书链:
nano cert.pem
粘贴宝塔里复制的 证书(CRT) 内容,保存。
写入私钥:
nano key.pem
粘贴宝塔里的 私钥(KEY) 内容,保存。
设置严格权限:
chmod 600 cert.pem key.pem
chown root:root cert.pem key.pem
5.3 重启 Mailcow 加载新证书
docker-compose restart postfix nginx
docker-compose restart
或者直接重启所有容器:
docker-compose down
docker-compose up -d
六、Nginx 反向代理(可选,使用外部 Nginx)
Mailcow 内部自带了一个 Nginx 监听 8080/8443,但如果你想用宝塔管理的主 Nginx 来做反代,可以按以下配置。
创建站点配置:
nano /etc/nginx/sites-available/mail.nkcdn.net.cn
写入以下内容(注意 proxy_pass 指向 Mailcow 的 HTTPS 端口 8443):
server {
listen 80;
server_name mail.nkcdn.net.cn;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name mail.nkcdn.net.cn;
ssl_certificate /opt/mailcow-dockerized/data/assets/ssl/cert.pem;
ssl_certificate_key /opt/mailcow-dockerized/data/assets/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass https://127.0.0.1:8443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用站点并测试:
ln -s /etc/nginx/sites-available/mail.nkcdn.net.cn /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
(插图位置⑥:nginx -t 成功截图)

nginx -t syntax ok
如果你不打算用外部 Nginx,直接访问
http://你的IP:8080也可以进入 Mailcow 面板,但强烈建议上 HTTPS。
七、Mailcow 常见问题与解决方法
问题1:启动报错端口 80/443 被占用
原因:Mailcow 内部 Nginx 默认监听 80 和 443,如果主机上已有 Nginx(比如宝塔),就会冲突。
解决:编辑 mailcow.conf,修改 HTTP 和 HTTPS 端口:
HTTP_PORT=8080
HTTPS_PORT=8443
然后重启:
docker-compose down
docker-compose up -d
问题2:证书不生效 / 浏览器提示不安全
原因:证书文件位置不对、文件名错误或权限不足。
解决:
- 确保证书在
/opt/mailcow-dockerized/data/assets/ssl/下 - 文件名必须是
cert.pem和key.pem - 权限设置为
600,属主 root:root - 重启 Mailcow(
docker-compose restart)
问题3:docker-compose 命令找不到
原因:系统未安装 docker-compose 或使用了新版 Docker 的 docker compose 插件。
解决:
- 安装独立版本:
apt install docker-compose - 或使用新命令:
docker compose up -d(注意中间是空格)
问题4:邮件发不出去(25 端口被封禁)
原因:大多数云服务商(阿里云、腾讯云、华为云)默认封禁 25 端口出站。
解决:
- 联系服务商申请解封 25 端口(企业认证后一般可开)
- 或者使用中继服务(SendGrid、Mailgun 等)转发外发邮件
- 检查域名解析:MX 记录指向
mail.你的域名.com,A 记录指向服务器 IP,PTR 反向解析(需服务商支持) - 配置 SPF、DKIM、DMARC(Mailcow 后台有自动生成功能)
问题5:Mailcow 面板无法访问(502 或拒绝连接)
排查步骤:
docker-compose ps # 查看所有容器状态
docker-compose logs -f nginx-mailcow # 查看内部 Nginx 日志
docker-compose logs -f php-fpm-mailcow
常见原因:内存不足(Mailcow 至少需要 2GB RAM),或端口映射错误。
💾 为服务器添加 4GB 交换内存(Swap)
Mailcow 运行时需要较多内存,如果服务器内存不足(例如只有 1GB 或 2GB),建议添加交换内存来缓解压力。以下步骤将创建一个 4GB 的交换文件并永久生效。
📝 1. 创建交换文件
# 创建一个 4GB 的空文件(块大小 1M,共 4096 块)
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
🔒 2. 设置正确权限
交换文件必须只有 root 可读写,否则系统会拒绝使用。
chmod 600 /swapfile
🔄 3. 格式化为交换空间
mkswap /swapfile
⚡ 4. 启用交换文件
swapon /swapfile
查看交换内存是否生效:
free -h
💾 5. 永久生效(开机自动挂载)
将交换文件写入 /etc/fstab:
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
⚙️ 6. 优化交换内存参数(可选)
swappiness 值控制系统使用交换的倾向,默认 60。对于服务器,建议设为 10-30,优先使用物理内存:
# 临时生效
sysctl vm.swappiness=10
# 永久生效
echo 'vm.swappiness=10' >> /etc/sysctl.conf
检查当前 swappiness:
cat /proc/sys/vm/swappiness
🗑️ 如何删除交换文件(如果不再需要)
swapoff /swapfile
rm /swapfile
# 然后编辑 /etc/fstab 删除对应行
💡 补充说明:
- 交换文件不能放在 Btrfs、ZFS 等不支持交换文件的文件系统上,建议使用 ext4。
- 如果服务器内存充足(≥4GB),可以不添加 Swap;但添加 4GB Swap 可以作为内存溢出的保险。
- DD 命令中的
count=4096即 4GB(4096MB),如需其他大小可修改数字。
问题6:忘记管理员密码
进入 php-fpm 容器执行重置脚本:
docker-compose exec php-fpm-mailcow php /web/src/reset-admin-password.php
按提示输入新密码即可。
补充更新⚠️ 报错现象:generate_config.sh 无法运行,提示 jq: command not found

原因:Mailcow 的初始化脚本依赖 jq 处理 JSON 数据,系统未安装导致脚本退出。
解决方法:安装 jq 及相关依赖,然后重新执行初始化脚本。
📦 1. 安装必需依赖
apt update && apt install -y jq curl git docker.io docker-compose
🔄 2. 重新运行生成配置脚本
cd /opt/mailcow-dockerized
./generate_config.sh
按提示输入邮件域名(如 mail.你的域名.com)和时区(Asia/Shanghai),其余选项回车默认即可。
🚀 3. 继续后续步骤(可选端口修改)
sed -i 's/HTTP_PORT=80/HTTP_PORT=880/' mailcow.conf
sed -i 's/HTTPS_PORT=443/HTTPS_PORT=8443/' mailcow.conf
docker-compose pull
docker-compose up -d
💡 补充说明:jq 是 Mailcow 强制依赖,缺少它脚本会直接报错。以上安装完成后即可正常初始化。
⚠️ 报错现象:Mailcow 提示 Docker 版本过低(要求 ≥ 24.0),系统自带 docker.io 20.10 不支持

错误
原因:Debian/Ubuntu 系统自带的 docker.io 包版本陈旧,不满足 Mailcow 的最低版本要求。
解决方法:卸载旧版 Docker,从官方源安装最新版 Docker CE。
🗑️ 1. 卸载旧版本
apt remove -y docker.io docker-compose
apt autoremove -y
🔧 2. 安装官方新版 Docker(Debian/Ubuntu 通用)
# 安装依赖
apt update && apt install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# 添加软件源(注意:ubuntu 用户需将 debian 替换为 ubuntu)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装最新版 Docker
apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
✅ 3. 验证版本
docker --version
docker compose version
确保 docker --version 输出 ≥ 24.x。
📁 4. 返回 Mailcow 目录,重新初始化
cd /opt/mailcow-dockerized
./generate_config.sh
💡 补充说明:新版 Docker 推荐使用 docker compose(带空格),Mailcow 会自动识别,无需额外安装 docker-compose 独立包。
🚀 初始化 Mailcow 并添加域名
🔐 1. 登录 Web 管理界面
容器启动成功后,浏览器访问 https://你的服务器IP:8443 或你配置的反代域名(如 https://mail.domain.com)。
默认管理员账号:admin ,密码:moohoo(登录后请立即修改)。

Mailcow 登录页面
➕ 2. 添加域名
登录后台后,点击右上角 配置(Configuration) → 邮箱设置(Mail Setup) → 添加域名(Add Domain)。
重要: 此处应填写您的顶级域名(如 domain.com),而不是二级域名(mail.domain.com)。
例如您的主机名设置为 mail.domain.com,添加域名时只需填 domain.com。

添加域名界面,填写顶级域名
🔍 3. DNS 检测提示
域名添加完成后,右侧会出现 DNS 按钮,点击可对域名 DNS 进行检测并提供指引。
⚠️ 注意:该检测有时不够准确,且并非所有列出的记录都必须添加。

域名列表页,显示 DNS 按钮
🌐 域名解析记录配置(DNS 设置)
在您的域名托管商(如 Cloudflare、阿里云、DNSPod 等)添加以下记录,确保邮件服务正常收发:
💡 注意事项:
- 将表格中的所有
domain.com替换为您的实际域名。 - PTR 记录(反向解析)通常需要提交工单给 VPS 服务商(如雨云、阿里云、腾讯云)手动添加,非必须但强烈推荐。
- DKIM 记录需要在 Mailcow 部署完成后,进入后台生成并复制到 DNS 中,用于邮件签名防伪造。
- 更改 DNS 后,等待几分钟到几小时生效(可用
dig命令检查)。
尾巴
邮件服务器比密码管理器复杂不少,但 Mailcow 把绝大多数繁琐的配置都封装在了 Docker 里。只要按顺序来,端口别冲突,证书放对位置,剩下的就是等 DNS 解析生效。
你现在拥有了一个完全属于你自己的邮件系统:
– 邮箱后缀 = 你的域名
– 无广告、无容量限制(除了硬盘)
– 数据 100% 自己掌控
不过记得:自建邮件需要维护好反垃圾和发信声誉。下一篇我会专门写 Mailcow 的 SPF/DKIM/DMARC 配置,以及如何避免邮件进垃圾箱。
如果你也搭建成功了,欢迎在评论区晒出你的域名。有问题直接留言。
🐾 —— 喵 ~
📝 本文标题:📧 别再租企业邮了!喵教你自托管 Mailcow,全功能邮件系统带 Web 界面
原创作者:O Meow
🔗 原文链接:https://www.oops.net.cn/115/
⚠️ 版权声明 & 禁止未经授权转载
本博客所有原创文章均为作者辛苦创作,版权归本站所有。
严禁任何未经许可的转载、摘抄、洗稿、商业搬运。
如需合法转载,请务必联系作者获得书面授权,并标注完整原文出处与来源,违者将依法追究责任。
感谢您的理解、尊重与支持💖