Guide
Receive Email Without an SMTP Server
You want an inbox that receives mail — without configuring MX records, installing Postfix, or wiring up spam filters. Nylas Inbound gives you a managed email address and a simple CLI to read messages. Works with Gmail, Outlook, Exchange, Yahoo, iCloud, and IMAP.
By Hazik
The problem with receiving email
Standing up a working inbound email pipeline from scratch requires five separate systems:
- MX records — DNS entries that tell the internet where to deliver your mail
- SMTP daemon — Postfix or Exim to accept the connection and store the message
- Spam filtering — SpamAssassin or rspamd to reject junk before it fills your queue
- TLS certificates — required by senders that enforce opportunistic TLS
- MIME parser — to decode multipart messages, attachments, and encoded headers
Postfix alone has issued 12 security advisories since 2020. Each one requires a patch, a restart, and a test to confirm mail still flows.
Nylas Inbound handles all of this. You get a managed address, a JSON API, and webhook delivery — without touching DNS or a mail daemon.
1. Install
# macOS / Linux (Homebrew)
brew install nylas/nylas-cli/nylas
# macOS / Linux / WSL (shell script)
curl -fsSL https://cli.nylas.com/install.sh | bash
# Windows (PowerShell)
irm https://cli.nylas.com/install.ps1 | iex2. Authenticate
nylas auth configPaste your Nylas API key when prompted. The CLI stores credentials in ~/.nylas/config.
3. Create an inbound inbox
Pick a name for your inbox. The CLI provisions a managed address under your Nylas subdomain.
nylas inbound create support✓ Inbound inbox created
Inbox ID: inb_7k8j9h0g1f2e
Address: support@yourapp.nylas.email
Status: activeThe full address is support@yourapp.nylas.email. Share it wherever you want to receive mail — contact forms, transactional flows, or test automation.
4. List your inboxes
# Human-readable table
nylas inbound list
# JSON output (pipe-friendly)
nylas inbound list --json INBOX ID ADDRESS STATUS MESSAGES
inb_7k8j9h0g1f2e support@yourapp.nylas.email active 14
inb_8m9n0p1q2r3s noreply@yourapp.nylas.email active 35. Read received messages
# List messages (most recent first)
nylas inbound messages inb_7k8j9h0g1f2e
# JSON output
nylas inbound messages inb_7k8j9h0g1f2e --json
# Unread only
nylas inbound messages inb_7k8j9h0g1f2e --unread --json[
{
"id": "msg_a1b2c3d4",
"from": [{ "name": "Alice Smith", "email": "alice@example.com" }],
"to": [{ "email": "support@yourapp.nylas.email" }],
"subject": "Login issue on mobile",
"snippet": "Hi, I can't log in on iOS 17. The button just spins...",
"date": "2026-03-28T09:14:22Z",
"unread": true
}
]6. Set up webhooks for real-time processing
Polling works for scripts and ad-hoc checks. For production, use a webhook so your server is notified the moment a message arrives.
nylas webhook create \
--url https://example.com/hook \
--triggers message.created✓ Webhook created
Webhook ID: whk_9p0q1r2s3t4u
URL: https://example.com/hook
Triggers: message.created
Status: activeSubscribe to multiple triggers at once by repeating the flag:
nylas webhook create \
--url https://example.com/hook \
--triggers message.created \
--triggers message.bounce_detected \
--triggers message.link_clickedList and manage your webhooks:
# List all webhooks
nylas webhook list
# Delete a webhook
nylas webhook delete whk_9p0q1r2s3t4uAvailable message triggers
| Trigger | Fires when |
|---|---|
| message.created | New email arrives |
| message.updated | Message flags change (e.g., marked read) |
| message.bounce_detected | A sent message bounced |
| message.send_success | A sent message was accepted by the recipient server |
| message.send_failed | A send attempt failed |
| message.opened | Recipient opened the message (pixel tracking) |
| message.link_clicked | Recipient clicked a tracked link |
7. Wildcard catch-all addresses
For test automation, create a wildcard inbox. Every address matching the pattern lands in the same inbox — no new inboxes per test run.
nylas inbound create "e2e-*@yourapp.nylas.email"In your tests, generate a unique address per run:
import { randomUUID } from 'node:crypto'
const testEmail = `e2e-${randomUUID()}@yourapp.nylas.email`
// Send your transactional email to testEmail
// Poll: nylas inbound messages inb_7k8j9h0g1f2e --jsonEach test gets a collision-free address. Parallel test workers don't interfere with each other.
8. Clean up
# Delete an inbox (and all its messages)
nylas inbound delete inb_7k8j9h0g1f2e
# Delete a webhook
nylas webhook delete whk_9p0q1r2s3t4uNext steps
- Send email from the terminal — outbound counterpart to this guide
- E2E email testing with Playwright — full walkthrough using inbound inboxes in Playwright tests
- Build an email agent with the CLI — process inbound messages with an AI agent
- Getting started with Nylas CLI — install, authenticate, and explore every command