You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:05:54