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读不了明文配置:
注意:这个命令必须在容器启动时执行(比如写在Dockerfile的RUN指令里,或者启动脚本里),不然容器重启后配置就没了。makemap hash /etc/mail/authinfo < /etc/mail/authinfo - 检查
sendmail.mc里的中继配置是否正确添加:
然后重新生成sendmail的配置文件: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
同样,这一步也要在容器启动时执行,确保配置被加载。m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
2. 检查容器的网络连通性
Mailgun的SMTP服务器连不上的话,再正确的配置也白搭:
- 在容器里测试端口连通性:
如果连接失败,说明容器的网络有问题——可能是宿主机的防火墙挡住了587端口,或者Docker的网络模式(比如bridge)有出站限制,甚至是你的云服务商禁用了SMTP出站流量(虽然587一般没问题,但还是要确认)。telnet smtp.mailgun.org 587 - 也可以用ping测试域名解析:
如果解析失败,说明容器的DNS配置有问题,可以试试在Docker run命令里指定ping smtp.mailgun.org--dns 8.8.8.8。
3. 查看sendmail的详细日志,抓具体错误
sendmail的“Temporary AUTH failure”太笼统,得看详细日志找原因:
- 日志一般在
/var/log/mail.log或者/var/log/mail.err,在容器里执行:
然后再尝试发邮件,看日志里的具体报错——比如是TLS握手失败?还是密码验证错误?或者是无法读取authinfo.db文件?tail -f /var/log/mail.log - 如果是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 - 然后执行测试命令:
如果这个测试能成功发送邮件,说明Mailgun的凭据和网络都没问题,问题肯定出在sendmail的配置上;如果这个也失败,那就要再核对你的Mailgun凭据(比如是不是用户名写错了?或者密码有特殊字符在容器里转义了?)swaks --to 收件人邮箱@example.com --from 发件人邮箱@你的域名.com --server smtp.mailgun.org --port 587 --auth LOGIN --auth-user postmaster@你的域名.com --auth-password 你的Mailgun密码 --tls
5. 检查配置文件的权限
sendmail对权限很敏感,尤其是存储密码的authinfo.db:
- 确保文件权限是600,只有root能读:
chmod 600 /etc/mail/authinfo.db - 如果是用非root用户运行sendmail,要确保该用户能读取配置文件(不过一般sendmail都是以root运行的)。
按照这个步骤排查,应该能定位到问题所在!
内容的提问来源于stack exchange,提问作者Spencer Williams




