🔗原文链接:wmwm.me/article/456…
前提
邮箱服务器域名需要https证书,certbot证书申请教程
DNS设置
在DNS中,TTL是"Time to Live"的缩写,表示DNS记录在网络上的生存时间。TTL是一个整数值,以秒为单位。当DNS客户端查询某个域名的DNS记录时,它会向DNS服务器发送查询请求。DNS服务器会返回相应的DNS记录,并在响应中包含该记录的TTL值。客户端收到响应后,会使用该记录的TTL值来确定该记录可以在本地缓存多长时间,超过该时间后,客户端会去重新查询DNS服务器以获取最新的DNS记录。邮件服务器没有完全搭建好的情况下,TTL不要设置太长时间,出现问题不太好调试
DNS设置好后,在你的个人电脑上验证下
# 验证MX记录
$ dig +short MX example.com
mail.example.com
# 验证A记录
$ dig +short A mail.example.com
11.22.33.44
# 验证rDNS(PTR)记录
$ dig +short -x 11.22.33.44
mail.example.com
也可以用在线网站验证
修改配置文件
访问github.com/docker-mail…,
找到docker-compose.yml和mailserver.env,将这两个文件下载到服务器,保存在同一个目录里
对docker-compose.yml文件进行两处修改
environment中添加环境变量SSL_TYPE=letsencrypt
把certbot申请的https证书挂载到docker-mailserver容器中
来自docker mailserver官方文档的一段话
etc/letsencrypt/live
stores provisioned certificates in individual folders named by their FQDN.Make sure that the entire folder is mounted to docker-mailserver as there are typically symlinks from
/etc/letsencrypt/live/mail.example.com
to/etc/letsencrypt/archive
.
意思是要将整个cert目录挂载到容器中,避免出现软引用问题导致证书找不到
修改后的docker-compose.yml文件如下所示
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:latest
container_name: mailserver
# Provide the FQDN of your mail server here (Your DNS MX record should point to this value)
hostname:
env_file: mailserver.env
# environment的优先级更高,会覆盖.env文件中相同的环境变量
environment:
- SSL_TYPE=letsencrypt
- TZ=Asia/Shanghai
# More information about the mail-server ports:
# https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/
# To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
ports:
- "25:25" # SMTP (explicit TLS => STARTTLS)
- "143:143" # IMAP4 (explicit TLS => STARTTLS)
- "465:465" # ESMTP (implicit TLS)
- "587:587" # ESMTP (explicit TLS => STARTTLS)
- "993:993" # IMAP4 (implicit TLS)
volumes:
- :/etc/letsencrypt
- $PWD/volume/mail-data/:/var/mail/
- $PWD/volume/dms/mail-state/:/var/mail-state/
- $PWD/volume/dms/mail-logs/:/var/log/mail/
- $PWD/volume/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime: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
运行Docker Mailserver
# 调试阶段,建议不要添加 -d 参数,看日志比较麻烦
docker compose up
运行后,有三件重要的事情要做
# 邮箱前缀随意,不一定非要是admin
docker exec -it setup email add admin@example.com
docker exec -it setup alias add postmaster@example.com admin@example.com
postmaster账号在Docker-Mailserver中扮演着非常重要的角色,它可以帮助管理员及时了解邮件服务器的运行情况,并进行相应的处理和调整。
主要有这么几个用途:
用于接收系统警告和错误信息 用于接收未能送达的邮件 用于接收管理员通知和系统警报
# 在服务器上运行以下代码
docker exec openssl s_client
-connect 0.0.0.0:25
-starttls smtp
-CApath /etc/ssl/certs/
或者可以在线验证:www.checktls.com/TestReceive…
邮件安全(非常重要)
DNS添加DKIM记录
DKIM(DomainKeys Identified Mail)是一种邮件验证技术,它可以防止电子邮件被伪造和篡改。DKIM将邮件的头部和正文内容进行加密,并生成一个数字签名,这个数字签名可以验证邮件是否真的来自于发送者所声明的域名,以及邮件是否在传输过程中被篡改了。
输入以下命令,生成DKIM密钥,然后重新启动docker-mailserver
docker exec -it mailserver setup config dkim
进入volume挂载路径./dms/config/opendkim/keys/
,可以看到mail.private和mail.txt两个文件,将mail.txt上传到cloudflare的DNS记录中
DNS添加SPF记录
SPF(Sender Policy Framework)是一种用于验证发件人身份的技术,它可以指定哪些IP地址可以用于发送特定域名的邮件。
# 给domain.com这个邮件域域设置一条TXT记录,TTL设置时间短一点
v=spf1 a mx ip4:108.182.201.242 -all
v=spf1
表示这是 SPF记录的版本号,目前只有一个版本a
表示授权由域名对应的A记录中列出的IP地址发送邮件mx
表示授权由域名对应的MX记录中列出的IP地址发送邮件ip4:108.182.201.242
表示授权指定的IPv4地址发送邮件- SoftFail和HardFail是两种策略,用于指定未经授权的发件人邮件如何处理
~all
宽容策略。如果发件人的IP地址不在SPF记录中指定的允许列表中,那么收件方的邮件服务器不会拒绝该邮件,而是将该邮件标记为“软失败”,并将其放入接收方的垃圾邮件文件夹或者标记为垃圾邮件。-all
严格策略。如果发件人的IP地址不在SPF记录中指定的允许列表中,那么收件方的邮件服务器会拒绝该邮件,并将其退回给发件人或者直接删除
更多的SPF语法规则在这里www.open-spf.org/SPF_Record_…
DNS添加DMARC记录
DMARC(Domain-based Message Authentication, Reporting, and Conformance)是一种邮件验证技术,它可以帮助域名所有者控制其域名下的邮件发送,防止电子邮件被伪造和滥用。DMARC是SPF和DKIM的补充,可以对SPF和DKIM的验证结果进行汇总和分析,并指定如何处理未经验证或验证失败的邮件。
rua
和ruf
的邮箱地址要正确,用于接收邮件头和邮件体等相信信息以及邮件被拒绝的原因,并进行必要的调整发送/接收邮件
Docker Mailserver没有提供webui,因此发送邮件和接收邮件要借助第三方网站。你可以登录163邮箱、qq邮箱或者gmail邮箱,任何邮箱网站都可以,使用SMTP连接到你的服务器,连接成功后就可以发送邮件。接收邮件使用IMAP协议或者POP3协议
Docker Mailserver默认不启用POP3,需要将端口110(POP3)或995(POP3 TLS)和环境变量ENABLE_POP3添加到docker-compose.yml
mailserver:
ports:
- "25:25" # SMTP (explicit TLS => STARTTLS)
- "143:143" # IMAP4 (explicit TLS => STARTTLS)
- "465:465" # ESMTP (implicit TLS)
- "587:587" # ESMTP (explicit TLS => STARTTLS)
- "993:993" # IMAP4 (implicit TLS)
- "110:110" # POP3
- "995:995" # POP3 (with TLS)
environment:
- ENABLE_POP3=1
重启才能生效,检查pop3端口有没有打开
# 显示协议名
lsof -i | grep LISTEN
# 显示端口号
lsof -i -n -P | grep LISTEN
也可以用代码发邮件
- 如何使用Python发送电子邮件
❗邮件发送成功后,邮件服务器不会保存邮件的副本。如果你有这个需要的话,发送邮件时请一定"密码抄送"给你的备份邮件
邮件健康值检测
www.mail-tester.com/
邮件发送失败
优先检查DMARC记录中RUA
和RUF
填写的邮箱地址,以及postmaster@example.com账号的alia别名。设置无误的情况下,你会在你的邮箱中收到"邮件发送失败"的提醒,可以快读定位问题
其他可能的原因
常用命令
- 查看用户列表
docker exec -it mailserver setup email list
- 添加用户
docker exec -it mailserver setup email add [] # 比如 docker exec -it mailserver setup email add xxx@domain.com "password123"
- 修改邮箱账户的密码
docker exec -it mailserver setup email update [] # 比如 docker exec -it mailserver setup email update admin@domain.com "password123"
- setup命令还有一些其他功能
# 查看setup命令帮助 docker exec -it mailserver setup
docker-compose.yml环境变量
ENABLE_CLAMAV
病毒扫描。默认关闭。会占用大量的服务器资源,默认关闭。0:关闭 1:开启ENABLE_FAIL2BAN
封锁尝试暴力破解的IP地址。默认关闭。0:关闭 1:开启
如果启用 Fail2Ban,请不要忘记将以下行添加到 docker-compose.yml:cap_add: - NET_ADMIN
SPOOF_PROTECTION
用户只能发送自己的邮件,避免发件人地址伪造,默认关闭(Each user only send with his own or his alias addresses) 0:关闭 1:开启