name: portable-email-manager version: 0.2.0 description: Lightweight email manager with IMAP/SMTP support, advanced search, folder management, and attachment detection. Works with Zoho, Gmail, Outlook, and any IMAP/SMTP provider.
A fully self-contained email management skill for OpenClaw. Uses standard IMAP and SMTP protocols with zero external dependencies.
--from)--subject)--since, --before)--seen, --unseen)--body, warning: can be slow)folders commandmove commandread and search resultscd skills/portable-email-manager
npm install
Dependencies are bundled in package.json:
- nodemailer - SMTP email sending
- imap-simple - IMAP operations
- mailparser - Email parsing and attachment detection
Set these environment variables:
export EMAIL_USER="your.email@domain.com"
export EMAIL_PASS="your-app-password"
Recommended: Use App Passwords for Gmail, Outlook, Zoho instead of main password.
Zoho Mail (default):
- Already configured for smtp.zoho.eu and imap.zoho.eu
- Generate App Password: https://accounts.zoho.eu/home#security/apppasswords
Gmail:
- Edit scripts/email.js and change:
javascript
host: 'smtp.gmail.com' // SMTP
host: 'imap.gmail.com' // IMAP
- Enable 2FA and create App Password: https://myaccount.google.com/apppasswords
Outlook/Hotmail:
- Edit to use smtp.office365.com / outlook.office365.com
- Port 587 for SMTP (TLS)
./scripts/email.js send "recipient@example.com" "Subject" "Email body text"
Example:
./scripts/email.js send "boss@company.com" "Weekly Report" "Attached is this week's summary."
./scripts/email.js read [limit]
Examples:
# Read last 5 emails (default)
./scripts/email.js read
# Read last 20 emails
./scripts/email.js read 20
Output includes: - UID (unique ID for moving) - From/To addresses - Subject and date - Attachment count and details - Email body preview (first 500 chars)
./scripts/email.js search [options]
Search Options:
| Option | Description | Example |
|---|---|---|
--from <email> |
Filter by sender | --from "boss@company.com" |
--subject <text> |
Filter by subject keywords | --subject "invoice" |
--since <date> |
Emails after date | --since "Jan 1, 2026" |
--before <date> |
Emails before date | --before "Feb 1, 2026" |
--unseen |
Only unread emails | --unseen |
--seen |
Only read emails | --seen |
--body <text> |
Search in body (slow!) | --body "meeting" |
--limit <n> |
Max results | --limit 10 |
Examples:
# Find unread emails from specific sender
./scripts/email.js search --from "client@example.com" --unseen
# Search by subject
./scripts/email.js search --subject "invoice" --limit 5
# Date range search
./scripts/email.js search --since "Jan 15, 2026" --before "Feb 1, 2026"
# Search in body (use sparingly - can be slow)
./scripts/email.js search --body "quarterly review"
# Combine multiple filters
./scripts/email.js search --from "boss@company.com" --subject "urgent" --unseen --limit 3
./scripts/email.js folders
Shows hierarchical tree of all IMAP folders with attributes.
Example output:
📁 INBOX
📁 Sent
📁 Archive
📁 Drafts
📁 Spam
📁 Trash
./scripts/email.js move <uid> <folder-name>
Important:
- Get the uid from read or search output
- Folder name is case-sensitive
- Script validates folder exists before moving
Examples:
# First, find the email and note its UID
./scripts/email.js search --from "newsletter@example.com"
# Output shows: UID: 12345
# Move to Archive folder
./scripts/email.js move 12345 "Archive"
# Move to custom folder
./scripts/email.js move 67890 "Projects/Work"
Error handling: - If folder doesn't exist, shows list of available folders - Validates UID exists before attempting move
./scripts/email.js help
Shows complete usage guide with all commands and examples.
# Check unread emails
./scripts/email.js search --unseen --limit 10
# Move newsletters to folder
./scripts/email.js search --from "newsletter@site.com" --limit 1
./scripts/email.js move <uid> "Newsletters"
# Search by sender and subject
./scripts/email.js search --from "client@example.com" --subject "proposal"
# Search by date
./scripts/email.js search --since "Jan 20, 2026" --subject "meeting notes"
# Find old read emails
./scripts/email.js search --before "Dec 1, 2025" --seen --limit 50
# Move each to Archive (use UID from output)
./scripts/email.js move <uid> "Archive"
# Read recent emails and see attachment info
./scripts/email.js read 10
# Search output automatically shows:
# - Number of attachments
# - Filename, type, and size for each
Default configuration is optimized for Zoho Mail EU.
To use another provider, edit scripts/email.js:
// SMTP Configuration
const smtpConfig = {
host: 'smtp.your-provider.com',
port: 465, // or 587 for TLS
secure: true, // true for SSL (465), false for TLS (587)
auth: {
user: EMAIL_USER,
pass: EMAIL_PASS
}
};
// IMAP Configuration
const imapConfig = {
imap: {
user: EMAIL_USER,
password: EMAIL_PASS,
host: 'imap.your-provider.com',
port: 993,
tls: true,
authTimeout: 20000
}
};
--body) can be slow on large mailboxes - use sparingly--limit for faster responses本技能來自小蔥技能站7w4.net。
"Authentication failed" - Verify EMAIL_USER and EMAIL_PASS are set correctly - Use App Password, not account password - Check provider settings (2FA, less secure apps, etc.)
"Folder not found"
- Use folders command to see exact folder names
- Folder names are case-sensitive
- Some providers use different names (e.g., "Sent Items" vs "Sent")
"Connection timeout"
- Check firewall/network settings
- Verify IMAP/SMTP ports are accessible
- Try increasing authTimeout in config
"No emails found" - Check search criteria - Verify emails exist in INBOX (not other folders) - Try broader search (remove some filters)
Tested with: - ✅ Zoho Mail (EU & US) - ✅ Gmail - ✅ Outlook/Hotmail - ✅ iCloud Mail - ✅ Custom IMAP/SMTP servers
ISC - Use freely in your OpenClaw setup.
這個郵件管理工具功能豐富、使用簡單,能滿足日常傳送、讀取、搜尋郵件和管理資料夾的需求,文件和示例都很詳細,相容多種郵箱服務。整體質量中上,功能做得比較紮實,但有個明顯的安全隱患需要留意——它預設停用了證書驗證,部署前建議改回來;此外發送郵件時如果內容較長或包含特殊字元可能處理不太好。瑕不掩瑜,對於需要通過指令碼管理郵件的使用者來說是個不錯的選擇。