自建邮件服务器能提高隐私性和控制权。本文详细讲解如何从零开始使用 Docker Compose 部署一个功能完善的邮件服务器,涵盖 DNS 配置、SSL 证书生成、DKIM 设置及国内服务器 25 端口屏蔽的解决方案。
1. 环境准备
系统要求
• 操作系统:CentOS 7.9 或其他主流 Linux 发行版
• Docker:20.10.24 或更高
• Docker Compose:2.2.3 或更高
• 硬件配置:最低 2 核 CPU,1GB 内存
• 域名:一个有效的域名(如 example.com)
2. 安装 Docker 和 Docker Compose
安装 Docker
1. 更新系统包:
sudo yum update -y
2. 安装依赖项:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3. 添加 Docker 仓库并安装:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
4. 启动 Docker 并设置开机自启:
sudo systemctl start docker
sudo systemctl enable docker
5. 验证 Docker 安装:
docker --version
安装 Docker Compose
1. 下载并安装 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. 验证 Docker Compose 安装:
docker-compose --version
3. 配置 DNS 记录
DNS 记录说明
使用域名 example.com 和服务器 IP 地址 123.45.67.89,需要配置以下 DNS 记录:
1. A 记录:
• 主机名:@
• 值:123.45.67.89
2. MX 记录:
• 主机名:@
• 值:mail.example.com
• 优先级:10
3. SPF 记录:
• 主机名:@
• 值:v=spf1 ip4:123.45.67.89 -all
4. DKIM 记录:
• 主机名:default._domainkey
• 值:通过 DKIM 工具生成的公钥(详见后文)
5. DMARC 记录:
• 主机名:_dmarc
• 值:v=DMARC1; p=none; rua=mailto:admin@example.com
配置 DKIM(详细步骤)
1. 生成 DKIM 密钥
在 docker-mailserver 容器中执行以下命令生成 DKIM 密钥:
docker exec -it mailserver setup config dkim keysize 2048
生成的密钥文件会存储在 ./data/config/opendkim/keys/ 目录下。
2. 提取 DKIM 公钥
进入生成的密钥目录,找到 default.txt 文件并打开:
cat ./data/config/opendkim/keys/example.com/mail.txt
文件内容类似于:
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ojqOcyeDlOn6TcpXCsU92xul6d54wlx/UwPTuE0aywFc+ihyKGAm9D8nmroneN7gf82qTtDbJiHghzRlf6JdpR3kM4ipWKaNRSlUL/64HQqrMeEWx5ErpcgwrXxKWI/rcQ7Rjg2BliP6ayJiEflH0FOtxfgLHnYEcSKupmCV8znM4rZ/LHx9RDwc7o8jWujey6h9zrYPXyqim"
"obGSB0PZGNQhe7mWRefMraFGgnNq+PrtEnmaOFxH2rG1Qh2hhMkeqJsH56yx9f1mxWYTX7r9FtvweGRb+GJNfi6a4vpDrTCffxx6XvGrq032i7VqHpmiaUUuM3j2x1DwHrIbpWTQIDAQAB" ) ; ----- DKIM key mail for example.com
提取 p= 后的字符串(即公钥部分),用于添加到 DNS。
3. 添加 DKIM 到 DNS
在域名注册商的管理后台中,添加如下 TXT 记录:
• 主机名:mail._domainkey (按实际情况录入)
• 记录值:
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ojqOcyeDlOn6TcpXCsU92xul6d54wlx/UwPTuE0aywFc+ihyKGAm9D8nmroneN7gf82qTtDbJiHghzRlf6JdpR3kM4ipWKaNRSlUL/64HQqrMeEWx5ErpcgwrXxKWI/rcQ7Rjg2BliP6ayJiEflH0FOtxfgLHnYEcSKupmCV8znM4rZ/LHx9RDwc7o8jWujey6h9zrYPXyqimobGSB0PZGNQhe7mWRefMraFGgnNq+PrtEnmaOFxH2rG1Qh2hhMkeqJsH56yx9f1mxWYTX7r9FtvweGRb+GJNfi6a4vpDrTCffxx6XvGrq032i7VqHpmiaUUuM3j2x1DwHrIbpWTQIDAQAB
请仔细观察文件内容中"需要去除合并
4. 验证 DKIM 配置
使用在线工具(如 MXToolbox DKIM)验证 DKIM 是否生效。
4. 生成 SSL 证书
使用 Certbot 进行 DNS 验证
如果服务器无法开放 80 和 443 端口,推荐使用 DNS 验证生成证书。
1. 安装 Certbot:
sudo yum install -y certbot
2. 使用 DNS 验证生成证书:
certbot certonly --manual --preferred-challenges dns -d mail.example.com
3. 按提示添加 TXT 记录,例如:
• 记录名称:_acme-challenge.mail
• 记录值:Certbot 提供的随机字符串
4. 验证通过后,Certbot 会生成以下证书文件:
• /etc/letsencrypt/live/mail.example.com/fullchain.pem
• /etc/letsencrypt/live/mail.example.com/privkey.pem
5. 配置 Docker Compose 文件
创建 docker-compose.yml 文件,内容如下:
version: '3.8'
services:
mailserver:
image: mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail
domainname: example.com
env_file: mailserver.env
ports:
- "25:25" # SMTP (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead)
- "143:143" # IMAP4 (explicit TLS => STARTTLS)
- "465:465" # ESMTP (implicit TLS)
- "587:587" # ESMTP (explicit TLS => STARTTLS)
- "993:993" # IMAP4 (implicit TLS)
volumes:
- ./data/maildata:/var/mail
- ./data/mailstate:/var/mail-state
- ./data/config:/tmp/docker-mailserver
- /etc/letsencrypt/live/mail.example.com/fullchain.pem:/etc/ssl/certs/ssl-cert-snakeoil.pem:ro
- /etc/letsencrypt/live/mail.example.com/privkey.pem:/etc/ssl/private/ssl-cert-snakeoil.key:ro
restart: always
stop_grace_period: 1m
# Uncomment if using `ENABLE_FAIL2BAN=1`:
# cap_add:
# - NET_ADMIN
healthcheck:
test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
timeout: 3s
retries: 0
6. 配置环境变量文件
创建 .env-mailserver 文件,用于配置邮件服务器:
SSL_TYPE=manual
SSL_CERT_PATH=/etc/ssl/certs/ssl-cert-snakeoil.pem
SSL_KEY_PATH=/etc/ssl/private/ssl-cert-snakeoil.key
# 若你使用的服务器供应商禁用 25 端口 可配置以下操作
# 中继服务器配置
RELAY_HOST=smtp.qq.com
RELAY_PORT=465
RELAY_USER=your-email@qq.com
RELAY_PASSWORD=your-auth-code
# 启用额外功能
ENABLE_SPAMASSASSIN=1
ENABLE_CLAMAV=1
ENABLE_FAIL2BAN=1
7. 启动邮件服务器
1. 启动容器:
docker-compose up -d
2. 添加用户:
docker exec -it mailserver setup email add user@example.com
3. 测试邮件发送:
echo "Test Email" | mail -s "Hello" user@example.com
8. 自动更新证书
为了确保证书长期有效,可配置自动更新:
certbot renew --deploy-hook "docker restart mailserver"
将上述命令添加到 crontab 中,每月自动运行。
9. 总结
通过本教程,你可以成功部署一个功能完善、安全可靠的邮件服务器,并解决国内 25 端口屏蔽问题。本教程详细介绍了 DKIM 配置、DNS 设置、SSL 证书生成等关键步骤,适合初学者和有经验的开发者使用。