如何设置气流发送电子邮件?

Posted

技术标签:

【中文标题】如何设置气流发送电子邮件?【英文标题】:How to set up Airflow Send Email? 【发布时间】:2019-01-20 14:08:48 【问题描述】:

我按照在线教程在airflow.cfg中设置电子邮件SMTP服务器如下:

[email]
email_backend = airflow.utils.email.send_email_smtp


[smtp]
# If you want airflow to send emails on retries, failure, and you want to use
# the airflow.utils.email.send_email_smtp function, you have to configure an
# smtp server here
smtp_host = smtp.gmail.com
smtp_starttls = True
smtp_ssl = False
# Uncomment and set the user/pass settings if you want to use SMTP AUTH 
# smtp_user =                       
# smtp_password =  
smtp_port = 587
smtp_mail_from = myemail@gmail.com

我的 DAG 如下:

from datetime import datetime
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import PythonOperator
from airflow.operators.email_operator import EmailOperator

def print_hello():
    return 'Hello world!'

default_args = 
        'owner': 'peter',
        'start_date':datetime(2018,8,11),


dag = DAG('hello_world', description='Simple tutorial DAG',
          schedule_interval='* * * * *',
          default_args = default_args, catchup=False)

dummy_operator = DummyOperator(task_id='dummy_task', retries=3, dag=dag)

hello_operator = PythonOperator(task_id='hello_task', python_callable=print_hello, dag=dag)

email = EmailOperator(
        task_id='send_email',
        to='to@gmail.com',
        subject='Airflow Alert',
        html_content=""" <h3>Email Test</h3> """,
        dag=dag
)

email >> dummy_operator >> hello_operator

我假设电子邮件运算符将在其他两个运算符之后运行,然后向我发送电子邮件。 但是邮件没有发给我。 我真的很感谢你的帮助。非常感谢。

最好的

【问题讨论】:

您遇到错误了吗? @mad_ 不,我没有收到任何错误。但是电子邮件没有发送到我的电子邮件地址。我不知道如何实现它。 请在问题中添加您的 dag 运行的输出。 我假设电子邮件运算符将在其他两个运算符之后运行。实际上,气流上下文中的 't1 >> t2' 意味着 t2 将在 t1 之后发生 【参考方案1】:

我也遇到过这个问题。我用正确的设置更改了airflow.cfg,但它仍然无法正常工作。最后,我发现我应该重新启动气流调度程序以加载气流.cfg 的更改。重新启动调度程序后,它工作正常。 以下两个设置都可以。

[smtp]
# If you want airflow to send emails on retries, failure, and you want to use
# the airflow.utils.email.send_email_smtp function, you have to configure an
# smtp server here
smtp_host = smtp.gmail.com
smtp_starttls = True
smtp_ssl = False
smtp_user = youremail@gmail.com                      
smtp_password =  your password
smtp_port = 587
smtp_mail_from = youremail@gmail.com

---------或------

[smtp]
# If you want airflow to send emails on retries, failure, and you want to use
# the airflow.utils.email.send_email_smtp function, you have to configure an
# smtp server here
smtp_host = smtp.gmail.com
smtp_starttls = False
smtp_ssl = True
smtp_user = youremail@gmail.com                      
smtp_password =  your password
smtp_port = 465
smtp_mail_from = youremail@gmail.com

【讨论】:

【参考方案2】:

我遇到了同样的问题,我通过确保在我的撰写文件中进行卷装载来解决它

volumes:
  - ./dags:/usr/local/airflow/dags
  - ./config/airflow.cfg:/usr/local/airflow/airflow.cfg

【讨论】:

我不知道为什么会这样,但确实如此。你拯救了我的一天。干杯!【参考方案3】:

使用 Gmail 为 Airflow 电子邮件警报设置 SMTP 服务器

创建一个电子邮件 ID,您想通过该电子邮件 ID 发送有关 DAG 失败的警报,或者如果您想使用 EmailOperator。编辑 airflow.cfg 文件以编辑邮件服务器的 smtp 详细信息。

对于演示,您可以使用任何 gmail 帐户。

为您的 gmail 帐户创建一个 google 应用密码。 [此处的说明] 这样做是为了不使用原始密码或 2 因素身份验证。

    访问您的App passwords 页面。您可能会被要求登录您的 谷歌帐户。 在底部,点击选择应用并选择应用 你正在使用。 点击选择设备并选择您的设备 使用。 选择生成。 按照说明进入应用程序 您设备上的密码(黄色栏中的 16 个字符的代码)。 选择完成

完成后,您将不会再看到该应用密码代码。但是,您会看到您为其创建了应用密码的应用和设备的列表。

编辑airflow.cfg 并编辑[smtp] 部分,如下所示:

[smtp]
smtp_host = smtp.gmail.com
smtp_starttls = True
smtp_ssl = False
smtp_user = YOUR_EMAIL_ADDRESS
smtp_password = 16_DIGIT_APP_PASSWORD
smtp_port = 587
smtp_mail_from = YOUR_EMAIL_ADDRESS

将以下参数编辑为相应的值:

YOUR_EMAIL_ADDRESS = 您的 Gmail 地址16_DIGIT_APP_PASSWORD = 上面生成的应用密码

【讨论】:

这似乎对许多人有用,但对我不起作用。我没有收到任何电子邮件,我有确切的配置。 您知道如何为 Google 群组电子邮件而不是个人 Gmail 帐户设置此项吗?我想使用 Airflow 从 Google Group 电子邮件地址发送电子邮件 如果从 Google G Suite 而非 Gmail support.google.com/a/answer/176600?hl=en 发送,我在这里找到了一些有用的文档@ 如果您不想使用应用密码,可以使用您常用的密码代替16_DIGIT_PASSWORD吗?

以上是关于如何设置气流发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 和 Airflow 在电子邮件中发送 Redshift 查询结果

如何在 CrashRpt 中配置电子邮件设置以发送故障转储?

如何设置 Teamcity 以通过电子邮件发送发行说明?

MSN邮箱的服务器信息,发送邮件(SMTP)与接收邮件(POP3)如何设置?

如何使用django设置发送电子邮件的超时时间?

如何在django中设置发送邮件