컴퓨터 공부/💿 Airflow

[Airflow] Email Operator로 메일 전송하기

letzgorats 2023. 8. 20. 11:42

1. Email 오퍼레이터란?

  • 이메일을 전송해주는 오퍼레이터로서 아래와 같은 형태를 가집니다.
email_t1 = EmailOperator(
	task_id = "email_t1",
        to = "hockey9322@naver.com",
        subject = " Airflow 처리결과",
        html_content = "이메일 내용입니다!<br/>"
        )
  • 여기서 to 는 누구에게 메일을 보낼것인지 정하는 란이고,
  • subject는 메일제목을 뜻하며, 메일 내용은 html_content에 적으면 됩니다.

 

이메일 전송을 위해선 사전 작업 세팅이 필요한데요, 해당 작업은 구글 메일 서버를 사용하도록 하겠습니다.

 

2. 사전 작업 설정(Google)

  • Gmail --> 설정 --> 모든 설정 보기 --> 전달 및 POP/IMAP --> IMAP 사용

  • 구글 계정 관리 --> 보안 --> 2단계 인증 --> 앱 비밀번호 셋팅
    • 앱 비밀번호는 반드시 어디다가 저장해야 합니다. 깃허브 토큰 처럼 어딘가에 보관해두세요!

앱 비밀번호

2. 사전 작업 설정(Airflow)

  • vi docker-compose.yaml 로 아래와 같은 내용을 추가해줍니다.
  • Docker-compose.yaml 편집 (environment 항목에 추가) 
AIRFLOW_SMTP_SMTP_HOST : "smtp.gmail.com"
AIRFLOW_SMTP_SMTP_USER : "{gmail계정}"
AIRFLOW_SMTP_SMTP_PASSWORD : "{앱비밀번호}"
AIRFLOW_SMTP_SMTP_PORT : "587"
AIRFLOW_SMTP_SMTP_MAIL_FORM : "{gmail계정}"

docker-compose up.yaml 파일 편집

AIRFLOW__SMTP__SMTP_PASSWORD 부문에 아까 구글메일에서 받은 앱 비밀번호를 적으시면 됩니다.

 

이제 본격적으로 dag 파일을 작성해봅시다.

아래와 같이 말이죠.

from airflow import DAG
import pendulum
import datetime
from airflow.operators.email import EmailOperator

with DAG(
    dag_id="dags_email_operator",
    schedule="0 8 1 * *",
    start_date=pendulum.datetime(2023, 8, 1, tz="UTC"),
    catchup=False
) as dag:

    send_email_task = EmailOperator(
        task_id = 'send_email_task',
        to = 'hockey9322@naver.com',
        subject= 'Airflow 알루코딩 성공메일',
        html_content='Airflow알루코딩 이메일 오퍼레이터 작업이 완료되었습니다!'
    )

그럼 이제, 도커를 실행시켜서 airflow에서 한 번 확인해봅시다.

next_run이 이미 지난 날짜라면 수동으로 한 번 실행시켜주고 로그를 살펴보면 아래와 같습니다. 

airflow 메일보내기 완료

네이버 메일을 보면, 아래와 같이 성공적으로 메일이 갔음을 확인할 수 있습니다.

보낸 사람은 gmail 계정이자 도커 docker-compose.yaml 파일에 쓴 메일이고, 받는 사람의 메일은 dag 파일에 쓴 메일입니다.

 

정리하자면,

이메일을 보내기 위해선 두 가지 설정사항을 해줘야 하는데,

1) gmail에서 imap 사용을 체크한 후, 앱 비밀번호를 발급받은 후,

2) airflow의 다섯가지 변수를 적절하게 채우면서, 현재 세팅에서는 도커를 사용했기 때문에, docker-compose.yaml 파일을 편집하면 됩니다.

 

이상으로 이메일 오퍼레이터를 통해 이메일을 보내는 실습을 진행해봤습니다.

반응형