气流EmailOperator抛出“ smtplib.SMTPNotSupportedError:服务器不支持STARTTLS扩展”?

时间:2019-10-15 01:36:05

标签: airflow

尝试使用气流的EmailOperatortrigger_rule.ONE_FAILED上发送电子邮件并看到错误:

[2019-10-14 13:31:50,604] {configuration.py:206} WARNING - section/key [smtp/smtp_user] not found in config
Traceback (most recent call last):
   File "/bin/airflow", line 27, in <module>
[     args.func(args)
   File "/usr/lib/python2.7/site-packages/airflow/bin/cli.py", line 392, in run
     pool=args.pool,
   File "/usr/lib/python2.7/site-packages/airflow/utils/db.py", line 50, in wrapper
     result = func(*args, **kwargs)
   File "/usr/lib/python2.7/site-packages/airflow/models.py", line 1493, in _run_raw_task
     result = task_copy.execute(context=context)
   File "/usr/lib/python2.7/site-packages/airflow/operators/email_operator.py", line 64, in execute
     send_email(self.to, self.subject, self.html_content, files=self.files, cc=self.cc, bcc=self.bcc, mime_subtype=self.mime_subtype)
   File "/usr/lib/python2.7/site-packages/airflow/utils/email.py", line 44, in send_email
     return backend(to, subject, html_content, files=files, dryrun=dryrun, cc=cc, bcc=bcc, mime_subtype=mime_subtype)
   File "/usr/lib/python2.7/site-packages/airflow/utils/email.py", line 87, in send_email_smtp
     send_MIME_email(SMTP_MAIL_FROM, recipients, msg, dryrun)
   File "/usr/lib/python2.7/site-packages/airflow/utils/email.py", line 109, in send_MIME_email
     s.starttls()
   File "/usr/lib64/python2.7/smtplib.py", line 643, in starttls
     raise SMTPException("STARTTLS extension not supported by server.")
 smtplib.SMTPException: STARTTLS 

未更改默认的airflow.cfg(除了用于访问Web服务器的基本密码身份验证之外),电子邮件部分看起来像

[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 = localhost
smtp_starttls = True
smtp_ssl = False
# Uncomment and set the user/pass settings if you want to use SMTP AUTH
# smtp_user = airflow
# smtp_password = airflow
smtp_port = 25
smtp_mail_from = airflow@example.com

正在检查cfg文件中的端口,它似乎已打开并正在监听...

[rvillanueva@mapr001 queensetl_airflow]$ netstat -plnt | grep ':25'
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 ::1:25                  :::*                    LISTEN      -  

...并且我能够将linux sendmail bash命令用于在同一台计算机(CentOS 7)上运行的其他进程。

任何人都知道这里可能发生什么或任何其他调试提示吗?

1 个答案:

答案 0 :(得分:0)

在气流用户邮件列表和上面显示的错误跟踪的帮助下,解决此问题的方法只是设置smtp_starttls = False

使用...之类的脚本进行测试

# Import smtplib for the actual sending function
import smtplib
from email.mime.text import MIMEText

send_to = 'myaddress@co.org'
msg = MIMEText('Hello World')
msg['Subject'] = 'Test Airflow Email'
msg['From'] = 'airflow@example.com'
msg['To'] = send_to

# SMTP Send
s = smtplib.SMTP('localhost')
s.starttls() # Try commenting out this line and see if you get a different error
s.sendmail(me, [send_to], msg.as_string())
s.quit()

看到相同的错误,并通过注释掉s.starttls()行来解决了该错误。所以现在我的airflow.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 = localhost
#smtp_starttls = True
smtp_starttls = False
smtp_ssl = False
# Uncomment and set the user/pass settings if you want to use SMTP AUTH
# smtp_user = airflow
# smtp_password = airflow
smtp_port = 25
smtp_mail_from = airflow@example.com

,电子邮件警报似乎运行正常。