[Airflow] Email Operator

minyeamer·2025년 6월 6일
0

Apache Airflow 배우기

목록 보기
8/13
post-thumbnail

EmailOperator

https://airflow.apache.org/docs/apache-airflow/1.10.9/_api/airflow/operators/email_operator/index.html

  • 이메일을 전송해주는 Operator
  • SMTP 프로토콜을 통해 개인 Gmail에서 다른 주소로 메일을 보내는 기능 구현
  • Gmail 옵션에서 IMAP 사용 설정앱 비밀번호 생성이 선행되어야 함

docker-compose 수정

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}

Connection 추가

https://airflow.apache.org/docs/apache-airflow/stable/howto/connection.html

  • Airflow 3.0 버전부터는 SMTP 설정을 환경변수나 설정 파일에서 가져오는 것이 아닌, Connection을 활용하도록 권장
  • Airflow UI의 사이드바에서 Admin->Connections 메뉴로 이동한 후, Add Connection 버튼을 클릭하여 Connection 추가
  • 아래 이미지와 같이 Connection Type 으로 smtp 를 선택하고, docker-compose 파일에 추가했던 것처럼 구글 계정과 앱 비밀번호를 포함한 메일 연결 설정을 입력
  • Extra Fields 에서 메일을 보내는 계정 등 추가적인 정보를 입력 가능

connection

EmailOperator 활용

  • 생성한 Connection을 사용하기 위해 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 가 발생
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
  • 원인 파악은 못했지만, Connection에서 SSL 비활성화 후 재시도하니 정상적으로 메일 전송

connection-ssl

메일 발송 확인

  • 정상적으로 메일이 전송되었을 때, 대상 메일에 접속하면 EmailOperator에서 지정한 것과 동일한 제목과 내용의 메일이 전송된 것을 확인 가능
<h2>Airflow 테스트</h2> <!-- 제목 -->
<div>Airflow 작업이 완료되었습니다.</div> <!-- 내용 -->
  • 실행 로그에서도 메일 전송을 위해 임의로 생성한 Connection 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"
profile
데이터의 모든 것을 추구합니다.

0개의 댓글