Guide

Send Email to Discord with a Webhook (CLI)

Plenty of teams and communities live in Discord, not Slack, and want important email to land in a channel. Discord's incoming webhooks make that a one-line POST — no bot to register, host, or keep online. The Nylas CLI gives you the matching messages as JSON; a curl to the webhook posts them as rich embeds. This guide wires email to a Discord channel, formats a clean embed, and scopes it to the messages worth pinging people about.

Written by Pouya Sanooei Software Engineer

VerifiedCLI 3.1.16 · Gmail, Outlook · last tested June 8, 2026

Command references used in this guide: nylas email search, nylas email list, and nylas email read.

How do you send email to a Discord channel?

You send email to Discord by POSTing the message to a channel webhook. Create the webhook in the channel's settings to get a URL, then pull matching mail with nylas email search --json and curl each message to that URL. There's no bot to register or host — an incoming webhook is a stateless endpoint, documented in the Discord webhook docs.

The webhook URL is the only credential, and it's a secret: anyone with it can post to the channel, so keep it out of source control and in an environment variable. With the URL set, a single curl turns any matched message into a channel post, and the CLI's JSON output means you're formatting structured fields, not scraping text.

# A plain-content post for one matched message
hook="$DISCORD_WEBHOOK_URL"
nylas email search "subject:incident newer_than:1h" --json --limit 10 \
  | jq -r '.[] | "**" + (.subject // "(no subject)") + "** from " + (.from[0].email // "")' \
  | while read -r line; do
      curl -s -X POST "$hook" -H "Content-Type: application/json" \
        -d "{\"content\": \"$line\"}"
    done

How do you format a rich embed?

Format a rich embed by sending an embeds array instead of plain content. An embed gives you a title, a description, fields, a color bar, and a timestamp, so an email shows up as a tidy card rather than a wall of text. Map the subject to the title, the sender to a field, and a snippet of the body to the description for an at-a-glance post.

Build the embed JSON with jq so quoting and escaping are correct — a subject with a quote or a newline would otherwise break the payload. Discord accepts up to 10 embeds per message, so you can batch a few related emails into one post. Keep descriptions short; an embed is a notification, and a link back to the full thread beats pasting the entire body.

# One message as a rich embed
nylas email search "subject:incident newer_than:1h" --json --limit 1 \
  | jq '{embeds: [ .[0] | {
        title: (.subject // "(no subject)"),
        description: ((.snippet // "") | .[0:300]),
        color: 15158332,
        fields: [ {name: "From", value: (.from[0].email // "unknown")} ]
      } ]}' \
  | curl -s -X POST "$DISCORD_WEBHOOK_URL" \
      -H "Content-Type: application/json" -d @-

How do you avoid spamming the channel?

Avoid noise by scoping the search tightly and running on the right cadence. A query like subject:incident newer_than:1h on an hourly schedule posts only the messages that matter, instead of mirroring the whole inbox into a channel nobody can then read. The scope of the search is your filter — make it specific.

For instant alerts, drive the same POST from a real-time webhook when a matching message arrives, rather than polling. De-duplicate on the message ID if you both poll and receive webhooks, so a message can't post twice. The Discord webhook URL is independent of the mailbox grant, so rotate it on its own if it ever leaks into a log.

Next steps