Airflow中EmailOperator任务显示已发送但未实际生成邮件的问题求助
Airflow EmailOperator 显示发送成功但未收到邮件的排查与解决
核心问题分析
任务日志显示邮件已发送,但指定邮箱未收到,说明代码触发了发送动作,但邮件在传输或配置环节出现异常。
排查步骤与解决方案
1. 检查Airflow SMTP核心配置
Airflow依赖SMTP服务器发送邮件,必须在airflow.cfg中完成正确配置:
[smtp] smtp_host = 你的SMTP服务器地址 # 例如 smtp.gmail.com smtp_starttls = True smtp_ssl = False smtp_user = 发件人邮箱账号 smtp_password = 邮箱密码/应用专用密码 smtp_port = 587 smtp_mail_from = 发件人邮箱地址 smtp_timeout = 30 smtp_retry_limit = 5
- 若使用Gmail,需开启两步验证后设置应用专用密码,不能直接使用账号密码。
- 企业邮箱需确认是否将Airflow服务器IP加入白名单,否则会被拦截。
2. 验证收件人变量有效性
代码中使用to=email,需确认:
email变量已正确赋值为合法邮箱格式(如xxx@example.com),无空值、多余空格或非法字符。- 可临时硬编码测试邮箱(如
your-test@example.com),排查是否为变量传递问题。
3. 排查邮件拦截问题
- 检查收件方邮箱的垃圾邮件/垃圾箱,邮件可能被反垃圾规则判定为垃圾邮件。
- 临时修改主题(如改为
Airflow测试邮件),避免Alert这类关键词触发拦截。 - 简化
html_content测试,排除内容语法错误:html_content='<p>测试邮件内容</p>'
4. 查看底层日志
- 查看EmailOperator任务的详细日志,搜索
smtp关键字,排查是否有隐藏的连接超时、认证失败等异常。 - 联系SMTP服务器管理员,查看邮件传输日志,确认邮件是否到达服务器、是否被退回。
5. 直接测试SMTP连接
在Airflow服务器上用Python脚本单独测试SMTP发送,排除Airflow配置问题:
import smtplib from email.mime.text import MIMEText msg = MIMEText('Python测试邮件内容', 'html') msg['Subject'] = 'SMTP连接测试' msg['From'] = '发件人邮箱' msg['To'] = '测试收件邮箱' with smtplib.SMTP('你的SMTP服务器', 587) as server: server.starttls() server.login('发件人邮箱', '邮箱密码') server.send_message(msg)
若该脚本也无法发送,说明问题出在SMTP服务器或网络,与Airflow无关。
代码优化建议
代码中subject的{{ds}}用了四层大括号,可简化为两层(f-string中用两层大括号转义为一层,Airflow模板引擎会自动解析为执行日期):
subject=f'Alert: No files received for project {dag_id.upper()} for {{ds}}'
内容的提问来源于stack exchange,提问作者Dhanashree Shekatkar
相关产品推荐
相关产品推荐

