Source code for airflow_pydantic.operators.email
from logging import getLogger
from pydantic import Field, field_validator
from ..core import Task, TaskArgs
from ..utils import ImportPath
__all__ = (
"EmailOperator",
"EmailOperatorArgs",
"EmailTask",
"EmailTaskArgs",
)
_log = getLogger(__name__)
[docs]
class EmailTaskArgs(TaskArgs):
# email operator args
# https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/operators/email/index.html
to: str | list[str] = Field(description="List of emails to send the email to. (templated)")
subject: str = Field(description="Subject line for the email. (templated)")
html_content: str = Field(description="Content of the email, html markup is allowed. (templated)")
files: list[str] | None = Field(default=None, description="File names to attach in email. (templated)")
cc: str | list[str] | None = Field(default=None, description="List of recipients to be added in CC field. (templated)")
bcc: str | list[str] | None = Field(default=None, description="List of recipients to be added in BCC field. (templated)")
mime_subtype: str | None = Field(default=None, description="MIME sub content type, default is 'mixed'")
mime_charset: str | None = Field(default=None, description="Character set parameter added to the Content-Type header, default is 'us-ascii'")
conn_id: str | None = Field(default=None, description="The connection to use for sending the email.")
custom_headers: dict[str, str] | None = Field(default=None, description="Additional headers to be added to the MIME message.")
@field_validator("to", "cc", "bcc")
@classmethod
def validate_email_list(cls, v):
if v is None:
return v
if isinstance(v, str):
return v
if isinstance(v, list) and all(isinstance(item, str) for item in v):
return v
raise ValueError("Must be a string or list of strings")
# Alias
EmailOperatorArgs = EmailTaskArgs
[docs]
class EmailTask(Task, EmailTaskArgs):
operator: ImportPath = Field(default="airflow_pydantic.airflow.EmailOperator", description="airflow operator path", validate_default=True)
@field_validator("operator")
@classmethod
def validate_operator(cls, v: type) -> type:
from airflow_pydantic.airflow import EmailOperator as AirflowEmailOperator, _AirflowPydanticMarker
if not isinstance(v, type):
raise TypeError(f"operator must be 'airflow.providers.smtp.operators.smtp.EmailOperator', got: {v}")
if issubclass(v, _AirflowPydanticMarker):
_log.info("EmailOperator is a marker class, returning as is")
return v
if not issubclass(v, AirflowEmailOperator):
raise TypeError(f"operator must be 'airflow.providers.smtp.operators.smtp.EmailOperator', got: {v}")
return v
# Alias
EmailOperator = EmailTask