GCP Composer Airflow配置邮件发送时遇401未授权错误求助
首先,你的核心问题是邮件后端配置冲突,再加上几处细节错误,咱们一步步拆解修复:
问题根源分析
你的airflow.cfg里同时配置了两套不兼容的邮件发送逻辑:
email_backend = airflow.contrib.utils.sendgrid.send_email指定用SendGrid发送邮件- 但你又填写了Gmail的SMTP配置参数,这两套配置互斥,Airflow会优先使用
email_backend指定的SendGrid方案,但你没有配置SendGrid的API密钥,直接导致认证失败。
另外,配置里还有明显的拼写错误:smtp_mail_from = myemail@gamil.com 里的gamil.com应该是gmail.com,这个小错误也会加剧认证问题。
解决方案二选一(根据你的需求选择)
方案1:改用Gmail SMTP发送邮件
这是你原本的配置方向,只需修正配置即可:
切换到SMTP邮件后端
将email模块的后端改为Airflow默认的SMTP实现:[email] email_backend = airflow.utils.email.send_email_smtp修正Gmail SMTP配置
修正拼写错误,同时适配Gmail的现代认证规则(Gmail不再允许直接使用账号密码,需要先开启两步验证,再生成应用专用密码):[smtp] smtp_host = smtp.gmail.com smtp_starttls = True smtp_ssl = False smtp_user = 你的完整Gmail邮箱(比如myemail@gmail.com) smtp_port = 587 smtp_password = 你的Gmail应用专用密码(不是普通账号密码) smtp_mail_from = 和smtp_user一致的邮箱地址(myemail@gmail.com)在GCP Composer中应用配置
Composer不允许直接编辑airflow.cfg,你需要通过环境变量来设置这些参数:- 添加环境变量
AIRFLOW__EMAIL__EMAIL_BACKEND,值为airflow.utils.email.send_email_smtp - 添加
AIRFLOW__SMTP__SMTP_USER、AIRFLOW__SMTP__SMTP_PASSWORD、AIRFLOW__SMTP__SMTP_MAIL_FROM,对应上面的正确值
- 添加环境变量
方案2:改用SendGrid发送邮件
如果你确实想使用SendGrid,需要调整配置并提供API密钥:
保留SendGrid后端配置
确保email_backend路径正确(Airflow 1.10.3的该路径是有效的):[email] email_backend = airflow.contrib.utils.sendgrid.send_email添加SendGrid API密钥
在GCP Composer的环境变量中新增SENDGRID_API_KEY,值为你在SendGrid平台生成的有效API密钥(这是SendGrid认证的核心,和Gmail密码无关)清理无用配置
既然用SendGrid,[smtp]下的所有配置都可以删除或注释,避免混淆。
额外优化建议
你的DAG代码里html_content的转义字符可以简化,EmailOperator会直接处理HTML内容,无需转义:
email_task = EmailOperator( task_id='email_task', to="email@gmail.com", # 这里也注意修正gamil拼写 subject="test", html_content="<h1>Most important heading here</h1>", files=None, cc=None, bcc=None, mime_subtype='mixed', mime_charset='us_ascii', dag=dag )
内容的提问来源于stack exchange,提问作者Akshay Lande

