Maddy邮箱服务器踩过的那些坑
配置参照Maddy官方文档,Maddy DNS配置,Maddy仓库
以下是总结后的注意事项:
证书主机名不匹配
-
问题分析
日志显示证书的 Common Name (CN) 是mx1.example.org
,而连接的 SMTP 地址是smtp.example.org
,导致 TLS 主机名验证失败:TLS peer certificate passed CA verification, failed host verification (using host smtp.example.org to verify)
部分邮件客户端会严格校验证书主机名,若域名不匹配会拒绝连接,间接导致认证失败。
-
解决方案
为smtp.example.org
重新签发证书,确保证书包含以下 Subject Alternative Name (SAN):
nginxDNS:mx1.example.org, DNS:smtp.example.org
或直接使用
smtp.example.org
作为证书的 CN。
2. 客户端加密方式配置错误
- 问题现象
邮箱客户端可能默认尝试使用隐式 TLS(端口 465),而 Maddy 配置可能未启用该端口,或客户端未正确选择加密方式。 - 解决方案
-
检查 Maddy 的端口配置
确保 Maddy 监听 465 端口并启用隐式 TLS:
nginxsmtp tcp://0.0.0.0:465 { tls immediate auth ... }
-
邮箱客户端配置调整
在 邮箱客户端的 SMTP 设置中:- 服务器地址:
smtp.example.org
- 端口:465(SSL/TLS) 或 587(STARTTLS)
- 安全类型:SSL/TLS(端口 465)或 STARTTLS(端口 587)
- 服务器地址:
-
3. 客户端用户名格式问题
- 问题分析
虽然swaks
使用admin@example.org
作为用户名成功,但 邮箱客户端可能自动截断了域名部分(仅使用admin
),导致认证失败。 - 解决方案
强制 邮箱客户端使用完整邮箱地址作为用户名:- 在 邮箱客户端的 SMTP 设置中,用户名字段填写完整的
admin@example.org
。
- 在 邮箱客户端的 SMTP 设置中,用户名字段填写完整的
4. 防火墙或 Docker 端口映射
-
验证端口可达性
执行以下命令检查端口是否开放:telnet smtp.example.org 465 telnet smtp.example.org 587
若无响应,检查 Docker 运行命令是否映射了 465 和 587 端口:
docker run -p 25:25 -p 465:465 -p 587:587 ... maddy
同时检查服务器防火墙(如
ufw
)和云服务商安全组是否放行这些端口。
5. 查看 Maddy 日志
-
定位具体错误
运行以下命令查看实时日志,观察 QQ 邮箱连接时的报错:docker logs -f maddy-container-name
关注以下关键错误:
authentication failed
(认证参数不匹配)TLS handshake error
(证书问题)no auth mechanism
(认证机制不支持)
6. 测试其他邮件客户端
- 排除客户端兼容性问题
使用 Thunderbird 或 Outlook 配置同一邮箱,测试是否能正常发送邮件。- 若其他客户端正常,问题集中在 邮箱客户端 的特定行为(如密码策略、加密协商)。
- 若其他客户端也失败,需进一步检查 Maddy 的全局配置。
我的主要问题是证书主机名不匹配和端口未开放
解决方法也很简单邮件客户端的smtp地址填成与证书相关的即可
maddy不建议使用最新版(问题比较多)建议使用maddy0.7.1版本
其次是DNS的配置问题
一定严格按照 Maddy DNS配置 进行配置
之前的主要问题集中在roundcube不能登录
目前roundcube仍然不可登录(待研究)
但qq邮箱,网易邮箱,outlook邮箱客户端都可以登录
hostname 应设置为 MX 记录指向的子域,例如 mx1.example.org,而不是根域 example.org。
确保环境变量正确设置,并在配置文件中引用这些变量。
确认证书路径和文件名,确保它们与 hostname
匹配。
网络和防火墙设置:确保端口开放且无防火墙阻止。
DNS 设置:检查 MX、SPF 和 DKIM 记录是否正确。
认证问题:确保用户凭证正确且数据库中有记录。
日志分析:查看 Maddy 和系统日志获取详细错误信息。
邮件队列:检查是否有邮件积压未发送。
外部服务:检查是否被列入黑名单或被反垃圾邮件服务拦截。
客户端配置:确保客户端配置正确。
邮件内容:确保邮件内容符合规范。
使用下列代码查看mx记录是否正确
nslookup -type=mx example.org 8.8.8.8
验证时使用 swaks 发送测试邮件
swaks --to <接收者邮箱> --from <发送者邮箱> --server <服务器地址>:<服务器端口> --auth LOGIN --auth-user "<smtp账户一般为发送者邮箱>" --auth-password "<smtp密码一般为发送者邮箱密码>" --tls --h-Subject "Test email" --body "This is a test email."
解释每个参数
--to: 收件人的电子邮件地址。
--from: 发件人的电子邮件地址 。
--server: SMTP Submission 服务器的地址和端口。
--auth LOGIN: 使用 LOGIN 方法进行身份验证。
--auth-user: 用于身份验证的用户名(发件人的电子邮件地址)。
--auth-password: 用于身份验证的密码。
--tls: 启用 TLS 加密。
--h-Subject: 邮件的主题(Test email)。
--body: 邮件的正文内容(This is a test email.)。
=== Trying 服务器地址:port...
=== Connected to 服务器地址.
<- 220 服务器地址 ESMTP Service Ready
EHLO example.com
250-Hello example.com
250-AUTH LOGIN
250-STARTTLS
...
AUTH LOGIN
334 VXNlcm5hbWU6
YWRtaWsfdsfdfcmnVzLmtn #base64加密
334 UGFzc3dvcmQ6
UGFzcfdsdsfxMjM= #base64加密
235 Authentication successful
MAIL FROM:<sender@example.com>
250 OK
RCPT TO:<recipient@validdomain.com>
250 OK
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Subject: Test email
This is a test email.
.
250 OK: queued as 12345
QUIT
221 Goodbye
=== Connection closed with remote host.