小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2025-01-30 / 22 阅读
0
0

Maddy邮箱服务器踩过的那些坑

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):
    nginx

    DNS:mx1.example.org, DNS:smtp.example.org
    

    或直接使用 smtp.example.org 作为证书的 CN。


2. 客户端加密方式配置错误

  • 问题现象
    邮箱客户端可能默认尝试使用隐式 TLS(端口 465),而 Maddy 配置可能未启用该端口,或客户端未正确选择加密方式。
  • 解决方案
    • 检查 Maddy 的端口配置
      确保 Maddy 监听 465 端口并启用隐式 TLS:
      nginx

      smtp 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

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.

评论