home / skills / openclaw / skills / imap-email

imap-email skill

/skills/mvarrieur/imap-email

This skill reads and manages email via IMAP, enabling you to check, fetch, search, and mark messages as read across servers.

npx playbooks add skill openclaw/skills --skill imap-email

Review the files below or copy the command above to add this skill to your agents.

Files (7)
SKILL.md
5.7 KB
---
name: imap-email
description: Read and manage email via IMAP (ProtonMail Bridge, Gmail, etc.). Check for new/unread messages, fetch content, search mailboxes, and mark as read/unread. Works with any IMAP server including ProtonMail Bridge.
---

# IMAP Email Reader

Read, search, and manage email via IMAP protocol. Supports ProtonMail Bridge, Gmail IMAP, and any standard IMAP server.

## Quick Start

**Check for new emails:**
```bash
node skills/imap-email/scripts/imap.js check
```

**Fetch specific email:**
```bash
node skills/imap-email/scripts/imap.js fetch <uid>
```

**Mark as read:**
```bash
node skills/imap-email/scripts/imap.js mark-read <uid>
```

**Search mailbox:**
```bash
node skills/imap-email/scripts/imap.js search --from "[email protected]" --unseen
```

## Configuration

**Quick setup (ProtonMail Bridge):**
```bash
cd skills/imap-email
./setup.sh
```
The setup helper will prompt for Bridge credentials and test the connection.

**Manual setup:**
1. Copy `.env.example` to `.env` in the skill folder
2. Fill in your IMAP credentials
3. The `.env` file is automatically ignored by git

**Environment variables:**

```bash
IMAP_HOST=127.0.0.1          # Server hostname
IMAP_PORT=1143               # Server port
[email protected]
IMAP_PASS=your_password
IMAP_TLS=false               # Use TLS/SSL connection
IMAP_REJECT_UNAUTHORIZED=false  # Set to false for self-signed certs (optional)
IMAP_MAILBOX=INBOX           # Default mailbox
```

**⚠️ Security:** Never commit your `.env` file! It's already in `.gitignore` to prevent accidents.

**ProtonMail Bridge setup:**
- Install and run ProtonMail Bridge
- Use `127.0.0.1:1143` for IMAP
- Password is generated by Bridge (not your ProtonMail password)
- TLS: Use `false` (Bridge uses STARTTLS)
- `REJECT_UNAUTHORIZED`: Set to `false` (Bridge uses self-signed cert)

**Gmail IMAP setup:**
- Host: `imap.gmail.com`
- Port: `993`
- TLS: `true`
- Enable "Less secure app access" or use App Password
- `REJECT_UNAUTHORIZED`: Omit or set to `true` (default)

## Commands

### check
Check for unread/new emails in mailbox.

```bash
node scripts/imap.js check [--limit 10] [--mailbox INBOX] [--recent 2h]
```

Options:
- `--limit <n>`: Max results (default: 10)
- `--mailbox <name>`: Mailbox to check (default: INBOX)
- `--recent <time>`: Only show emails from last X time (e.g., 30m, 2h, 7d)

Returns JSON array of messages with:
- uid, from, subject, date, snippet, flags

### fetch
Fetch full email content by UID.

```bash
node scripts/imap.js fetch <uid> [--mailbox INBOX]
```

Returns JSON with full body (text + HTML).

### search
Search emails with filters.

```bash
node scripts/imap.js search [options]

Options:
  --unseen           Only unread messages
  --seen             Only read messages
  --from <email>     From address contains
  --subject <text>   Subject contains
  --recent <time>    From last X time (e.g., 30m, 2h, 7d)
  --since <date>     After date (YYYY-MM-DD)
  --before <date>    Before date (YYYY-MM-DD)
  --limit <n>        Max results (default: 20)
  --mailbox <name>   Mailbox to search (default: INBOX)
```

Time format examples:
- `30m` = last 30 minutes
- `2h` = last 2 hours  
- `7d` = last 7 days

### mark-read / mark-unread
Mark message(s) as read or unread.

```bash
node scripts/imap.js mark-read <uid> [uid2 uid3...]
node scripts/imap.js mark-unread <uid> [uid2 uid3...]
```

### list-mailboxes
List all available mailboxes/folders.

```bash
node scripts/imap.js list-mailboxes
```

## Cron Integration

Set up periodic email checking with Clawdbot cron:

```bash
# Check email every 15 minutes, deliver to iMessage
clawdbot cron add \
  --name "email-check" \
  --cron "*/15 * * * *" \
  --session isolated \
  --message "Check for new ProtonMail emails and summarize them" \
  --deliver \
  --channel imessage \
  --to "+15085600825"
```

Inside the isolated session, the agent can run:
```bash
node /Users/mike/clawd/skills/imap-email/scripts/imap.js check --limit 5
```

## Workflow Examples

**Morning email digest:**
1. Run `check --limit 10 --recent 12h`
2. Summarize unread emails from overnight
3. Deliver summary to preferred channel

**Check recent emails from specific sender:**
1. Run `search --from "[email protected]" --recent 24h`
2. Fetch full content if needed
3. Mark as read after processing

**Hourly urgent email check:**
1. Run `search --recent 1h --unseen`
2. Filter for important keywords
3. Extract action items
4. Deliver notification if urgent

**Weekly digest:**
1. Run `search --recent 7d --limit 20`
2. Summarize activity
3. Generate weekly report

## Dependencies

**Required packages:** imap-simple, mailparser, dotenv

**Installation:**
```bash
cd skills/imap-email
npm install
```

This will install all dependencies listed in `package.json`.

## Security Notes

- Store credentials in `.env` (add to `.gitignore`)
- ProtonMail Bridge password is NOT your account password
- Bridge must be running for ProtonMail IMAP access
- Consider using app-specific passwords for Gmail

## Troubleshooting

**Connection timeout:**
- Verify IMAP server is running and accessible
- Check host/port configuration
- Test with: `telnet <host> <port>`

**Authentication failed:**
- Verify username (usually full email address)
- Check password is correct
- For ProtonMail Bridge: use Bridge-generated password, not account password
- For Gmail: use App Password if 2FA is enabled

**TLS/SSL errors:**
- Match `IMAP_TLS` setting to server requirements (true for SSL, false for STARTTLS)
- For self-signed certs (e.g., ProtonMail Bridge): set `IMAP_REJECT_UNAUTHORIZED=false`
- Check port matches TLS setting (993 for SSL, 143 for STARTTLS)

**Empty results:**
- Verify mailbox name (case-sensitive)
- Check search criteria
- List mailboxes with `list-mailboxes`

Overview

This skill reads and manages email via IMAP, supporting any standard IMAP server including ProtonMail Bridge and Gmail. It checks for new or unread messages, fetches full message content, searches mailboxes with flexible filters, and marks messages read or unread. The tool is designed for automation, cron integration, and simple CLI usage.

How this skill works

The skill connects to an IMAP server using credentials from a .env file or a setup helper. It exposes CLI commands to check mailboxes, fetch messages by UID, run advanced searches, list folders, and toggle read/unread flags. Outputs are JSON-friendly for easy parsing and integration with cron jobs or messaging delivery channels.

When to use it

  • Automate periodic inbox checks and deliver summaries to a notification channel.
  • Search for recent messages from a specific sender or containing keywords.
  • Fetch full email content for archiving, processing, or downstream workflows.
  • Integrate with ProtonMail Bridge or Gmail for app-password-based access.
  • Mark processed messages read/unread as part of an automated pipeline.

Best practices

  • Store IMAP credentials in a .env file and never commit it to version control.
  • Use ProtonMail Bridge with its generated password and correct TLS settings.
  • Prefer app-specific passwords for Gmail and enable IMAP in account settings.
  • Match IMAP_TLS and port settings to the server (993 for SSL, 143 for STARTTLS).
  • Limit search results and use recent/since filters to reduce load and false matches.

Example use cases

  • Morning digest: run check --limit 10 --recent 12h, summarize unread items, and send a summary.
  • Urgent monitor: run search --recent 1h --unseen and notify on messages containing priority keywords.
  • Sender-specific scan: search --from "[email protected]" --recent 24h, fetch content, then mark-read.
  • Weekly archive: search --recent 7d --limit 50 and export full message bodies to backup storage.
  • Mailbox discovery: list-mailboxes to validate folder names before running targeted searches.

FAQ

How do I configure ProtonMail Bridge?

Run the setup helper or point IMAP_HOST to 127.0.0.1:1143, use the Bridge-generated password, set IMAP_TLS=false and IMAP_REJECT_UNAUTHORIZED=false for the Bridge certificate.

What formats do search time filters accept?

Use relative times like 30m, 2h, 7d for --recent, or YYYY-MM-DD for --since and --before.