簡體   English   中英

如何在 Airflow 中使用 EmailOperator 發送多封郵件

[英]How to send multiple emails using EmailOperator in Airflow

我正在嘗試使用 python 循環內的 EmailOperator 將個人電子郵件發送到用戶列表,但目前未發送電子郵件。 dag 沒有返回任何錯誤,這讓我相信 EmailOperator 沒有被調用。

代碼

@dag(schedule_interval=None, tags=['Send multiple emails testing'], default_args=default_args)
def multiple_email_send_test_dag():

    @task   
    def multiple_email_send_test():
        email_list = ['user1@gmail.com', 'user2@gmail.com']
        for i in range(len(email_list)):
            EmailOperator(
                task_id=f'send_success_email_test_no_{i}', 
                to=str(email_list[i]),
                subject='Email Header',
                html_content= f"""
                        Hi {email_list[i]}, <br>
                        <p>This is the body of the email</p>
                        <br> Thank You. <br>
                    """
            ) 
    
    # Dummy Operators
    start = DummyOperator(task_id='start')
    end = DummyOperator(task_id='end')

    # The pipeline
    start >> multiple_email_send_test() >> end

dag = multiple_email_send_test_dag()

我錯過了什么?

這是在運算符內部調用運算符的情況。 EmailOperator沒有執行——它所做的只是初始化 class 的構造函數。實際發送 email 的邏輯在 class 的execute() function 中。


不要這樣做 - 壞習慣

首先讓我澄清一下,如果你想讓你當前的代碼工作,你必須調用execute()有關它的更多信息,請參閱此答案

@task   
def multiple_email_send_test():
    email_list = ['user1@gmail.com', 'user2@gmail.com']
    for i in range(len(email_list)):
        e = EmailOperator(
            task_id=f'send_success_email_test_no_{i}', 
            to=str(email_list[i]),
            subject='Email Header',
            html_content= f"""
                    Hi {email_list[i]}, <br>
                    <p>This is the body of the email</p>
                    <br> Thank You. <br>
                """
        ) 
        e.exectue(dict())

你應該如何解決它

選項 1:由於EmailOperator向所有地址發送 1 email,這與您希望的行為不同。 您可以只創建一個自定義運算符IndvidualEmailOpeator ,它接受電子郵件列表並向每個地址發送單獨的郵件。 通過這樣做,您不需要使用PythonOperator / 任務裝飾器包裝運算符,因此您可以直接使用您創建的運算符。

選項 2:

請注意, EmailOperator只是調用send_email ,因此您可以直接使用 function 而無需操作員,從而避免了操作員內部操作員的問題:

@task   
def multiple_email_send_test():
    from airflow.utils.email import send_email
    email_list = ['user1@gmail.com', 'user2@gmail.com']
    for i in range(len(email_list)):
        send_email(
            to=str(email_list[i]),
            subject='Email Header',
            html_content= f"""
                    Hi {email_list[i]}, <br>
                    <p>This is the body of the email</p>
                    <br> Thank You. <br>
                """
        ) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM