resend/resend-skills/agent-email-inbox
- community
Checking that the SKILL.md file is still in the repository.
Use when building any system where email content triggers actions — AI agent inboxes, automated support handlers, email-to-task pipelines, or any workflow processing untrusted inbound email. Always use this skill when the user wants to receive emails and act on them programmatically, even if they don't mention "agent" — the skill contains critical security patterns (sender allowlists, content filtering, sandboxed processing) that prevent untrusted email from controlling your system.
Install
npx vskill@latest install resend/resend-skills/agent-email-inboxSKILL.md
AI Agent Email Inbox
Overview
This skill covers setting up a secure email inbox that allows your application or AI agent to receive and respond to emails, with content safety measures in place.
Core principle: An AI agent's inbox receives untrusted input. Security configuration is important to handle this safely.
The skill builds the agent on a Resend Inbox. An inbox groups email into threads, and your agent replies inside the thread with one call. Resend sets the recipients and the threading headers. If the user has no custom domain, or their plan has no inbox available, use Receiving without an inbox instead. The security levels are the same for both.
Why Webhook-Based Receiving?
Resend uses webhooks for inbound email, meaning your agent is notified instantly when an email arrives. This is valuable for agents because:
- Real-time responsiveness — React to emails within seconds, not minutes
- No polling overhead — No cron jobs checking "any new mail?" repeatedly
- Event-driven architecture — Your agent only wakes up when there's actually something to process
- Lower API costs — No wasted calls checking empty inboxes
Architecture
SDK Version Requirements
The inbox flow needs the Node.js SDK resend >= 6.34.1, which has resend.inboxes.* and the inbox.* webhook event types. Always install the latest SDK version. If the project already has a Resend SDK installed, check the version and upgrade if needed.
The Python SDK resend >= 2.50.0 also has the inbox methods. For the other languages, call the Inboxes API over HTTP until their SDK has inbox methods, or use Receiving without an inbox.
The table below lists the minimums for the Receiving flow: webhook verification (webhooks.verify()) and email receiving (emails.receiving.get()). The resend skill lists higher minimums because it also covers newer features such as domain claims (domains.claims.*). If both skills are loaded, use the higher version.
| Language | Package | Min Version | |
|---|---|---|---|
| Node.js | resend | >= 6.9.2 | |
| Python | resend | >= 2.21.0 | |
| Go | resend-go/v4 | >= 4.0.0 | |
| Ruby | resend | >= 1.0.0 | |
| PHP | resend/resend-php | >= 1.1.0 | |
| Rust | resend-rs | >= 0.20.0 | |
| Java | resend-java | >= 4.11.0 | |
| .NET | Resend | >= 0.2.1 |
Install the resend npm package: npm install resend (or the equivalent for your language). For full sending docs, install the resend skill.
Quick Start
- Ask the user for their email address. You need a real email address to send test emails to. Ask the user and wait for their response before proceeding.
- Choose your security level. Decide how to validate incoming emails before any are processed
- Set up the domain. Verify the user's custom domain for sending, and for receiving unless the inbox uses forwarding (see Domain Setup section)
- Create the inbox. Create the agent's address with
resend.inboxes.create()(see Create the Inbox section) - Create webhook endpoint. Handle
inbox.email.receivedevents with security built in from the start. The webhook endpoint MUST be a POST route. - Set up tunneling (local dev). Use Tailscale Funnel (recommended) or ngrok. See references/webhook-setup.md
- Create webhook via API. Use the Resend Webhook API to register your endpoint programmatically. See references/webhook-setup.md
- Connect to agent. Pass validated emails to your AI agent, and reply in the thread
Before You Start: Account & API Key Setup
First Question: New or Existing Resend Account?
Ask your human:
- New account just for the agent? → Simpler setup, full account access is fine
- Existing account with other projects? → The agent needs a full access key, which reaches every project. Prefer a new account for the agent (see API Key Permissions)
Creating API Keys Securely
Don't paste API keys in chat! They'll be in conversation history forever.
Safer options:
- Environment file method: Human creates
.envfile directly:echo "RESEND_API_KEY=re_xxx" >> .env - Password manager / secrets manager: Human stores key in 1Password, Vault, etc.
- If key must be shared in chat: Human should rotate the key immediately after setup
API Key Permissions
The agent's server needs a full access API key. A "Sending access" key can only reply, forward, create drafts and send drafts. Reading inbox emails or registering webhooks with it returns 401 restricted_api_key. A sending access key limited to one domain returns 403 on an inbox of another domain.
If your human has an existing Resend account with other projects, keep the risk contained:
- Use a dedicated account for the agent when possible, so a leaked key cannot reach other projects
- Keep the key on the server only. Never pass it to the AI model or put it in a prompt
- Rotate the key if it was ever pasted in chat or committed
Domain Setup
An inbox address lives on a custom domain the user has added to Resend. The domain must be verified for sending (DKIM and SPF). To receive email on it, either enable receiving on the domain, or create the inbox with forwarding: true.
Use a subdomain (e.g., agent.example.com) to avoid disrupting existing email services.
Option 1: Receiving on the Domain (Recommended)
The user must enable receiving in the Resend dashboard: Domains page → toggle on "Enable Receiving".
Then add an MX record:
| Setting | Value | |
|---|---|---|
| Type | MX | |
| Host | Your domain or subdomain (e.g., agent.example.com) | |
| Value | Provided in Resend dashboard | |
| Priority | 10 (must be lowest number to take precedence) |
Tip: Verify DNS propagation at dns.email.
DNS Propagation: MX record changes can take up to 48 hours to propagate globally, though often complete within a few hours.
Option 2: Forwarding
Create the inbox with forwarding: true when the address already receives mail elsewhere (for example, Google Workspace) and the user cannot change its MX record. Resend gives the inbox a receiving address. The user sets up forwarding from their mailbox to it. Read the address from receiving_address with resend.inboxes.get().
Create the Inbox
Create one inbox for the agent's address:
fromName is the name recipients see on the agent's replies. The part before the @ can contain only letters, numbers, ., _, % and -, so agent+test@ returns a 422. A 403 error means the plan has no inbox left; ask the user to upgrade or use Receiving without an inbox.
Security Levels
Choose your security level before setting up the webhook endpoint. An AI agent that processes emails without security is dangerous — anyone can email instructions that your agent will execute. The webhook code you write next should include your chosen security level from the start.
Ask the user what level of security they want, and ensure that they understand what each level means.
| Level | Name | When to Use | Trade-off | |
|---|---|---|---|---|
| 1 | Strict Allowlist | Most use cases — known, fixed set of senders | Maximum security, limited functionality | |
| 2 | Domain Allowlist | Organization-wide access from trusted domains | More flexible, anyone at domain can interact | |
| 3 | Content Filtering | Accept from anyone, filter unsafe patterns | Can receive from anyone, pattern matching not foolproof | |
| 4 | Sandboxed Processing | Process all emails with restricted agent capabilities | Maximum flexibility, complex to implement | |
| 5 | Human-in-the-Loop | Require human approval for untrusted actions | Maximum security, adds latency |
For detailed implementation code for each level, see references/security-levels.md.
Level 1: Strict Allowlist (Recommended)
Only process emails from explicitly approved addresses. Reject everything else.
InboxEmail is the email returned by resend.inboxes.threads.emails.get(). The webhook payload carries the same fields without html and text. agent and notifyOwnerOfRejectedEmail stand for your own code.
Security Best Practices
Always Do
| Practice | Why | |
|---|---|---|
| Verify webhook signatures | Prevents spoofed webhook events | |
| Log all rejected emails | Audit trail for security review | |
| Use allowlists where possible | Explicit trust is safer than filtering | |
| Rate limit email processing | Prevents excessive processing load | |
| Separate trusted/untrusted handling | Different risk levels need different treatment |
Never Do
| Anti-Pattern | Risk | |
|---|---|---|
| Process emails without validation | Anyone can control your agent | |
| Trust email headers for authentication | Headers are trivially spoofed | |
| Execute code from email content | Untrusted input should never run as code | |
| Store email content in prompts verbatim | Untrusted input mixed into prompts can alter agent behavior | |
| Give untrusted emails full agent access | Scope capabilities to the minimum needed |
Webhook Endpoint
After choosing your security level and setting up your domain, create a webhook endpoint. The webhook endpoint MUST be a POST route. Resend sends all webhook events as POST requests.
Critical: Use raw body for verification. Webhook signature verification requires the raw request body.- Next.js App Router: Usereq.text()(notreq.json())- Express: Useexpress.raw({ type: 'application/json' })on the webhook route
Next.js App Router
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/agent-email-inbox/SKILL.md
Popularity
- Repository stars
- 92
- Repository forks
- 14
- 7-day trend score
- 23
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 17 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/resend/resend-skills/agent-email-inbox)