# Email for OpenClaw that keeps working

> An email to your agent’s Pidgeon address starts an OpenClaw conversation, one per email thread. The agent’s answer goes back as a reply in that thread, and a reply to the reply carries on the same conversation.

## Install it

```sh
openclaw plugins install @pidgeon-ai/openclaw
openclaw config set channels.pidgeon '{}' --strict-json
openclaw channels login --channel pidgeon
```

The last line opens Pidgeon's sign-in in your browser. You choose what the channel can do and which addresses it reaches; it needs only read and send. On a server with nobody there to sign in, put an API key in `PIDGEON_API_KEY` and skip the login. Then check it:

```sh
openclaw channels status --channel pidgeon --probe
```

## What reaches your agent

- **The text a person would see.** [Pidgeon Firewall](https://pidgeon.ai/firewall?utm_source=blog\&utm_campaign=openclaw) removes hidden text before the agent reads anything, and never hands it raw HTML.
- **Not spam, and not what the Firewall flags.** Mail asking the agent to send mail elsewhere, or addressed to an AI, waits in the inbox instead of becoming a turn. `channels status` counts it.
- **An allowed sender only when it really is them.** With an allowlist, a message from an allowed address counts only when it passes DMARC, because anyone can forge a From line.
- **Replies only.** The agent answers the email in front of it. It cannot write to a new recipient or start a thread, so a prompt hidden in one email cannot send mail anywhere.

## Why it keeps working

It is pure TypeScript with no native code, built for OpenClaw 2026.10, and run end to end on macOS and installed on Linux x64 and arm64. A compatibility job runs it against every new OpenClaw release; it is green on 2026.10.7 and 2026.10.10-beta.3.

It reads new mail from a cursor kept in OpenClaw's state store and queues each message before the cursor moves, so a restart resumes where it stopped, and mail that arrived while the Gateway was down is answered when it is back. `channels status` says `recovering` with the reason, or `blocked` when it is not signed in. It never says `running` while nothing arrives.

## Switching from AgentMail's plugin, in two minutes

1. Turn theirs off: `openclaw plugins disable agentmail`, or `openclaw plugins uninstall agentmail` to remove it.
2. Install this one with the three lines above.
3. Carry your sender rules over. AgentMail's channel denies everyone not on `allowFrom` by default; this one starts open. To keep the same behaviour, set `channels.pidgeon` to `{"dmPolicy": "allowlist", "allowFrom": [...]}` with the same addresses (`@customer.com` allows a whole domain).
4. Restart the Gateway: `openclaw gateway restart`.

Your agent's address changes from `@agentmail.to` to a Pidgeon one, unless the mail is on your own domain: then point the domain's MX records at Pidgeon and the address stays.

The full setup, every setting and named accounts are in [the OpenClaw guide](https://pidgeon.ai/docs/openclaw?utm_source=blog\&utm_campaign=openclaw.md). The plugin is on [ClawHub](https://clawhub.ai/pidgeon-ai/plugins/openclaw) and [npm](https://www.npmjs.com/package/@pidgeon-ai/openclaw).
