Docker容器内发送邮件失败:出现名称解析错误
问题描述
在基于Ubuntu的Docker容器内运行以下Python邮件发送脚本时,出现socket.gaierror: [Errno -3] Temporary failure in name resolution错误,无法解析SMTP服务器域名mail.companyname.com。但在Windows宿主机上运行相同脚本可正常发送邮件,目标SMTP服务器未部署在本地。
使用的Python代码:
import smtplib def send_email(from_addr="senderaddress@companyname.com", to_addrs="receiveraddress@companyname.com", msg="test Email"): mailserver = smtplib.SMTP('mail.companyname.com', 25) mailserver.ehlo() mailserver.starttls() mailserver.sendmail(from_addr, to_addrs, msg) mailserver.quit() send_email()
可行解决办法
检查Docker容器的DNS配置
容器默认使用宿主机DNS,若配置异常可手动指定可信DNS服务器运行容器:docker run --dns 8.8.8.8 --dns 8.8.4.4 your-image-name或在
docker-compose.yml中添加DNS配置:services: your-service: image: your-image-name dns: - 8.8.8.8 - 8.8.4.4验证容器内的域名解析能力
进入容器内部,用nslookup测试SMTP域名解析情况:docker exec -it your-container-name bash nslookup mail.companyname.com若解析失败,说明容器网络无法访问对应DNS服务器,需排查网络连通性(比如是否存在公司内网DNS限制、容器是否处于正确网络环境)。
直接使用SMTP服务器IP替代域名
在Windows宿主机通过nslookup mail.companyname.com获取服务器IP,替换代码中的域名:mailserver = smtplib.SMTP('x.x.x.x', 25) # x.x.x.x为SMTP服务器实际IP调整容器网络模式
默认bridge模式可能存在隔离问题,可尝试使用host网络模式运行容器(注意该模式下容器共享宿主机网络,可能存在端口冲突风险):docker run --network host your-image-name
内容的提问来源于stack exchange,提问作者fnjo
相关产品推荐
相关产品推荐

