📧 别再租企业邮了!喵教你自托管 Mailcow,全功能邮件系统带 Web 界面

说在前面
有了密码管理器之后,下一步自然就是——邮件服务器。不想把邮件扔给 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 显示版本号

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 容器全部正常运行

Mailcow 容器全部正常运行

如果你遇到端口 80/443 被占用报错,先别慌,第七节“常见问题”第1条有解决办法。

五、宝塔面板申请 SSL 证书并写入

注意:这一步要放在 Mailcow 启动之后,因为证书目录已经由 Mailcow 自动生成。

5.1 宝塔面板操作

  1. 登录宝塔面板 → 左侧 网站 → 添加站点,域名填 mail.nkcdn.net.cn(PHP 选纯静态)
  2. 点击域名进入设置 → SSL → 申请免费证书(Let’s Encrypt 或宝塔免费证书)
  3. 申请成功后,分别复制 证书(CRT)私钥(KEY)

(插图位置④:宝塔 SSL 界面,证书已部署,显示复制按钮)

插图④:宝塔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 -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.pemkey.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

插图①:安装 jq 及依赖

原因: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 不支持

cw

错误

原因: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 登录页面

Mailcow 登录页面

➕ 2. 添加域名

登录后台后,点击右上角 配置(Configuration)邮箱设置(Mail Setup)添加域名(Add Domain)

重要: 此处应填写您的顶级域名(如 domain.com),而不是二级域名(mail.domain.com)。
例如您的主机名设置为 mail.domain.com,添加域名时只需填 domain.com


插图②:添加域名界面,填写顶级域名

添加域名界面,填写顶级域名

🔍 3. DNS 检测提示

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


插图③:域名列表页,显示 DNS 按钮

域名列表页,显示 DNS 按钮

🌐 域名解析记录配置(DNS 设置)

在您的域名托管商(如 Cloudflare、阿里云、DNSPod 等)添加以下记录,确保邮件服务正常收发:

主机名 记录类型 记录值 备注
mail.domain.com A 您的服务器公网IP 填写你VPS的公网IPv4地址
您的IP(反向解析) PTR mail.domain.com 需要联系服务器提供商添加,用于提升发信信誉
domain.com MX mail.domain.com 邮件交换记录,优先级可填 10
autodiscover.domain.com CNAME mail.domain.com 用于自动配置邮件客户端(Outlook/Thunderbird)
autoconfig.domain.com CNAME mail.domain.com 同上,兼容不同客户端
domain.com TXT v=spf1 a mx ip4:173.0.xx.xxx ~all SPF 记录,将 173.0.xx.xxx 替换为你的服务器IP
dkim._domainkey.domain.com TXT 从 Mailcow 后台获取 登录 Mailcow 管理面板 → 配置 → 邮件设置 → DKIM,复制生成的记录值

💡 注意事项

  • 将表格中的所有 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/


⚠️ 版权声明 & 禁止未经授权转载


本博客所有原创文章均为作者辛苦创作,版权归本站所有。


严禁任何未经许可的转载、摘抄、洗稿、商业搬运。


如需合法转载,请务必联系作者获得书面授权,并标注完整原文出处与来源,违者将依法追究责任。


感谢您的理解、尊重与支持💖


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇