Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Airflow - Send email with AWS SES

Trying to send an email from apache airflow using AWS Simple Email Service (SES), and it's returning errors that are not helping me solve the problem. I believe it's a configuration issue within SES, but I'm not sure what to change.

General info:

  • New SES instance, verified email.
  • Airflow 1.10.10 running on Ubuntu 18.04 (local laptop).
  • Same situation from EC2 instance on a separate AWS account.
  • Running 1 DAG with a python operator that works fine.
  • Sending email works with gmail smtp settings and an app password.

Abbreviated DAG code:

...
from airflow.operators.email_operator import EmailOperator
...
email_status = EmailOperator(
        task_id="sending_status_email",
        to="[email protected]",
        subject="Test from SES",
        html_content="Trying to send an email from airflow through SES.",
        dag=dag
)
...

airflow.cfg SMTP Settings:

smtp_host = email-smtp.us-east-1.amazonaws.com
smtp_starttls = True
smtp_ssl = False
smtp_user = AWSUSERKEY
smtp_password = PASSWORDFROMAWSSMTP
smtp_port = 587
smtp_mail_from = [email protected]

Errors Received while trying various changes to starttls, ssl, and port settings.

ERROR - (554, b'Transaction failed: Unsupported encoding us_ascii.')
ERROR - STARTTLS extension not supported by server.
ERROR - (SSL: WRONG_VERSION_NUMBER) wrong version number (_ssl.c:852)

like image 269
Jason Green Avatar asked Jun 30 '20 14:06

Jason Green


People also ask

Can I use AWS SES to send email?

Amazon Simple Email Service (SES) is a cost-effective email service built on the reliable and scalable infrastructure that Amazon.com developed to serve its own customer base. With Amazon SES, you can send transactional email, marketing messages, or any other type of high-quality content to your customers.


1 Answers

Not sure about the others but we just ran into this error today:

ERROR - (554, b'Transaction failed: Unsupported encoding us_ascii.')

This is the default value in the class's __init__ method, which isn't valid: https://github.com/apache/airflow/blob/1.10.10/airflow/operators/email_operator.py#L63

You can fix it by passing in a valid value, like "utf-8":

email_status = EmailOperator(
        mime_charset='utf-8',
        task_id="sending_status_email",
        to="[email protected]",
        subject="Test from SES",
        html_content="Trying to send an email from airflow through SES.",
        dag=dag
)
like image 135
Jared Avatar answered Oct 22 '22 09:10

Jared