Mailu 是一个“全家桶”式的邮件服务器方案:SMTP/IMAP、反垃圾、Webmail、管理后台都给你打包好了。本文用 Docker Compose 从 0 在一台 VPS 上搭建可用的 Mailu,并把 DNS 记录证书端口/反向代理冲突投递成功率(PTR/反向解析) 这些容易踩坑的点一次讲清。

0. 前置准备(别跳过)

  • 一台干净的 VPS(建议 Debian 12/13 / Ubuntu 22.04+)。
  • 一个域名:*你的主域名*(示例:example.com)。
  • 一个邮件主机名(MX 指向它):*你的邮件主机名*(示例:mx.example.com)。
  • 服务器公网 IP:*你的服务器公网IP*
  • 重要:最好能设置 PTR(反向解析)把 IP 指回 *你的邮件主机名*,否则很多收件方会降权甚至拒收。


1. 规划:端口、主机名、证书模式

1.1 邮件常用端口(建议全部开放)

  • 25/tcp:SMTP(服务器间投递)
  • 465/tcp:SMTPS(客户端提交,隐式 TLS)
  • 587/tcp:SMTP Submission(客户端提交,STARTTLS)
  • 143/tcp:IMAP(STARTTLS)
  • 993/tcp:IMAPS(隐式 TLS)
  • 4190/tcp:Sieve(邮件过滤规则)
  • 80/443:Web 管理后台 / Webmail(以及 Let's Encrypt 校验)

如果你只想给自己用,理论上可以不开放 110/995(POP3),一般也不建议开。

1.2 证书(TLS)怎么选

  • 推荐:让 Mailu 自己申请 Let's Encrypt(简单直接)。要求:80/443 能从公网直连到 Mailu 前端容器。
  • 如果你的服务器上已经有 Nginx/Apache 占用 80/443:要么把网站迁到反代到 Mailu(或改端口),要么改用“外置证书”模式(见后文“端口冲突/反向代理”)。


2. 安装 Docker 与 Docker Compose

下面以 Debian 为例,其他发行版按官方文档调整即可。

# 更新系统
sudo apt update
sudo apt -y upgrade

# 安装 Docker
sudo apt -y install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" | 
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证
docker --version
docker compose version


3. 用 Mailu 向导生成配置

Mailu 官方提供配置向导,会输出 docker-compose.ymlmailu.env。你可以在浏览器里用向导生成,也可以参考本文直接写。

3.1 目录结构(建议)

sudo mkdir -p /mailu
cd /mailu

3.2 核心配置(mailu.env 示例,关键项解释)

下面是常用关键项(示例值都请替换为你自己的)。

# /mailu/mailu.env
DOMAIN=*你的主域名*                 # 例如 example.com
HOSTNAMES=*你的邮件主机名*          # 例如 mx.example.com(也可逗号分隔多个)
POSTMASTER=*你的postmaster用户名*   # 例如 postmaster 或 admin

# 让 Mailu 自己申请 Let's Encrypt
TLS_FLAVOR=letsencrypt

# Web 路径(默认就挺好)
WEB_ADMIN=/admin
WEB_WEBMAIL=/webmail
WEBROOT_REDIRECT=/webmail

# 时区
TZ=Asia/Shanghai

# 初始化管理员(首次启动时生效)
INITIAL_ADMIN_DOMAIN=*你的主域名*
INITIAL_ADMIN_ACCOUNT=*你的管理员用户名*
INITIAL_ADMIN_PW=*请设置一个强密码*

提示:HOSTNAMES 里最重要的是放你的邮件主机名(MX 指向它)。如果你把博客/其他站点也放在同一台机子上,不要随意把无关域名加进来,避免证书/路由变复杂。

3.3 docker-compose.yml(简化示例)

Mailu 的 compose 会包含前端(nginx)、admin、postfix、dovecot、rspamd、redis 等。最关键的是 front 服务的端口映射。

services:
  front:
    image: ghcr.io/mailu/nginx:2024.06
    restart: always
    env_file: mailu.env
    ports:
      - "0.0.0.0:80:80"
      - "0.0.0.0:443:443"
      - "0.0.0.0:25:25"
      - "0.0.0.0:465:465"
      - "0.0.0.0:587:587"
      - "0.0.0.0:143:143"
      - "0.0.0.0:993:993"
      - "0.0.0.0:4190:4190"
    volumes:
      - "/mailu/certs:/certs"
      - "/mailu/overrides/nginx:/overrides:ro"

  admin:
    image: ghcr.io/mailu/admin:2024.06
    restart: always
    env_file: mailu.env
    volumes:
      - "/mailu/data:/data"
      - "/mailu/dkim:/dkim"

  imap:
    image: ghcr.io/mailu/dovecot:2024.06
    restart: always
    env_file: mailu.env
    volumes:
      - "/mailu/mail:/mail"

  smtp:
    image: ghcr.io/mailu/postfix:2024.06
    restart: always
    env_file: mailu.env
    volumes:
      - "/mailu/mailqueue:/queue"

  antispam:
    image: ghcr.io/mailu/rspamd:2024.06
    restart: always
    env_file: mailu.env
    volumes:
      - "/mailu/filter:/var/lib/rspamd"


4. 防火墙与系统参数

如果你用的是 ufw

sudo apt -y install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH
sudo ufw allow 22/tcp

# Web + Mail
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 25/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 143/tcp
sudo ufw allow 993/tcp
sudo ufw allow 4190/tcp

sudo ufw enable
sudo ufw status

注意:有些云厂商会在“安全组”层面也挡端口,记得双端都开。


5. DNS 记录(决定你能不能稳定收发)

5.1 A / AAAA

mx    IN A     *你的服务器公网IP*
; 可选:如果有 IPv6
mx    IN AAAA  *你的服务器公网IPv6*

5.2 MX

@     IN MX 10 mx.*你的主域名*.

5.3 SPF(TXT)

@     IN TXT "v=spf1 mx ~all"

5.4 DKIM(TXT)

Mailu 启动后会生成 DKIM 密钥,你需要把公钥写进 DNS。一般记录长这样:

dkim._domainkey  IN TXT "v=DKIM1; k=rsa; p=*这里粘贴Mailu生成的公钥*"

5.5 DMARC(TXT)

_dmarc  IN TXT "v=DMARC1; p=quarantine; rua=mailto:*你的汇总报告邮箱*; ruf=mailto:*你的取证报告邮箱*; fo=1"

5.6 PTR(反向解析,强烈建议)

到你的 VPS/云厂商控制台把 *你的服务器公网IP* 的 PTR 设置为 *你的邮件主机名*(例如 mx.example.com)。这是提升投递成功率最划算的一步。


6. 启动 Mailu

cd /mailu

# 启动
docker compose up -d

# 看状态
docker compose ps

# 查看日志(前端)
docker logs -n 200 mailu-front-1

第一次启动时会自动初始化管理员。稍等 1~2 分钟后访问:

  • 管理后台:https://*你的邮件主机名*/admin
  • Webmail:https://*你的邮件主机名*/webmail


7. 从后台创建邮箱与别名

  1. 登录管理后台。
  2. 创建一个用户:user@*你的主域名*,设置密码。
  3. 如需转发/别名,创建 alias(比如 hi@*你的主域名* 指向你的主邮箱)。


8. 客户端配置(IMAP/SMTP)

以常见邮箱客户端为例:

  • IMAP 服务器:*你的邮件主机名*,端口 993(SSL/TLS)
  • SMTP 服务器:*你的邮件主机名*,端口 587(STARTTLS)或 465(SSL/TLS)
  • 用户名:完整邮箱地址(如 user@*你的主域名*
  • 密码:你在后台设置的密码


9. 常见坑与排查思路

9.1 25 端口被封

  • 很多云厂商默认封 25(出站/入站)。如果入站 25 被封,别人无法投递到你;如果出站 25 被封,你发信会失败。
  • 解决:申请解封、换 provider,或用中继(SMTP relay)。

9.2 80/443 端口冲突(同机部署网站/博客)

Mailu 的 front 默认要占用 80/443(申请证书 + 提供 web)。如果你的服务器上已经有 Nginx/Apache:你有三种典型方案:

  • 方案 A:把网站迁移到另外的反向代理里,让 Mailu front 继续直占 80/443(最省事)。
  • 方案 B:Mailu front 只监听本地端口(如 127.0.0.1:8080/8443),由你自己的 Nginx 统一对外反代;同时证书也由你自己的 Nginx/ACME 来管理(Mailu 改用外置证书模式)。
  • 方案 C:给邮件系统单独一张公网 IP,让 Mailu 独占 80/443(如果你有多 IP)。

9.3 SPF/DKIM/DMARC 没配好,进垃圾箱

  • SPF:至少要包含 mxip4
  • DKIM:确保 DNS 里那条 TXT 没断行/没漏引号。
  • DMARC:先用 p=none 观察报告,再逐步收紧到 quarantine/reject

9.4 反向解析(PTR)不匹配

PTR 最好指向你的邮件主机名,并且该主机名正向解析回同一个 IP(即正反一致)。否则一些大厂会直接给你“高风险”标签。


10. 升级与备份建议

  • 升级:docker compose pull && docker compose up -d,升级前建议先备份卷目录。
  • 备份:至少备份 /mailu/data/mailu/mail/mailu/dkim/mailu/certs(如果你自己管理证书)。
  • 监控:关注磁盘(邮件很吃盘),以及 mailu-front / postfix / dovecot 日志。

如果你准备把 Mailu 和你现有的网站(例如博客)放在同一台机器上,建议一开始就把“端口占用”和“证书归属”规划清楚,后面会省很多折腾。

标签: 运维, 教程

添加新评论