
https://airflow.apache.org/docs/apache-airflow/stable/howto/email-config.html
docker-compose.yaml 파일 내에 아래와 같은 항목을 추가AIRFLOW__SMTP__SMTP_USER 에는 앱 비밀번호를 생성한 구글 계정을 입력AIRFLOW__SMTP__SMTP_PASSWORD 에는 발급받은 앱 비밀번호를 공백없이 입력AIRFLOW__SMTP__SMTP_MAIL_FROM 에는 메일을 보내는 계정을 입력# docker-compose.yaml
x-airflow-common:
environment:
AIRFLOW__SMTP__SMTP_HOST: smtp.gmail.com
AIRFLOW__SMTP__SMTP_USER: ${SMTP_USER}
AIRFLOW__SMTP__SMTP_PASSWORD: ${SMTP_PASSWORD}
AIRFLOW__SMTP__SMTP_PORT: 587
AIRFLOW__SMTP__SMTP_MAIL_FROM: ${SMTP_USER}
https://airflow.apache.org/docs/apache-airflow/stable/howto/connection.html
Admin->Connections 메뉴로 이동한 후, Add Connection 버튼을 클릭하여 Connection 추가Connection Type 으로 smtp 를 선택하고, docker-compose 파일에 추가했던 것처럼 구글 계정과 앱 비밀번호를 포함한 메일 연결 설정을 입력Extra Fields 에서 메일을 보내는 계정 등 추가적인 정보를 입력 가능
conn_id 로 지정한 Connection ID 를 입력to 에 입력하고, 제목은 subject, 내용은 html_content 에 입력cc 파라미터로 추가로 입력 가능from airflow.sdk import DAG
from airflow.providers.smtp.operators.smtp import EmailOperator
import pendulum
with DAG(
dag_id="email_operator",
start_date=pendulum.datetime(2025, 1, 1, tz="Asia/Seoul"),
schedule="0 9 1 * *",
catchup=False,
tags=["example", "email"],
) as dag:
send_email_task = EmailOperator(
task_id="send_email_task",
conn_id="gmail",
to="example@gmail.com",
subject="Airflow 테스트",
html_content="Airflow 작업이 완료되었습니다."
)
SSLError 가 발생SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1010)
...
File "/usr/local/lib/python3.12/smtplib.py", line 1022 in __init__
File "/usr/local/lib/python3.12/smtplib.py", line 255 in __init__
File "/usr/local/lib/python3.12/smtplib.py", line 341 in connect
File "/usr/local/lib/python3.12/smtplib.py", line 1029 in _get_socket
File "/usr/local/lib/python3.12/ssl.py", line 455 in wrap_socket
File "/usr/local/lib/python3.12/ssl.py", line 1041 in _create
File "/usr/local/lib/python3.12/ssl.py", line 1319 in do_handshake
EmailOperator에서 지정한 것과 동일한 제목과 내용의 메일이 전송된 것을 확인 가능<h2>Airflow 테스트</h2> <!-- 제목 -->
<div>Airflow 작업이 완료되었습니다.</div> <!-- 내용 -->
gmail 을 사용한 것을 확인[2025-06-06, 21:10:46] INFO - DAG bundles loaded: dags-folder: source="airflow.dag_processing.bundles.manager.DagBundlesManager"
[2025-06-06, 21:10:46] INFO - Filling up the DagBag from /opt/airflow/dags/email_operator.py: source="airflow.models.dagbag.DagBag"
[2025-06-06, 21:10:46] INFO - Secrets backends loaded for worker: count=1: backend_classes=["EnvironmentVariablesBackend"]: source="supervisor"
[2025-06-06, 21:10:46] INFO - Connection Retrieved 'gmail': source="airflow.hooks.base"