Ubuntu 22.04 安装 Mail-in-a-Box 指南

在全新 Ubuntu 22.04 LTS 上用官方一键脚本部署 Mail-in-a-Box v77 的实测实录:交互三问、NONINTERACTIVE 自动化安装主线、安装后验证与 7 个真实排障坑。

Mail-in-a-Box邮件服务器Mail-in-a-Box2026/10/21

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/容器发行。脚本会做三件"重活",请确认机器是全新的再开始:

  1. 接管系统:改写 /etc/hostname、不足 2GB 内存时自动创建 1GB /swapfile、卸载 apache2 等冲突服务、把 /etc/resolv.conf 指向本机 DNS;
  2. 装全家桶:Postfix、Dovecot、nsd4、bind9、OpenDKIM、SpamAssassin、nginx、Roundcube、Nextcloud、Z-Push、管理守护进程等十几个组件一次装齐;
  3. 自签过渡证书:安装完成即有 HTTPS 面板可用(自签证书),域名 DNS 生效后自动换发 Let's Encrypt 证书。

交互式安装只问三个问题(邮箱地址、主机名、公网 IP),其余全部自动决策。同时官方脚本原生支持自动化安装(NONINTERACTIVE=1 环境变量,与官方 Vagrant 配置同款),本文实测即采用该方式,输出与交互式完全一致。

三、前置条件

  1. 系统:全新、独占的 Ubuntu 22.04 LTS,root 权限(脚本用 lsb_release 严格判别系统版本);
  2. 资源:内存 ≥ 512MB(低于 768MB 仅告警不拦截)、/tmp 未挂载为 noexec、x86_64 架构;
  3. 端口:25(SMTP)、53(DNS,nsd/bind9)、443(HTTPS)、465/587(SMTPS/Submission)、993(IMAPS)等需可绑定;云主机安全组需放行入站 25/53/80/443/465/587/993;
  4. 公网 IP:必须是非住宅网络;安装前建议到 Spamhaus 官网自查候选 IP 是否在黑名单(本站实测就真实命中了,见第六节);
  5. DNS 前提:建议让盒子接管域名 DNS(NS 记录指向盒子);不接管则需手工同步记录;
  6. 基础连通:能访问 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 脚本实测内容):

顺序对话框标题默认值本文输入说明
1Your Email Addressme@example.com(按主机名反推域名)me@example.com首个管理员邮箱,也是面板登录账号
2Primary Hostnamebox.example.com("box."+邮箱域名)回车确认邮件服务器对外的正式主机名
3Public 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 / [::]25Postfix SMTP
0.0.0.0 / [::]443nginx(面板/Webmail/Nextcloud)
0.0.0.0 / [::]465Postfix SMTPS
0.0.0.0 / [::]587Postfix Submission
0.0.0.0 / [::]993Dovecot IMAPS
内网 IP53nsd4 权威 DNS(对外)
127.0.0.153bind9 本地递归 DNS(对内)
127.0.0.1143Dovecot IMAP(仅本机,供 Roundcube 内部访问)
127.0.0.110222Mail-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。

七、参考链接

  1. 官方安装指南(系统要求/FAQ):https://mailinabox.email/guide.html
  2. 官方仓库(setup/ 目录为安装脚本全部源码):https://github.com/mail-in-a-box/mailinabox
  3. 官方讨论论坛(排障求助):https://discourse.mailinabox.email/
  4. 本专栏认知篇:《Mail-in-a-Box v77 介绍与选型指南》——安装前的架构、特性与同类选型对比
  5. 本专栏配置篇:《Mail-in-a-Box v77 配置参数详解》——/etc/mailinabox.conf 全参数与 user-data 目录逐项拆解
  6. 本专栏管理篇:《Mail-in-a-Box v77 管理 API 使用详解》——装完后的 API/CLI 日常管理与自动化