Airflow连接SMTP主机报Connection refused问题排查建议咨询
Airflow SMTP邮件发送Connection refused问题排查方案
- 首先确认SMTP参数是否被Airflow默认配置覆盖
你未修改airflow.cfg的前提下,Airflow自带的EmailOperator、send_email工具函数会优先读取全局配置的SMTP参数,默认值为localhost:25,如果代码没有完全覆盖所有SMTP相关配置,就会触发连接拒绝。建议直接在代码中显式传递所有必填参数,最稳妥的写法是直接调用原生smtplib,完全不受Airflow全局配置干扰,示例如下:import smtplib from email.mime.text import MIMEText def send_custom_email(**context): msg = MIMEText("邮件正文内容") msg["Subject"] = "邮件标题" msg["From"] = "发件人邮箱" msg["To"] = "收件人邮箱" # 显式声明所有SMTP配置,不调用Airflow邮件相关默认配置 with smtplib.SMTP_SSL("你的SMTP主机地址", SMTP端口) as server: server.login("发件人账号", "发件人密码") server.send_message(msg) - 检查Airflow SMTP连接配置
进入Airflow后台的「Admin - Connections」页面,查找ID为smtp_default的连接,如果该连接存在且配置了错误的SMTP地址、端口,优先级会高于你代码里传入的参数,直接覆盖你的配置。你可以修改该连接为正确参数,或者在代码中指定自定义的连接ID避免使用默认值。 - 排查Airflow进程的运行权限限制
你用独立脚本测试连通性时,使用的是当前登录用户的运行环境,而生产环境的Airflow Worker/Scheduler进程通常使用专用的服务账号运行。需要确认:- 服务账号是否有出站访问SMTP端口的权限,是否有针对该账号的iptables、SELinux出站限制
- Airflow进程是否配置了全局HTTP/HTTPS代理,代理规则拦截了SMTP端口的访问
- 确认版本兼容性
检查本地和生产环境的Airflow版本是否一致,部分低版本Airflow的EmailOperator不支持直接传递smtp_host、smtp_port等参数,必须通过连接ID传递配置,你本地高版本支持的写法在低版本生产环境会失效,导致参数未生效、自动使用默认配置。 - 打印调试日志确认实际连接参数
在邮件发送逻辑前加入日志打印,输出你用到的SMTP主机、端口、账号等信息,同时开启Task的DEBUG日志级别,查看Airflow实际发起连接的目标地址是否和你配置的一致,可以快速定位参数被覆盖的问题。
内容的提问来源于stack exchange,提问作者Puja Bharti
相关产品推荐
相关产品推荐

