Ubuntu 22.04 安装 Mail-in-a-Box 指南
在全新 Ubuntu 22.04 LTS 上用官方一键脚本部署 Mail-in-a-Box v77 的实测实录:交互三问、NONINTERACTIVE 自动化安装主线、安装后验证与 7 个真实排障坑。
Ubuntu 22.04 安装 Mail-in-a-Box 指南
目标:在一台全新的 Ubuntu 22.04 LTS 服务器上,用官方一键安装脚本部署 Mail-in-a-Box v77,产出一台具备 SMTP/IMAP/Webmail/DNS/管理面板完整能力的邮件服务器。本文为部署实录篇:全部命令与回显均来自本站在全新 Ubuntu 22.04 环境中的实测(2026-10-21),安装过程中真实踩到的 7 个坑及其解法一并记录。
一、环境信息
| 项目 | 值 |
|---|---|
| 组件版本 | Mail-in-a-Box v77(GitHub Releases 2026-10-21 实查的最新稳定版,2026-09-26 发布) |
| 操作系统 | Ubuntu 22.04 LTS (jammy),x86_64,全新安装、独占整机 |
| 机器规格 | 4 vCPU / 8 GB 内存 / 480 GB 磁盘 |
| 网络 | 公网 IP 182.54.113.29,内网 IP 10.0.0.3,可直连公网(HTTP/HTTPS/DNS/出站 25 端口均通) |
| 安装日期 | 2026-10-21 |
| 安装方式 | 官方一键脚本 curl -s https://mailinabox.email/setup.sh | sudo bash(自动化模式实测) |
本文示例约定(与实测环境一一对应):
| 约定项 | 示例值 |
|---|---|
| 托管邮件域名 | example.com |
| 主机名 | box.example.com(官方推荐的 box.<域名> 风格) |
| 管理员邮箱 | me@example.com |
| 示例密码 | q1w2e3r4(仅作演示,生产请用强密码) |
二、方案形态与说明
Mail-in-a-Box 是整机装置式邮件服务器:官方只提供"Ubuntu 22.04 一键脚本"这一种安装形态,没有 Docker/容器发行。脚本会做三件"重活",请确认机器是全新的再开始:
- 接管系统:改写
/etc/hostname、不足 2GB 内存时自动创建 1GB/swapfile、卸载 apache2 等冲突服务、把/etc/resolv.conf指向本机 DNS; - 装全家桶:Postfix、Dovecot、nsd4、bind9、OpenDKIM、SpamAssassin、nginx、Roundcube、Nextcloud、Z-Push、管理守护进程等十几个组件一次装齐;
- 自签过渡证书:安装完成即有 HTTPS 面板可用(自签证书),域名 DNS 生效后自动换发 Let's Encrypt 证书。
交互式安装只问三个问题(邮箱地址、主机名、公网 IP),其余全部自动决策。同时官方脚本原生支持自动化安装(NONINTERACTIVE=1 环境变量,与官方 Vagrant 配置同款),本文实测即采用该方式,输出与交互式完全一致。
三、前置条件
- 系统:全新、独占的 Ubuntu 22.04 LTS,root 权限(脚本用
lsb_release严格判别系统版本); - 资源:内存 ≥ 512MB(低于 768MB 仅告警不拦截)、
/tmp未挂载为 noexec、x86_64 架构; - 端口:25(SMTP)、53(DNS,nsd/bind9)、443(HTTPS)、465/587(SMTPS/Submission)、993(IMAPS)等需可绑定;云主机安全组需放行入站 25/53/80/443/465/587/993;
- 公网 IP:必须是非住宅网络;安装前建议到 Spamhaus 官网自查候选 IP 是否在黑名单(本站实测就真实命中了,见第六节);
- DNS 前提:建议让盒子接管域名 DNS(NS 记录指向盒子);不接管则需手工同步记录;
- 基础连通:能访问
mailinabox.email、GitHub(拉取源码)、Ubuntu 归档与 Launchpad PPA(装包)、acme-v02.api.letsencrypt.org(注册 Let's Encrypt 账号)。若服务器访问 GitHub 不稳定,可在执行安装命令前export https_proxy=http://<代理地址>:<端口>,脚本内的 git/apt/curl 均遵守该变量。
四、安装步骤
4.1 安装前自检
lsb_release -d && free -m | head -2 && df -h / | tail -1
实测回显:
Description: Ubuntu 22.04.5 LTS
total used free
Mem: 8002 3543 2250
/dev/sda1 482G 8.9G 449G 2% /
4.2 交互式安装的三个问题(标准路径)
执行 curl -s https://mailinabox.email/setup.sh | sudo bash 后,脚本先显示一个全屏提示框(实测屏文摘录):
Mail-in-a-Box Installation NOTE: You should only install this on a brand new Ubuntu installation 100% dedicated to Mail-in-a-Box. Mail-in-a-Box will, for example, remove apache2.
随后依次出现三个输入框,按下表作答(问题标题与默认值均为 v77 脚本实测内容):
| 顺序 | 对话框标题 | 默认值 | 本文输入 | 说明 |
|---|---|---|---|---|
| 1 | Your Email Address | me@example.com(按主机名反推域名) | me@example.com | 首个管理员邮箱,也是面板登录账号 |
| 2 | Primary Hostname | box.example.com("box."+邮箱域名) | 回车确认 | 邮件服务器对外的正式主机名 |
| 3 | Public IP Address | 自动探测结果(NAT 环境需手改) | 182.54.113.29 | 脚本经 icanhazip.com 自动探测,NAT 后需手动修正 |
⚠️ 注意:首个管理员邮箱不要填
admin@开头的地址——v77 会直接拒绝("You may not make a user account for that address because it is frequently used for domain control validation"),admin@/postmaster@等保留名由系统自动生成为指向管理员的别名。
4.3 自动化安装(本文实测主线)
在脚本、CI 或需要免交互的场景,用官方支持的 NONINTERACTIVE=1 模式一次性给定全部答案(脚本会自动完成 4.2 的三个问答并跳过交互):
export NONINTERACTIVE=1
export PRIMARY_HOSTNAME=box.example.com
export PUBLIC_IP=182.54.113.29
export EMAIL_ADDR=me@example.com
export EMAIL_PW=q1w2e3r4
curl -s https://mailinabox.email/setup.sh | sudo bash
实测总耗时约 20 分钟(含下载)。安装过程逐阶段回显如下(照抄实测日志,长行省略号处为原始输出中的进度点,postgrey 与 doveconf 两条警告为 v77 真实输出、无害,勿惊慌):
Primary Hostname: box.example.com
Public IP Address: 182.54.113.29
Private IP Address: 10.0.0.3
Mail-in-a-Box Version: v77
Updating system packages...
Installing system packages...
Initializing system random number generator...
Firewall is active and enabled on system startup
Synchronizing state of fail2ban.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable fail2ban
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service.
Creating initial SSL certificate and perfect forward secrecy Diffie-Hellman parameters...
Generating DH parameters, 2048 bit long safe prime
..........................................(进度点省略)......++*++*++*++*++*++*++*++*++*
Installing nsd (DNS server)...
Generating DNSSEC signing keys...
Installing Postfix (SMTP server)...
mv: cannot stat '/var/lib/postgrey/*': No such file or directory
Installing Dovecot (IMAP server)...
doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -Pn > dovecot-new.conf
doveconf: Warning: Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:91: ssl_dh_parameters_length is no longer needed
Creating new user database: /home/user-data/mail/users.sqlite
Installing OpenDKIM/OpenDMARC...
Installing SpamAssassin...
Installing Nginx (web server)...
Installing Roundcube (webmail)...
Installing Nextcloud (contacts/calendar)...
Upgrading to Nextcloud version 27.1.11
Nextcloud is already latest version
photos 2.3.0 disabled
dashboard 7.7.0 disabled
activity 2.19.0 disabled
Installing Z-Push (Exchange/ActiveSync server)...
Installing Mail-in-a-Box system management daemon...
Installing Munin (system monitoring)...
Okay. I'm about to set up me@example.com for you. This account will also
have access to the box's control panel.
mail user added
updated DNS: example.com
web updated
-----------------------------------------------
Your Mail-in-a-Box is running.
Please log in to the control panel for further instructions at:
https://182.54.113.29/admin
You will be alerted that the website has an invalid certificate. Check that
the certificate fingerprint matches:
B2:9D:BB:C9:37:27:02:84:E1:90:98:68:A4:CE:71:F1:1B:68:96:CE:3F:60:F0:F6:9E:F6:58:38:46:3B:9F:F1
要点解读:
mail user added / updated DNS: example.com / web updated:首个管理员账号创建成功,DNS 区域与网站配置随之生成;- 收尾面板地址给出的是
https://182.54.113.29/admin——因为management/status_checks.py --check-primary-hostname检测到box.example.com尚未在公网解析到本机(新装机器的常态)。把域名 NS/A 记录配好后再次执行mailinabox或等每日检查,面板地址会变为https://box.example.com/admin; - 自签证书指纹
B2:9D:BB:...为实测值,你的机器会不同,以安装收尾输出为准核对; - 脚本在收尾前还会注册 Let's Encrypt 账号(
Account registered.),域名解析生效后自动签发正式证书。
4.4 幂等与重跑
setup/start.sh 是幂等设计:重复执行 curl -s https://mailinabox.email/setup.sh | sudo bash(或直接运行已装机器上的 sudo mailinabox)会跳过已完成的步骤,只重放配置并重新生成 DNS 记录。改了配置想让它生效,重跑即可。实测中本站因排障多次重跑,Nextcloud is already latest version 等幂等提示即来自重复执行。
五、安装后验证
服务状态(systemctl status mailinabox --no-pager,实测节选):
● mailinabox.service - Mail-in-a-Box System Management Service
Loaded: loaded (/lib/systemd/system/mailinabox.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-10-21 02:02:24 UTC; 13min ago
Main PID: 56833 (gunicorn)
Tasks: 4 (limit: 94371)
Memory: 51.1M
CPU: 2.905s
CGroup: /system.slice/mailinabox.service
监听端口(ss -ltn,实测值):
| 地址 | 端口 | 服务 |
|---|---|---|
| 0.0.0.0 / [::] | 25 | Postfix SMTP |
| 0.0.0.0 / [::] | 443 | nginx(面板/Webmail/Nextcloud) |
| 0.0.0.0 / [::] | 465 | Postfix SMTPS |
| 0.0.0.0 / [::] | 587 | Postfix Submission |
| 0.0.0.0 / [::] | 993 | Dovecot IMAPS |
| 内网 IP | 53 | nsd4 权威 DNS(对外) |
| 127.0.0.1 | 53 | bind9 本地递归 DNS(对内) |
| 127.0.0.1 | 143 | Dovecot IMAP(仅本机,供 Roundcube 内部访问) |
| 127.0.0.1 | 10222 | Mail-in-a-Box 管理守护进程(API) |
核心配置(cat /etc/mailinabox.conf,实测全文,8 个键即全部):
STORAGE_USER=user-data
STORAGE_ROOT=/home/user-data
PRIMARY_HOSTNAME=box.example.com
PUBLIC_IP=182.54.113.29
PUBLIC_IPV6=
PRIVATE_IP=10.0.0.3
PRIVATE_IPV6=
MTA_STS_MODE=enforce
账号验证(sudo management/cli.py user,在 /root/mailinabox 下执行,实测):
me@example.com*
* 后缀表示该账号是管理员。面板登录:浏览器打开 https://<IP>/admin(或 DNS 生效后的 https://box.example.com/admin),用 me@example.com 登录,首次会提示证书告警,核对收尾输出中的指纹后继续即可。
六、常见故障与排障(实测实录)
以下 6 条全部来自本次实测中真实踩到并解决的故障,按踩坑顺序排列。
1. 安装脚本秒退:系统缺少 lsb_release
This script must be run on Ubuntu 22.04. It looks like you are running .
原因:极简系统镜像/某些 VPS 最小模板未预装 lsb-release,脚本判别系统版本的 lsb_release -d 拿不到发行版信息。解决:apt-get install -y lsb-release 后重跑。标准 Ubuntu Server 云镜像自带该包,一般不会遇到。
2. 预检拒绝:/tmp 挂载了 noexec
ERROR: Mail-in-a-Box has to have exec rights on /tmp, please mount /tmp with exec
原因:脚本要在 /tmp 下解包执行 Nextcloud 升级器等程序;不少服务器出于加固把 /tmp 挂成 noexec。解决:mount -o remount,exec /tmp(或修改 /etc/fstab 中 /tmp 的挂载选项后重新挂载),安装完成后再按需改回。
3. 预检拒绝:无法探测内网 IP
ERROR: I could not determine the IP or IPv6 address of the network interface
原因:脚本用 ip -4 -o route get 8.8.8.8 取默认路由源地址,极简镜像缺 iproute2 时 ip 命令不存在。解决:apt-get install -y iproute2 后重跑。
4. 预检拒绝:公网 IP 命中 Spamhaus 黑名单(真实踩中)
The IP address 182.54.113.29 is listed in the Spamhaus Block List.
DNS 侧取证(host 29.113.54.182.zen.spamhaus.org,实测):
29.113.54.182.zen.spamhaus.org has address 127.0.0.3
29.113.54.182.zen.spamhaus.org has address 127.0.0.11
127.0.0.3 表示该 IP 在 Spamhaus CSS(SBL 补充列表)中,脚本据此拒绝安装——这是 Mail-in-a-Box 保护发信信誉的机制,不是误报。两条路:
- 换 IP:向云厂商申请更换公网 IP,直到 Spamhaus 查询返回 NXDOMAIN(最干净的解法);
- 跳过检查强行装:
export SKIP_NETWORK_CHECKS=1后重跑。黑名单 IP 直接收发邮件会被大规模拒信,除非你确知平台方已提交除名申请,否则不建议。
另注意:若你的 DNS 指向 Google/114 等公共解析器,Spamhaus 会返回
127.255.255.x系列的策略应答,同样会被脚本当作"在黑名单"而中止——这是公共解析器限流机制导致的假阳性,可把本机 DNS 换成运营商递归或自建递归后再试。
5. 安装静默中断(exit 1 无任何报错):sshd 不可用(真实踩中,最深一坑)
症状:日志停在 Installing system packages... / Initializing system random number generator... 附近后整个安装消失,无任何错误输出。
原因:setup/system.sh 的防火墙段有一行 SSH_PORT=$(sshd -T ... | grep ... | tr ...),而脚本入口是 set -e + set -o pipefail——只要系统里没有 sshd 命令(openssh-server 未安装),这条管道就以 127 退出,整个脚本被 set -e 静默终止,什么都不打印。解决:apt-get install -y openssh-server 并确保 sshd 可运行(缺 /run/sshd 目录时 mkdir -p /run/sshd),重跑安装。
6. 建号接口 500:SSHFP 记录生成失败(真实踩中)
症状:安装走到 Okay. I'm about to set up ... for you 后无下文,management/cli.py user add ... 报 500 Internal Server Error。服务日志(journalctl -u mailinabox)实测关键行:
subprocess.CalledProcessError: Command '['ssh-keyscan', '-4', '-t', 'rsa,dsa,ecdsa,ed25519',
'-p', '22', 'localhost']' returned non-zero exit status 1.
原因:守护进程生成 DNS 的 SSHFP 记录时要对本机 22 端口做 ssh-keyscan,sshd 没在运行就抛异常,连带邮件账号创建接口 500(且账号可能已半写入,重试会提示地址已存在)。解决:systemctl start ssh 后重跑安装;如有半写入的残留账号,用 management/cli.py user remove <地址> 清掉再继续。
7. 重跑(幂等)时脚本在收尾提前退出:首用户检查的竞态(真实踩中)
症状:重跑 sudo mailinabox 时全部配置重写正常完成,但日志停在 Okay. I'm about to set up ... for you 后以退出码 1 结束;或更隐蔽——不带 EMAIL_ADDR 重跑后多出一个 me@<主机名> 的新账号。
原因:重跑会重启管理守护进程,收尾的首用户检查 if [ -z "$(management/cli.py user)" ] 恰逢守护进程重启窗口时拿到空结果,误判"尚无任何用户"而进入建号流程:带 EMAIL_ADDR 时对已存在账号重复建号报错退出;不带 EMAIL_ADDR 时(自动化模式默认值 me@<主机名> + 密码 12345678)直接建出新账号。解决:重跑前清空 EMAIL_ADDR/EMAIL_PW 并确认 systemctl is-active mailinabox;多出的账号用 management/cli.py user remove <地址> 清理。配置重写不受影响。
排障通用心法:Mail-in-a-Box 的脚本错误经常被
set -e静默吞掉。定位时用bash -x setup/start.sh重放可以拿到精确死亡点;装完后的运行期问题看journalctl -u mailinabox -n 50。
七、参考链接
- 官方安装指南(系统要求/FAQ):https://mailinabox.email/guide.html
- 官方仓库(setup/ 目录为安装脚本全部源码):https://github.com/mail-in-a-box/mailinabox
- 官方讨论论坛(排障求助):https://discourse.mailinabox.email/
- 本专栏认知篇:《Mail-in-a-Box v77 介绍与选型指南》——安装前的架构、特性与同类选型对比
- 本专栏配置篇:《Mail-in-a-Box v77 配置参数详解》——/etc/mailinabox.conf 全参数与 user-data 目录逐项拆解
- 本专栏管理篇:《Mail-in-a-Box v77 管理 API 使用详解》——装完后的 API/CLI 日常管理与自动化