You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器中Sendmail通过587端口SMTP中继临时认证失败问题

排查Docker中sendmail发送邮件的AUTH失败问题

嘿,我来帮你捋一捋这个Docker里sendmail发邮件的坑!你遇到的情况有点矛盾——sendmail说“Message accepted for delivery”但又提示临时AUTH失败,而且Mailgun那边完全没记录,说明sendmail根本没成功连到Mailgun的SMTP服务器,大概率是配置没生效或者容器环境的问题,咱们一步步排查:

1. 确认sendmail的SMTP中继配置是否真的生效

Docker容器里的配置很容易因为临时文件系统丢失,所以得确保你的配置步骤是正确的:

  • 检查/etc/mail/authinfo文件内容,必须准确对应Mailgun的凭据:
    AuthInfo:smtp.mailgun.org "U:postmaster@你的域名.com" "P:你的Mailgun密码" "M:PLAIN"
    
  • 一定要生成哈希认证文件,不然sendmail读不了明文配置:
    makemap hash /etc/mail/authinfo < /etc/mail/authinfo
    
    注意:这个命令必须在容器启动时执行(比如写在Dockerfile的RUN指令里,或者启动脚本里),不然容器重启后配置就没了。
  • 检查sendmail.mc里的中继配置是否正确添加:
    define(`SMART_HOST',`smtp.mailgun.org')dnl
    define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
    define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
    define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    FEATURE(`authinfo',`hash -o /etc/mail/authinfo.db')dnl
    
    然后重新生成sendmail的配置文件:
    m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
    
    同样,这一步也要在容器启动时执行,确保配置被加载。

2. 检查容器的网络连通性

Mailgun的SMTP服务器连不上的话,再正确的配置也白搭:

  • 在容器里测试端口连通性:
    telnet smtp.mailgun.org 587
    
    如果连接失败,说明容器的网络有问题——可能是宿主机的防火墙挡住了587端口,或者Docker的网络模式(比如bridge)有出站限制,甚至是你的云服务商禁用了SMTP出站流量(虽然587一般没问题,但还是要确认)。
  • 也可以用ping测试域名解析:
    ping smtp.mailgun.org
    
    如果解析失败,说明容器的DNS配置有问题,可以试试在Docker run命令里指定--dns 8.8.8.8

3. 查看sendmail的详细日志,抓具体错误

sendmail的“Temporary AUTH failure”太笼统,得看详细日志找原因:

  • 日志一般在/var/log/mail.log或者/var/log/mail.err,在容器里执行:
    tail -f /var/log/mail.log
    
    然后再尝试发邮件,看日志里的具体报错——比如是TLS握手失败?还是密码验证错误?或者是无法读取authinfo.db文件?
  • 如果是TLS相关错误,大概率是容器里缺少CA证书,安装ca-certificates包就行(Debian/Ubuntu:apt install ca-certificates),同时在sendmail.mc里添加CA证书路径配置:
    define(`confCACERT_PATH',`/etc/ssl/certs')dnl
    define(`confCACERT',`/etc/ssl/certs/ca-certificates.crt')dnl
    

4. 用其他SMTP工具测试,排除sendmail的问题

直接绕开sendmail,用swaks或者ssmtp测试Mailgun的SMTP服务:

  • 先在容器里安装swaks:
    apt install swaks
    
  • 然后执行测试命令:
    swaks --to 收件人邮箱@example.com --from 发件人邮箱@你的域名.com --server smtp.mailgun.org --port 587 --auth LOGIN --auth-user postmaster@你的域名.com --auth-password 你的Mailgun密码 --tls
    
    如果这个测试能成功发送邮件,说明Mailgun的凭据和网络都没问题,问题肯定出在sendmail的配置上;如果这个也失败,那就要再核对你的Mailgun凭据(比如是不是用户名写错了?或者密码有特殊字符在容器里转义了?)

5. 检查配置文件的权限

sendmail对权限很敏感,尤其是存储密码的authinfo.db

  • 确保文件权限是600,只有root能读:
    chmod 600 /etc/mail/authinfo.db
    
  • 如果是用非root用户运行sendmail,要确保该用户能读取配置文件(不过一般sendmail都是以root运行的)。

按照这个步骤排查,应该能定位到问题所在!

内容的提问来源于stack exchange,提问作者Spencer Williams

火山引擎 最新活动