Airflow 2.7.1发送邮件异常:无法指定独立发件人且遇连接错误
Airflow 2.7.1 SMTP告警失败(Errno 99)解决思路
核心问题定位
你遇到的OSError: [Errno 99] Cannot assign requested address是网络连接失败,并非发件人邮箱与登录邮箱不匹配的问题——你的本地测试脚本能成功发送,说明SMTP服务器支持登录邮箱和发件人不一致的场景,问题出在Airflow容器的网络或配置上。
分步解决
1. 验证Airflow容器与SMTP服务器的网络连通性
你的测试脚本在宿主机运行,但Airflow任务在Docker容器内执行,容器网络环境与宿主机不同:
- 进入Airflow worker容器(任务实际执行的容器):
docker exec -it <airflow-worker-container-name> /bin/bash - 测试SMTP服务器的连通性:
# 测试端口是否可达 telnet SMTP_SERVER 25 # 或用nc工具 nc -zv SMTP_SERVER 25
如果连接失败,说明容器无法访问SMTP服务器,需排查:
- Docker网络配置:确保容器所在网络能路由到SMTP服务器
- SMTP服务器防火墙/白名单:将容器所在的Docker子网IP(比如默认的172.17.0.0/16)加入SMTP服务器的允许列表
2. 确保所有Airflow组件都配置了SMTP参数
你仅在airflow-webserver的环境变量里配置了SMTP,但任务是在worker容器执行的,需将SMTP配置加到所有相关组件(worker、scheduler)的环境变量中:
修改docker-compose.yml,把SMTP相关环境变量移到airflow-common-env里,让所有继承该配置的组件生效:
x-airflow-common-env: &airflow-common-env AIRFLOW__EMAIL__EMAIL_BACKEND: 'airflow.utils.email.send_email_smtp' AIRFLOW__SMTP__SMTP_HOST: 'SMTP_SERVER' AIRFLOW__SMTP__SMTP_PORT: '25' AIRFLOW__SMTP__SMTP_STARTTLS: 'True' AIRFLOW__SMTP__SMTP_SSL: 'False' AIRFLOW__SMTP__SMTP_USER: 'user_email@email.com' AIRFLOW__SMTP__SMTP_PASSWORD: 'PASSWORD' AIRFLOW__SMTP__SMTP_MAIL_FROM: 'email_from@email.com' airflow-webserver: <<: *airflow-common command: webserver ports: - "8080:8080" environment: <<: *airflow-common-env AIRFLOW__WEBSERVER__BASE_URL: http://localhost:8080 AIRFLOW__WEBSERVER__EXPOSE_CONFIG: "True" # ... 其他原有配置 airflow-worker: <<: *airflow-common command: celery worker environment: <<: *airflow-common-env # ... 其他原有worker配置
3. 修正SMTP连接的Extra参数
Airflow 2.x已废弃extra__email__from这类带前缀的参数,直接在smtp_default连接的Extra里使用mail_from即可:
{ "mail_from": "noreply@example.com" }
注意:若同时配置了airflow.cfg的SMTP_MAIL_FROM和连接的mail_from,连接配置优先级更高。
4. 简化DAG代码
无需在PythonOperator里嵌套EmailOperator并手动执行,直接用EmailOperator作为任务即可:
from airflow import DAG from airflow.operators.email import EmailOperator from datetime import datetime default_args = { 'owner': 'airflow', 'start_date': datetime(2024, 2, 8), 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, } dag = DAG( 'send_test_email', default_args=default_args, description='A simple DAG to send a test email', schedule_interval=None ) send_email_task = EmailOperator( task_id='send_email', to=['sifal.bekouche@suez.com'], subject='Test Email from Airflow', html_content='<p>This is a test email sent from Airflow.</p>', dag=dag ) send_email_task
5. 检查SMTP服务器的绑定地址
如果SMTP服务器绑定的是宿主机的127.0.0.1,容器将无法访问,需修改SMTP服务器配置,让它绑定到0.0.0.0或容器可访问的IP地址。
内容的提问来源于stack exchange,提问作者SbE
相关产品推荐
相关产品推荐

