自建邮件服务器:Docker Mailserver 从安装到基本使用
自建邮件服务器一直被认为是件麻烦事——复杂的 Postfix 配置、Dovecot 集成、反垃圾邮件,每一项都够喝一壶。docker-mailserver 把这一切打包成一个 Docker 镜像,开箱即用地提供了完整的邮件栈。本文从零开始,带你完成从域名准备到收发邮件的全过程。
docker-mailserver 是什么
docker-mailserver 是一个生产就绪的全功能邮件服务器 Docker 镜像,它将 Postfix(SMTP)、Dovecot(IMAP/POP3)、Rspamd(反垃圾邮件)、ClamAV(反病毒)、OpenDKIM、OpenDMARC 等十多个组件整合到一个容器中。项目的核心理念是"配置即文件"——全部使用纯文本配置文件,不依赖 SQL 数据库,方便版本管理和迁移。镜像基于 Debian,由社区维护,在 Docker Hub 上有超过千万次下载。
对个人站长和小团队来说,这意味着可以用一套 docker-compose.yml 在几分钟内部署一个完整的邮件系统,无需逐个安装和配置各个组件。
部署前的准备工作
在拉取镜像之前,有三件事需要先搞定。第一,一台有公网 IP 的服务器。邮件服务器要求 IP 地址固定,否则 DNS 缓存会导致收信不稳定。云服务商的 VPS 是最常见的选择。第二,一个属于你的域名。邮件地址通常是 user@your-domain.com 的形式,你需要能够管理该域名的 DNS 记录。第三,服务器的 25、465、587(SMTP)和 993(IMAP)端口需要开放,大多数云厂商默认屏蔽 25 端口,需要在控制台提交工单申请解封。
此外还需要配置反向 DNS(PTR 记录),即让 IP 地址反向解析到你邮件服务器的主机名。这需要向云服务商提交申请,多数厂商在控制台提供了 PTR 设置入口。没有正确 PTR 记录的服务器发出的邮件很容易被对方拒收。
DNS 记录配置
邮件服务器能否正常工作,DNS 配置是关键。假设你的域名是 example.com,邮件服务器主机名为 mail.example.com,需要设置以下几类 DNS 记录。MX 记录告诉全世界 example.com 的邮件由 mail.example.com 处理:example.com MX 10 mail.example.com。A 记录将 mail.example.com 指向服务器 IP:mail.example.com A 11.22.33.44。SPF 记录声明哪些服务器有权为你的域名发信:example.com TXT v=spf1 mx -all。DKIM 记录为发出的邮件附加数字签名,这是提升投递率的重要手段,配置稍后会详细说明。DMARC 记录告诉接收方如何处理未通过 SPF 或 DKIM 校验的邮件:_dmarc.example.com TXT v=DMARC1; p=quarantine; adkim=s; aspf=s。
配置完成后可以用 dig 命令验证:dig @1.1.1.1 MX example.com 应该返回 mail.example.com。
使用 Docker Compose 部署
docker-mailserver 官方推荐使用 Docker Compose 部署。首先获取官方提供的 compose.yaml 和 mailserver.env 模板文件:
DMS_GITHUB_URL="https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master"
wget ${DMS_GITHUB_URL}/compose.yaml
wget ${DMS_GITHUB_URL}/mailserver.env
compose.yaml 的核心配置如下。将 hostname 改为你的邮件服务器域名,按需启用 Rspamd、ClamAV 和 Fail2ban。几个关键目录卷挂载分别是:mail-data 存储邮件、mail-state 保存运行时状态、config 目录放置自定义配置文件。启动容器后,首次启动会在两分钟后自动关闭,需要在窗口期内创建第一个邮箱账户。
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail.example.com
ports:
- "25:25"
- "465:465"
- "587:587"
- "993:993"
volumes:
- ./docker-data/dms/mail-data/:/var/mail/
- ./docker-data/dms/mail-state/:/var/mail-state/
- ./docker-data/dms/mail-logs/:/var/log/mail/
- ./docker-data/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
environment:
- ENABLE_RSPAMD=1
- ENABLE_CLAMAV=1
- ENABLE_FAIL2BAN=1
cap_add:
- NET_ADMIN
restart: always
启动命令用 docker compose up -d,不要用 docker compose start/stop,后者无法正确清理容器状态。
命令行创建邮箱账户
容器启动后首先需要创建邮箱账户。所有操作通过 setup 命令在容器内完成:
# 创建邮箱账户(会提示输入密码)
docker exec -ti mailserver setup email add user@example.com
# 创建时直接指定密码(适用于自动化脚本)
docker exec -ti mailserver setup email add user@example.com password123
交互式创建会提示两次输入密码,不显示明文。创建成功后可以用 list 命令确认:
docker exec -ti mailserver setup email list
输出类似:
* user@example.com (10/10 quotas used)
其他常用账户管理命令:
# 删除账户
docker exec -ti mailserver setup email del user@example.com
# 修改密码
docker exec -ti mailserver setup email upd user@example.com newpassword
# 查看所有命令帮助
docker exec -ti mailserver setup help
```text
### 配置别名
别名用于将发往一个地址的邮件转发到另一个地址。postmaster 别名是行业惯例,建议必须配置:
```bash
# 将 postmaster@example.com 的邮件转发到你的实际邮箱
docker exec -ti mailserver setup alias add postmaster@example.com user@example.com
# 查看所有别名
docker exec -ti mailserver setup alias list
# 删除别名
docker exec -ti mailserver setup alias del postmaster@example.com
别名也可以实现一对多转发——将同一个地址的邮件分发给多个收件人。
DKIM 配置
DKIM(DomainKeys Identified Mail)为发出的每封邮件附加数字签名,接收方通过 DNS 查询公钥验证邮件真实性。没有 DKIM 的邮件很容易被归入垃圾箱。
docker-mailserver 内置了 DKIM 密钥生成工具:
docker exec -ti mailserver setup config dkim
执行后会在配置目录生成密钥文件,路径类似 docker-data/dms/config/opendkim/keys/example.com/mail.txt。打开该文件,内容是一段 TXT 记录,将其添加到域名的 DNS 中:
mail._domainkey IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
添加后用 dig 验证是否生效:
dig @1.1.1.1 TXT mail._domainkey.example.com
使用邮件客户端收发邮件
账户创建完成后,就可以用标准的邮件客户端(如 Thunderbird、Apple Mail、Outlook)连接服务器了。docker-mailserver 使用标准协议,客户端配置如下:
| 协议 | 服务器地址 | 端口 | 加密 | 认证 |
|---|---|---|---|---|
| SMTP(发信) | mail.example.com | 587 | STARTTLS | 普通密码 |
| SMTP(发信,备用) | mail.example.com | 465 | SSL/TLS | 普通密码 |
| IMAP(收信) | mail.example.com | 993 | SSL/TLS | 普通密码 |
| POP3(收信,可选) | mail.example.com | 995 | SSL/TLS | 普通密码 |
客户端配置步骤:
Thunderbird:选择"添加账户"→"IMAP(手动配置)",填入全名、邮箱地址和密码,服务器主机名填写你的邮件服务器域名(如 mail.example.com),IMAP 端口 993 SSL/TLS,SMTP 端口 587 STARTTLS。
Apple Mail:选择"添加其他邮件账户",填入名称、邮箱地址和密码,账户类型选 IMAP,收件服务器填 mail.example.com,发件服务器填 mail.example.com。
移动端手机:配置方式与桌面客户端一致,注意 SSL 证书域名必须与服务器主机名匹配,否则客户端会提示证书警告。
首次配置完成后,发送一封测试邮件到自己的 Gmail 地址确认收发正常。
命令行查看邮件
在没有图形客户端的环境下,可以通过命令行直接查收邮件。以下是几种常用方式。
使用 Swaks 命令行发送邮件
Swaks(Swiss Army Knife for SMTP)是最常用的命令行 SMTP 测试工具,直接安装在宿主机上:
# 安装 swaks
apt install swaks # Debian/Ubuntu
brew install swaks # macOS
# 发送测试邮件
swaks --to recipient@gmail.com \
--from user@example.com \
--server mail.example.com \
--port 587 \
--tls \
--auth LOGIN \
--auth-user user@example.com \
--header "Subject: 测试邮件" \
--body "这是来自 docker-mailserver 的测试邮件。"
使用 OpenSSL 直连 IMAP 查看邮件
通过 openssl 直接连接到 IMAP 端口,手动执行 IMAP 协议命令查看邮件:
# 连接 IMAP 服务器
openssl s_client -connect mail.example.com:993 -crlf
# 登录(替换为实际邮箱和密码)
a1 LOGIN user@example.com password123
# 查看邮箱列表
a2 LIST "" "*"
# 选择收件箱
a3 SELECT INBOX
# 查看最新一封邮件
a4 FETCH 1 BODY[]
# 查看邮件头
a5 FETCH 1 BODY[HEADER]
# 退出
a6 LOGOUT
进入容器内部查看原始邮件
docker-mailserver 使用 Dovecot 存储邮件,原始邮件文件直接保存在挂载的 mail-data 目录中:
# 进入容器
docker exec -it mailserver bash
# 邮件存储在 /var/mail/ 目录下
ls /var/mail/example.com/user/
# 直接用 cat 查看原始邮件文件
cat /var/mail/example.com/user/new/1234567890.eml
这种方式适合快速排错,确认邮件是否已成功投递到服务器。
使用 Telnet 测试 SMTP 发信
telnet mail.example.com 587
EHLO test.com
AUTH LOGIN
# Base64 编码的用户名
# Base64 编码的密码
MAIL FROM:<user@example.com>
RCPT TO:<recipient@gmail.com>
DATA
Subject: 测试邮件
这是一封测试邮件。
.
QUIT
这些命令行工具在部署初期排查问题时非常有用,可以快速定位是 DNS 配置问题、认证问题还是网络连通性问题。
TLS 证书与安全加固
邮件传输加密是必须的。docker-mailserver 支持 Let's Encrypt 自动证书、手动证书和自签名证书三种方式。对于有公网域名的用户,推荐使用 Let's Encrypt。将证书文件放在 config/ssl/ 目录下,命名格式为 <hostname>-key.pem 和 <hostname>-fullchain.pem,然后在 mailserver.env 或 compose.yaml 的环境变量中设置 SSL_TYPE=letsencrypt。如果已有 Certbot 或其他 ACME 客户端生成的证书,可以通过卷挂载让容器读取。
安全方面,启用 Rspamd 作为反垃圾邮件引擎比传统的 SpamAssassin 性能更好、规则更新更及时。Fail2ban 可以防止暴力破解,但需要挂载 NET_ADMIN 能力。对于仅用于中继转发的场景(不存储用户邮箱),建议关闭 ClamAV 和 Rspamd 以降低资源消耗。
测试邮件收发与常见问题
部署完成后需要验证邮件服务器是否正常工作。最简单的方法是用 Gmail 或 Outlook 互相发送测试邮件。也可以使用 mail-tester.com 获取详细的投递质量报告,它会检查 SPF、DKIM、DMARC、反向 DNS 等配置是否完整。mx-toolbox.com 提供了 SMTP 端口检测功能,可以确认 25、465、587 端口是否可以从公网访问。
常见问题方面:如果发出的邮件被对方标记为垃圾邮件,首先检查 PTR 记录是否配置正确。如果 25 端口不通,大概率是云厂商默认屏蔽,需要提交工单解封。如果收到 "Sender address rejected: not owned by user" 错误,说明 SPF 记录或 SPOOF_PROTECTION 配置需要调整。docker-mailserver 的日志可以通过 docker logs mailserver 查看,大部分配置问题都能在日志中找到线索。
docker-mailserver 大幅降低了自建邮件服务器的门槛,将原本需要手动集成的 Postfix、Dovecot、Rspamd 等组件打包成一个开箱即用的 Docker 镜像。虽然邮件服务器本身的 DNS 配置和端口申请仍然需要一些前置工作,但一旦跑起来,后续的账户管理、别名转发和 DKIM 配置都非常直观。对于希望拥有自主可控邮箱的个人站长或小团队来说,这是一个性价比极高的方案。