Send With Confidence
Partner with the email service trusted by developers and marketers for time-savings, scalability, and delivery expertise.
Time to read: 6 minutes
The sooner you know about an error that your Python web application throws in production, the faster you can solve it. This post will show you how to send custom exception reporting emails with Twilio SendGrid for Python-built Flask web applications.
You will need the following software to work through this tutorial:
We start by setting up SendGrid for programmatic access. If you already have an account, skip to the “Getting your API key” section.
Create a Twilio SendGrid account by:
There will be another prompt for a bit more information and then you'll need to finish the verification process. This multi-step verification process helps us keep out malicious spammers while serving legitimate developers like yourself.
You will receive an email at the address you used to sign up to verify your account. Navigate to the SendGrid dashboard when you have finished verification.
We need an API key from Twilio SendGrid so that we can authenticate and make API requests.
Navigate to the dashboard and click “Settings.” Then click on “API Keys.”
Click the “Create API Key” button and name the API Key “Flask Error Reports.” Select “Restricted Access.”
Next, click on the “Mail Send” dropdown. Enable the “Mail Send” option by using the slider.
Scroll to the bottom and click the “Create & View” button. Copy the key and then paste it somewhere secure because we'll be using it in our application.
Now we need to set up our Python environment before we write the code. We'll make a new directory for our project and create a virtual environment under it. We then install the Python packages that we need within the virtual environment.
If you are using a Unix or Mac OS system, open a terminal and enter the following commands to do the tasks described above:
pip
, the Python package installer, to install the two packages that we are going to use in this project, which are:
app.py
to throw an unhandled exception.
Flask does have built-in error handlers (read more about that here). We use the @app.errorhandler
decorator to register a function with the Flask application. It’s quite similar to the @app.route
decorator except that it allows us to register a function that gets executed when particular types of errors occur in our application. In this case, we are paying attention to the InternalServerError
exception. This is the exception that Flask and it’s underlying utility library Werkzeug raise whenever an unhandled exception occurs.
Note: We are using Python’s built-in traceback module to retrieve the traceback information. The variable we created called error_tb
is a string that contains the traceback. This traceback is exactly the same as what we see in the terminal when the unhandled exception occurs in the Flask application. We will pass this information into our SendGrid email in the next section.
We also added a call to the app.finalize_request
method. This maintains the default behavior of our Flask application:when an unhandled exception occurs, we will still return the internal server error response to the browser.
We’re now at the point where we can set up the code to send the alert email. So let’s do that by updating app.py to contain the following:
create_message
which sets up a SendMail Mail
object. This object pulls in the FROM_EMAIL
and the TO_EMAIL
from the .env file. With that said we need to add the following lines into our .env file:
load_dotenv
function. This ensures that when our code runs, the required environment variables will be available in our application code.
SENDGRID_API_KEY
and uses it to authenticate against the SendGrid servers. As with the other variables in our .env file, the load_dotenv
call ensures that the variable is imported into the environment of the process.
Partner with the email service trusted by developers and marketers for time-savings, scalability, and delivery expertise.