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:

  1. MX records — DNS entries that tell the internet where to deliver your mail
  2. SMTP daemon — Postfix or Exim to accept the connection and store the message
  3. Spam filtering — SpamAssassin or rspamd to reject junk before it fills your queue
  4. TLS certificates — required by senders that enforce opportunistic TLS
  5. 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 | iex

2. Authenticate

nylas auth config

Paste 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:   active

The 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     3

5. 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:     active

Subscribe 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_clicked

List and manage your webhooks:

# List all webhooks
nylas webhook list

# Delete a webhook
nylas webhook delete whk_9p0q1r2s3t4u

Available message triggers

TriggerFires when
message.createdNew email arrives
message.updatedMessage flags change (e.g., marked read)
message.bounce_detectedA sent message bounced
message.send_successA sent message was accepted by the recipient server
message.send_failedA send attempt failed
message.openedRecipient opened the message (pixel tracking)
message.link_clickedRecipient 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 --json

Each 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_9p0q1r2s3t4u

Next steps