prefect-email¶
The prefect-email
library helps you send emails from your Prefect flows.
Getting Started¶
Prerequisites¶
- Prefect installed in a virtual environment.
- Many email services, such as Gmail, require an App Password to successfully send emails.
If you encounter an error similar to
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted...
, it's likely you are not using an App Password.
Install prefect-email for Prefect 2¶
pip install 'prefect[email]<3'
Register newly installed blocks types¶
Register the block types in the prefect-email module to make them available for use.
prefect block register -m prefect_email
Save credentials to an EmailServerCredentials block¶
Save your email credentials to a block. Replace the placeholders with your email address and password.
from prefect_email import EmailServerCredentials
credentials = EmailServerCredentials(
username="EMAIL-ADDRESS-PLACEHOLDER",
password="PASSWORD-PLACEHOLDER", # must be an app password
)
credentials.save("BLOCK-NAME-PLACEHOLDER")
In the examples below you load a credentials block to authenticate with the email server.
Send emails¶
The code below shows how to send an email using the pre-built email_send_message
task.
from prefect import flow
from prefect_email import EmailServerCredentials, email_send_message
@flow
def example_email_send_message_flow(email_addresses):
email_server_credentials = EmailServerCredentials.load("BLOCK-NAME-PLACEHOLDER")
for email_address in email_addresses:
subject = email_send_message.with_options(name=f"email {email_address}").submit(
email_server_credentials=email_server_credentials,
subject="Example Flow Notification using Gmail",
msg="This proves email_send_message works!",
email_to=email_address,
)
if __name__ == "__main__":
example_email_send_message_flow(["EMAIL-ADDRESS-PLACEHOLDER"])
Capture exceptions and send an email¶
This example demonstrates how to send an email notification with the details of the exception when a flow run fails.
prefect-email
can be wrapped in an except
statement to do just that!
from prefect import flow
from prefect.context import get_run_context
from prefect_email import EmailServerCredentials, email_send_message
def notify_exc_by_email(exc):
context = get_run_context()
flow_run_name = context.flow_run.name
email_server_credentials = EmailServerCredentials.load("email-server-credentials")
email_send_message(
email_server_credentials=email_server_credentials,
subject=f"Flow run {flow_run_name!r} failed",
msg=f"Flow run {flow_run_name!r} failed due to {exc}.",
email_to=email_server_credentials.username,
)
@flow
def example_flow():
try:
1 / 0
except Exception as exc:
notify_exc_by_email(exc)
raise
if __name__ == "__main__":
example_flow()
Resources¶
Refer to the prefect-email API documentation linked in the sidebar to explore all the capabilities of the prefect-email library.