Guide

Send Email from the Command Line

Most command-line email tools require a local SMTP relay (Postfix, sendmail) or only work with one provider. Nylas CLI sends email from Linux, macOS, and Windows terminals across 6 providers — Gmail, Outlook, Exchange, Yahoo, iCloud, and IMAP — with 72+ commands, built-in OAuth2, and zero SMTP configuration. Setup takes under 2 minutes.

By Pouya Sanooei

The problem with sending email from the command line

The mail command has shipped on Unix systems since 1977, and mailx since the early 1980s — but neither supports OAuth2. That's a problem: Google disabled “less secure app” passwords for Gmail in September 2024, and Microsoft retired Basic Auth for Exchange Online in October 2022. If your CLI tool doesn't handle OAuth2 token refresh (Gmail access tokens expire every 3,600 seconds per Google's OAuth 2.0 documentation), it can't reliably send email through these providers.

The Nylas CLI bypasses all of this. It talks directly to the Nylas API, which handles OAuth2 token refresh, provider abstraction, and connection management. Authenticate once with a single command, then all 72+ commands work across Gmail, Outlook, Exchange, Yahoo, iCloud, and IMAP on any platform.

1. Install

# macOS / Linux (Homebrew)
brew install nylas/nylas-cli/nylas

# Or build from source (requires Go 1.23+)
go install github.com/nylas/cli/cmd/nylas@latest

2. Authenticate your mailbox

Head to dashboard-v3.nylas.com, create an application, and connect your mailbox. Then grab your API key and run:

nylas auth config
# Paste your API key when prompted

# Verify it works
nylas auth whoami
# => Authenticated as you@company.com (Google Workspace)

Running nylas auth config stores credentials in your system keyring. You can verify the connection at any time:

Authentication Status

Current Account:
  Email: dev@example.com
  Provider: google
  Grant ID: d3f4a5b6-c7d8-9e0f-a1b2-c3d4e5f6g7h8
  Status: ✓ Valid

Configuration:
  Region: us
  Config Path: /home/dev/.config/nylas/config.yaml
  Secret Store: system keyring

3. Send an email

nylas email send \
  --to "colleague@company.com" \
  --subject "Quarterly report attached" \
  --body "Hi -- please review the Q4 numbers before Friday."

# Skip the confirmation prompt
nylas email send --to user@example.com --subject "Quick note" --body "..." --yes

# CC and BCC
nylas email send \
  --to alice@team.com \
  --cc bob@team.com \
  --bcc manager@team.com \
  --subject "Sprint update" \
  --body "All tasks on track."

After a successful send, the CLI confirms delivery:

✓ Email sent successfully

  Message ID: abc123def456
  To: jamie@example.com
  Subject: Deployment complete
  Sent at: 2026-03-25T15:30:00-04:00
# List recent emails
nylas email list --limit 10

# Only unread
nylas email list --unread

# Search by keyword
nylas email search "invoice" --limit 5

# Read a specific message
nylas email read msg_abc123

# Read the raw MIME source
nylas email read msg_abc123 --mime

Add --json to any list command for structured output you can pipe into jq or feed to an agent:

nylas email list --limit 1 --json
[
  {
    "id": "a1b2c3d4e5f6g7h8",
    "grant_id": "d3f4a5b6-c7d8-9e0f-a1b2-c3d4e5f6g7h8",
    "thread_id": "a1b2c3d4e5f6g7h8",
    "subject": "Re: Project Atlas — Q2 launch timeline",
    "from": [{"name": "Sarah Chen", "email": "sarah@example.com"}],
    "to": [{"name": "Alex Rivera", "email": "alex@example.com"}],
    "snippet": "The staging environment is ready. I've attached the test results from Friday's run...",
    "date": "2026-03-25T14:22:18-04:00",
    "unread": true,
    "starred": false,
    "folders": ["INBOX"],
    "object": "message"
  }
]

5. Schedule emails for later

# Send in 2 hours
nylas email send --to team@company.com --subject "Reminder" --body "..." --schedule 2h

# Send tomorrow morning
nylas email send --to team@company.com --subject "Standup" --body "..." --schedule "tomorrow 9am"

# Send on a specific date
nylas email send --to client@example.com --subject "Follow-up" --body "..." --schedule "2026-03-01 14:30"

6. Track opens and clicks

nylas email send \
  --to prospect@company.com \
  --subject "Proposal attached" \
  --body "Here is our proposal for Q2." \
  --track-opens \
  --track-links \
  --track-label "q2-outreach"

# Tracking events are delivered via webhooks:
nylas webhook create \
  --url https://your-server.com/hooks \
  --triggers message.opened,message.link_clicked

7. Sign and encrypt with GPG

No extra tools needed. If you have GPG installed, the CLI signs and encrypts natively using RFC 3156 PGP/MIME:

# Sign with your GPG key
nylas email send --to legal@partner.com --subject "Contract" --body "..." --sign

# Encrypt with recipient's public key (auto-fetched from keyservers)
nylas email send --to legal@partner.com --subject "Contract" --body "..." --encrypt

# Both (recommended for maximum security)
nylas email send --to legal@partner.com --subject "Contract" --body "..." --sign --encrypt

# Decrypt and verify a received message
nylas email read msg_xyz789 --decrypt --verify

See the full GPG encrypted email guide for key management, troubleshooting, and multi-recipient encryption.

8. AI-powered smart compose

# Generate a draft from a prompt
nylas email smart-compose --prompt "Thank them for the meeting and confirm next steps"

# Generate a reply to a specific message
nylas email smart-compose --message-id msg_abc123 --prompt "Accept the invitation politely"

# AI inbox analysis
nylas email ai analyze --unread
# => Summary, categories, action items, urgency levels

9. Scripting and automation

Every command supports --json output, so you can pipe it into jq, your agent, or any other tool:

# Morning inbox summary script
#!/bin/bash
echo "=== Inbox Summary ==="
unread=$(nylas email list --unread --json | jq length)
echo "Unread: $unread"

# Urgent check
nylas email list --unread --json \
  | jq '[.[] | select(.subject | test("urgent|asap"; "i"))]' \
  | jq 'length' \
  | xargs -I{} echo "Urgent: {}"

# Bulk send from a CSV
while IFS=, read -r email name; do
  nylas email send \
    --to "$email" \
    --subject "Hello $name" \
    --body "Your account is ready." \
    --yes
  sleep 2
done < contacts.csv

10. Pipe to AI agents

The CLI is designed for composability. Pipe JSON output to any agent running in your terminal:

# Agent triages your inbox
nylas email list --unread --json | agent triage --rules ./inbox-rules.yml

# Agent drafts a reply, CLI sends it
nylas email send \
  --to sarah@team.io \
  --subject "Re: Follow-up" \
  --body "$(agent draft --context msg_a1f2)" \
  --yes

# Start the built-in MCP server for Claude, Cursor, or VS Code
nylas mcp install --assistant claude-code

Model Context Protocol (MCP) lets AI assistants call CLI tools directly. See the full AI agent email access guide for MCP setup and tool configuration.


How it compares

Featuremail / mailxmuttNylas CLI
Send emailYes (needs MTA)Yes (needs SMTP)Yes (one command)
Read inboxLocal onlyYesYes
Gmail OAuth2NoComplexBuilt-in
Microsoft 365NoComplexBuilt-in
GPG sign/encryptManualBuilt-inBuilt-in
Calendar accessNoNoYes
JSON outputNoNoYes (--json)
AI composeNoNoYes
MCP serverNoNoBuilt-in

Next steps