Install
openclaw skills install @aaronbatchelder/shellmailFull email client for AI agents via the ShellMail API. Read inbox, extract OTP codes, and search messages; also send and reply to email, mark/archive/permanently delete messages, and create, recover, or delete the ShellMail address itself. Uses curl/python3 to reach the ShellMail API only. Trigger ONLY when the user explicitly asks to use ShellMail or their shellmail.ai address (e.g. "check my shellmail", "get the OTP from shellmail", "send from my shellmail address"). Do NOT trigger for generic email requests or other email providers.
openclaw skills install @aaronbatchelder/shellmailEmail for AI agents via shellmail.ai. A full email client, not just a reader: it can check the inbox, extract OTPs, search, send and reply to email, mark/archive/permanently delete messages, and create, recover, or delete the ShellMail address itself.
Be transparent with the user about what this skill can do. The full capability set is:
| Capability | Commands | Risk |
|---|---|---|
| Read mail & OTPs | inbox, read, otp, search, sent, addresses | Exposes sensitive mail contents and OTP codes |
| Send mail | send, reply | Sends email to arbitrary recipients as the user's address |
| Modify mailbox | mark-read, mark-unread, archive | Reversible state changes |
| Destroy data | delete, delete-address | Irreversible — see Destructive Commands |
| Account lifecycle | create, recover | Creates addresses; recovery re-issues tokens via the recovery email |
Privileges required:
curl and python3 (jq used if present)SHELLMAIL_API_URL, default https://shellmail.ai) — no other hostsSHELLMAIL_TOKEN bearer token, which grants all of the above on the associated addressdelete and delete-address are irreversible. The script refuses to run them without a --confirm flag, and you MUST NOT supply --confirm unless the user has explicitly approved that specific action in this conversation:
delete <id> permanently removes an email. Before running with --confirm, tell the user which email (sender/subject) will be deleted and get their approval. Never delete mail as part of a broader task the user didn't ask for.delete-address permanently deletes the address and all of its mail and revokes the token. Before running with --confirm, warn the user that all mail is destroyed, that the address enters a 14-day recovery hold, and confirm they want to proceed. Never run this on your own initiative.This skill requires a sensitive SHELLMAIL_TOKEN that grants full access to your inbox and OTPs.
When you set up this skill for the first time, you'll be instructed to save the token into agent configuration using gateway config.patch. This means:
Best practices:
gateway config.patch command output before confirmingIf no token is configured:
auto for the name to generate a random address (e.g., "swift-reef-4821"){baseDir}/scripts/shellmail.sh create <name> <recovery_email>autogateway config.patch {"skills":{"entries":{"shellmail":{"env":{"SHELLMAIL_TOKEN":"sm_..."}}}}}
⚠️ Important: Before running this command, explain to the user:
inbox right away — every new inbox contains a welcome email, so the user
immediately sees receiving works. Show it to them{baseDir}/scripts/shellmail.sh otp --wait 30 — the
verification code is extracted automaticallyOnly use recovery if the user explicitly says they lost access to an existing inbox they own:
{baseDir}/scripts/shellmail.sh recover <address@shellmail.ai> <recovery_email>
This sends a new token to the recovery email on file. Do not suggest this for "address taken" errors.
{baseDir}/scripts/shellmail.sh <command>
{baseDir}/scripts/shellmail.sh inbox
{baseDir}/scripts/shellmail.sh inbox --unread
{baseDir}/scripts/shellmail.sh read <email_id>
# Get latest OTP
{baseDir}/scripts/shellmail.sh otp
# Wait up to 30 seconds for OTP
{baseDir}/scripts/shellmail.sh otp --wait 30
# Filter by sender
{baseDir}/scripts/shellmail.sh otp --wait 30 --from github.com
{baseDir}/scripts/shellmail.sh search --query "verification"
{baseDir}/scripts/shellmail.sh search --otp
{baseDir}/scripts/shellmail.sh search --from stripe.com
Sends mail to arbitrary recipients from the user's ShellMail address. Only send when the user explicitly asks, and show them the recipient/subject/body first.
{baseDir}/scripts/shellmail.sh send <to> --subject "Subject" --body "Body"
{baseDir}/scripts/shellmail.sh reply <email_id> --body "Reply text"
{baseDir}/scripts/shellmail.sh sent # list sent emails
{baseDir}/scripts/shellmail.sh mark-read <id>
{baseDir}/scripts/shellmail.sh mark-unread <id>
{baseDir}/scripts/shellmail.sh archive <id>
{baseDir}/scripts/shellmail.sh addresses # show current address info
{baseDir}/scripts/shellmail.sh health
Refuses to run without --confirm. Only add --confirm after the user has explicitly approved deleting that specific email (see Destructive Commands).
{baseDir}/scripts/shellmail.sh delete <id> --confirm
Only apply these when the user is explicitly referring to their ShellMail inbox — not for generic email requests or other providers.
User says "check my shellmail":
{baseDir}/scripts/shellmail.sh inbox --unread
User says "get the verification code from shellmail":
{baseDir}/scripts/shellmail.sh otp --wait 30
User says "wait for the GitHub OTP in my shellmail inbox":
{baseDir}/scripts/shellmail.sh otp --wait 30 --from github.com
If the user wants to revoke the skill's access to their ShellMail inbox:
gateway config.patch '{"skills":{"entries":{"shellmail":{"env":{"SHELLMAIL_TOKEN":""}}}}}'
Deletes the address and all associated mail and revokes the token. Refuses to run without --confirm. Only add --confirm after warning the user and getting their explicit approval (see Destructive Commands).
{baseDir}/scripts/shellmail.sh delete-address --confirm
Note: Deleted addresses enter a 14-day hold window and can only be reclaimed by the original owner using the recovery email.
Base URL: https://shellmail.ai
All endpoints use Authorization: Bearer $SHELLMAIL_TOKEN
| Endpoint | Method | Description |
|---|---|---|
/api/mail | GET | List emails (?unread=true&limit=50) |
/api/mail/:id | GET | Read full email |
/api/mail/:id | PATCH | Update {is_read, is_archived} |
/api/mail/:id | DELETE | Permanently delete email (irreversible) |
/api/mail/otp | GET | Get OTP (?timeout=30000&from=domain) |
/api/mail/search | GET | Search (?q=text&from=domain&has_otp=true) |
/api/mail/send | POST | Send or reply {to, subject, body_text, body_html?, reply_to_id?} |
/api/mail/sent | GET | List sent emails |
/api/addresses | POST | Create {local, recovery_email} |
/api/addresses/me | DELETE | Delete address and all mail (irreversible) |
/api/recover | POST | Re-issue token via recovery email {address, recovery_email} |
/health | GET | API health check (unauthenticated) |