---
title: Send alert email
description: Send an alert email.
url: https://docs.influxdata.com/influxdb/v2/monitor-alert/send-email/
estimated_tokens: 10169
product: InfluxDB OSS v2
version: v2
---

# Send alert email

This page documents an earlier version of InfluxDB OSS. [InfluxDB 3 Core](/influxdb3/core/) is the latest stable version.

#### API token hashing is enabled by default in InfluxDB OSS 2.9.0

Stronger token security: tokens are stored as hashes on disk, so a copy of the database file doesn’t expose usable tokens. Existing tokens are hashed on first startup and the original strings can’t be recovered afterward — **capture any plaintext tokens you still need before you upgrade**.

For more information, see [Token hashing](/influxdb/v2/admin/tokens/#token-hashing).

Send an alert email using a third-party service, such as [SendGrid](https://sendgrid.com/), [Amazon Simple Email Service (SES)](https://aws.amazon.com/ses/), [Mailjet](https://www.mailjet.com/), or [Mailgun](https://www.mailgun.com/). To send an alert email, complete the following steps:

1. [Create a check](/influxdb/v2/monitor-alert/checks/create/#create-a-check-in-the-influxdb-ui) to identify the data to monitor and the status to alert on.
2. Set up your preferred email service (sign up, retrieve API credentials, and send test email):
    -   **SendGrid**: See [Getting Started With the SendGrid API](https://sendgrid.com/docs/API_Reference/api_getting_started.html)
    -   **AWS Simple Email Service (SES)**: See [Using the Amazon SES API](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email.html). Your AWS SES request, including the `url` (endpoint), authentication, and the structure of the request may vary. For more information, see [Amazon SES API requests](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-ses-api-requests.html) and [Authenticating requests to the Amazon SES API](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-ses-api-authentication.html).
    -   **Mailjet**: See [Getting Started with Mailjet](https://dev.mailjet.com/email/guides/getting-started/)
    -   **Mailgun**: See [Mailgun Signup](https://signup.mailgun.com/new/signup)
3. [Create an alert email task](#create-an-alert-email-task) to call your email service and send an alert email.

In the procedure below, we use the **Task** page in the InfluxDB UI (user interface) to create a task. Explore other ways to [create a task](/influxdb/v2/process-data/manage-tasks/create-task/).

### Create an alert email task

1. In the InfluxDB UI, select **Tasks** in the navigation menu on the left.
    
    Tasks
    
2. Click **Create Task**.
    
3. In the **Name** field, enter a descriptive name, for example, **Send alert email**, and then enter how often to run the task in the **Every** field, for example, `10m`. For more detail, such as using cron syntax or including an offset, see [Task configuration options](/influxdb/v2/process-data/task-options/).
    
4. In the right panel, enter the following detail in your **task script** (see [examples below](#examples)):
    
    -   Import the [Flux HTTP package](/flux/v0/stdlib/http/).
    -   (Optional) Store your API key as a secret for reuse. First, [add your API key as a secret](/influxdb/v2/admin/secrets/add/), and then import the [Flux InfluxDB Secrets package](/flux/v0/stdlib/influxdata/influxdb/secrets/).
    -   Query the `statuses` measurement in the `_monitoring` bucket to retrieve all statuses generated by your check.
    -   Set the time range to monitor; use the same interval that the task is scheduled to run. For example, `range (start: -task.every)`.
    -   Set the `_level` to alert on, for example, `crit`, `warn`, `info`, or `ok`.
    -   Use the `map()` function to evaluate the criteria to send an alert using `http.post()`.
    -   Specify your email service `url` (endpoint), include applicable request `headers`, and verify your request `data` format follows the format specified for your email service.

#### Examples

<!-- Tabbed content: Select one of the following options -->

**SendGrid:**

The example below uses the SendGrid API to send an alert email when more than 3 critical statuses occur since the previous task run.

```js
import "http"
import "json"
// Import the Secrets package if you store your API key as a secret.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"

// Retrieve the secret if applicable. Otherwise, skip this line
// and add the API key as the Bearer token in the Authorization header.
SENDGRID_APIKEY = secrets.get(key: "SENDGRID_APIKEY")

numberOfCrits = from(bucket: "_monitoring")
    |> range(start: -task.every)
    |> filter(fn: (r) => r._measurement == "statuses" and r._level == "crit")
    |> count()

numberOfCrits
    |> map(
        fn: (r) => if r._value > 3 then
            {r with _value: http.post(
                url: "https://api.sendgrid.com/v3/mail/send",
                headers: {"Content-Type": "application/json", "Authorization": "Bearer ${SENDGRID_APIKEY}"},
                data: json.encode(
                    v: {
                        "personalizations": [
                            {
                                "to": [
                                    {
                                        "email": "jane.doe@example.com"
                                    }
                                ]
                            }
                        ],
                        "from": {
                            "email": "john.doe@example.com"
                        },
                        "subject": "InfluxDB critical alert",
                        "content": [
                            {
                                "type": "text/plain",
                                "value": "There have been ${r._value} critical statuses."
                            }
                        ]
                    }
                )
            )}
        else
            {r with _value: 0},
    )
```

**AWS SES:**

The example below uses the AWS SES API v2 to send an alert email when more than 3 critical statuses occur since the last task run.

Your AWS SES request, including the `url` (endpoint), authentication, and the structure of the request may vary. For more information, see [Amazon SES API requests](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-ses-api-requests.html) and [Authenticating requests to the Amazon SES API](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-ses-api-authentication.html). We recommend signing your AWS API requests using the [Signature Version 4 signing process](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html).

```js
import "http"
import "json"
// Import the Secrets package if you store your API credentials as secrets.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"

// Retrieve the secrets if applicable. Otherwise, skip this line
// and add the API key as the Bearer token in the Authorization header.
AWS_AUTH_ALGORITHM = secrets.get(key: "AWS_AUTH_ALGORITHM")
AWS_CREDENTIAL = secrets.get(key: "AWS_CREDENTIAL")
AWS_SIGNED_HEADERS = secrets.get(key: "AWS_SIGNED_HEADERS")
AWS_CALCULATED_SIGNATURE = secrets.get(key: "AWS_CALCULATED_SIGNATURE")

numberOfCrits = from(bucket: "_monitoring")
    |> range(start: -task.every)
    |> filter(fn: (r) => r.measurement == "statuses" and r._level == "crit")
    |> count()

numberOfCrits
    |> map(
        fn: (r) => if r._value > 3 then
            {r with _value: http.post(
                url: "https://email.your-aws-region.amazonaws.com/sendemail/v2/email/outbound-emails",
                headers: {
                    "Content-Type": "application/json",
                    "Authorization": "Bearer ${AWS_AUTH_ALGORITHM}${AWS_CREDENTIAL}${AWS_SIGNED_HEADERS}${AWS_CALCULATED_SIGNATURE}"},
                data: json.encode(v: {
                        "Content": {
                            "Simple": {
                                "Body": {
                                    "Text": {
                                        "Charset": "UTF-8",
                                        "Data": "There have been ${r._value} critical statuses."
                                    }
                                },
                                "Subject": {
                                    "Charset": "UTF-8",
                                    "Data": "InfluxDB critical alert"
                                }
                            }
                        },
                        "Destination": {
                            "ToAddresses": [
                                "john.doe@example.com"
                            ]
                        }
                    }
                )
            )}
        else
            {r with _value: 0},
    )
```

For details on the request syntax, see [SendEmail API v2 reference](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html).

**Mailjet:**

The example below uses the Mailjet Send API to send an alert email when more than 3 critical statuses occur since the last task run.

To view your Mailjet API credentials, sign in to Mailjet and open the [API Key Management page](https://app.mailjet.com/account/api_keys).

```js
import "http"
import "json"
// Import the Secrets package if you store your API keys as secrets.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"

// Retrieve the secrets if applicable. Otherwise, skip this line
// and add the API keys as Basic credentials in the Authorization header.
MAILJET_APIKEY = secrets.get(key: "MAILJET_APIKEY")
MAILJET_SECRET_APIKEY = secrets.get(key: "MAILJET_SECRET_APIKEY")

numberOfCrits = from(bucket: "_monitoring")
    |> range(start: -task.every)
    |> filter(fn: (r) => r.measurement == "statuses" and "r.level" == "crit")
    |> count()

numberOfCrits
    |> map(
        fn: (r) => if r._value > 3 then
            {r with
                _value: http.post(
                    url: "https://api.mailjet.com/v3.1/send",
                    headers: {
                        "Content-type": "application/json",
                        "Authorization": "Basic ${MAILJET_APIKEY}:${MAILJET_SECRET_APIKEY}"
                    },
                    data: json.encode(
                        v: {
                            "Messages": [
                                {
                                    "From": {"Email": "jane.doe@example.com"},
                                    "To": [{"Email": "john.doe@example.com"}],
                                    "Subject": "InfluxDB critical alert",
                                    "TextPart": "There have been ${r._value} critical statuses.",
                                    "HTMLPart": "<h3>${r._value} critical statuses</h3><p>There have been ${r._value} critical statuses.",
                                },
                            ],
                        },
                    ),
                ),
            }
        else
            {r with _value: 0},
    )
```

**Mailgun:**

The example below uses the Mailgun API to send an alert email when more than 3 critical statuses occur since the last task run.

To view your Mailgun API keys, sign in to Mailjet and open [Account Security - API security](https://app.mailgun.com/app/account/security/api_keys). Mailgun requires that a domain be specified via Mailgun. A domain is automatically created for you when you first set up your account. You must include this domain in your `url` endpoint (for example, `https://api.mailgun.net/v3/YOUR_DOMAIN` or `https://api.eu.mailgun.net/v3/YOUR_DOMAIN`. If you’re using a free version of Mailgun, you can set up a maximum of five authorized recipients (to receive email alerts) for your domain. To view your Mailgun domains, sign in to Mailgun and view the [Domains page](https://app.mailgun.com/app/sending/domains).

```js
import "http"
import "json"
// Import the Secrets package if you store your API key as a secret.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"

// Retrieve the secret if applicable. Otherwise, skip this line
// and add the API key as the Bearer token in the Authorization header.
MAILGUN_APIKEY = secrets.get(key: "MAILGUN_APIKEY")

numberOfCrits = from(bucket: "_monitoring")
    |> range(start: -task.every)
    |> filter(fn: (r) => r["_measurement"] == "statuses")
    |> filter(fn: (r) => r["_level"] == "crit")
    |> count()

numberOfCrits
    |> map(
        fn: (r) => if r._value > 1 then
            {r with _value: http.post(
                url: "https://api.mailgun.net/v3/YOUR_DOMAIN/messages",
                headers: {
                    "Content-type": "application/json",
                    "Authorization": "Basic api:${MAILGUN_APIKEY}"
                },
                data: json.encode(v: {
                        "from": "Username <mailgun@YOUR_DOMAIN_NAME>",
                        "to": "email@example.com",
                        "subject": "InfluxDB critical alert",
                        "text": "There have been ${r._value} critical statuses."
                    }                
                )
            )}
        else
            {r with _value: 0},
    )
```

<!-- End tabbed content -->

#### Related

-   [Manage checks](/influxdb/v2/monitor-alert/checks/)

[alert](/influxdb/v2/tags/alert/) [email](/influxdb/v2/tags/email/) [notifications](/influxdb/v2/tags/notifications/) [check](/influxdb/v2/tags/check/)
