Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Coding
Imap Smtp Email
Try itRead and send email over IMAP/SMTP from the command line, with multi-account support and attachment handling.
What it does
Operate IMAP mailboxes and send SMTP mail via CLI scripts, covering Gmail, Outlook, 163/126/188, yeah.net, QQ Mail, and any custom IMAP/SMTP server. IMAP commands check for new mail, fetch full messages by UID, download attachments, search by sender/subject/date/flags, toggle read state, and list folders; SMTP commands send plain or HTML messages with CC, BCC, and attachments. A setup script writes config to ~/.config/mail-skills/.env and supports multiple named accounts via a prefix convention (e.g. WORK_, 163_).
When to use it
- Triage a noisy inbox by listing recent unread messages and downloading key attachments
- Send a status report with a PDF attachment to multiple recipients in one command
- Search a mailbox for messages from a specific sender within a date range
- Run a personal Gmail and a work 163.com account side-by-side
The skill document
IMAP/SMTP Email Tool
Read, search, and manage email via IMAP protocol. Send email via SMTP. Supports Gmail, Outlook, 163.com, vip.163.com, 126.com, vip.126.com, 188.com, vip.188.com, and any standard IMAP/SMTP server.
Configuration
Run the setup script to install dependencies and configure your email account:
bash setup.sh
If running commands manually without setup.sh, install dependencies first:
npm install --production
Configuration is stored at ~/.config/mail-skills/.env (shared with caldav-sync skill, survives skill updates). If no shared config is found, the skill checks ~/.config/imap-smtp-email/.env (legacy) and then a .env file in the skill directory.
Config file format (shared)
# Default account
PROVIDER=163
USERNAME=your@163.com
PASSWORD=your_password
# File access whitelist (security)
ALLOWED_READ_DIRS=~/Downloads,~/Documents
ALLOWED_WRITE_DIRS=~/Downloads
The PROVIDER preset auto-fills IMAP/SMTP server settings. For custom servers:
PROVIDER=custom
USERNAME=your@email.com
PASSWORD=your_password
IMAP_HOST=imap.example.com
SMTP_HOST=smtp.example.com
Legacy config file format
If you have an existing ~/.config/imap-smtp-email/.env, it takes priority over the shared config. The format is:
# Default account (no prefix)
IMAP_HOST=imap.gmail.com
IMAP_PORT=993
IMAP_USER=your@email.com
IMAP_PASS=your_password
IMAP_TLS=true
IMAP_REJECT_UNAUTHORIZED=true
IMAP_MAILBOX=INBOX
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your@email.com
SMTP_PASS=your_password
SMTP_FROM=your@email.com
SMTP_REJECT_UNAUTHORIZED=true
# File access whitelist (security)
ALLOWED_READ_DIRS=~/Downloads,~/Documents
ALLOWED_WRITE_DIRS=~/Downloads
Run bash setup.sh to migrate your legacy config to the shared format.
Multi-Account
You can configure additional email accounts in the same config file. Each account uses a name prefix (uppercase) on all variables.
Adding an account
Run the setup script and choose "Add a new account":
bash setup.sh
Or manually add prefixed variables to ~/.config/mail-skills/.env:
# Work account (WORK_ prefix)
WORK_PROVIDER=gmail
WORK_USERNAME=me@company.com
WORK_PASSWORD=app_password
Using a named account
Add --account before the command:
node scripts/imap.js --account work check
node scripts/smtp.js --account work send --to foo@bar.com --subject Hi --body Hello
Without --account, the default (unprefixed) account is used.
Account name rules
- Letters and digits only (e.g.,
work,163,personal2) - Case-insensitive:
workandWORKrefer to the same account - The prefix in
.envis always uppercase (e.g.,WORK_PROVIDER) ALLOWED_READ_DIRSandALLOWED_WRITE_DIRSare shared across all accounts (always unprefixed)
Common Email Servers
| Provider | IMAP Host | IMAP Port | SMTP Host | SMTP Port |
|---|---|---|---|---|
| 163.com | imap.163.com | 993 | smtp.163.com | 465 |
| vip.163.com | imap.vip.163.com | 993 | smtp.vip.163.com | 465 |
| 126.com | imap.126.com | 993 | smtp.126.com | 465 |
| vip.126.com | imap.vip.126.com | 993 | smtp.vip.126.com | 465 |
| 188.com | imap.188.com | 993 | smtp.188.com | 465 |
| vip.188.com | imap.vip.188.com | 993 | smtp.vip.188.com | 465 |
| yeah.net | imap.yeah.net | 993 | smtp.yeah.net | 465 |
| Gmail | imap.gmail.com | 993 | smtp.gmail.com | 587 |
| Outlook | outlook.office365.com | 993 | smtp.office365.com | 587 |
| QQ Mail | imap.qq.com | 993 | smtp.qq.com | 587 |
| exmail.qq.com | imap.exmail.qq.com | 993 | smtp.exmail.qq.com | 465 |
Important for Gmail:
- Gmail does not accept your regular account password
- You must generate an App Password: https://myaccount.google.com/apppasswords
- Use the generated 16-character App Password as
IMAP_PASS/SMTP_PASS - Requires Google Account with 2-Step Verification enabled
Important for 163.com:
- Use authorization code (授权码), not account password
- Enable IMAP/SMTP in web settings first
IMAP Commands (Receiving Email)
check
Check for new/unread emails.
node scripts/imap.js [--account ] check [--limit 10] [--mailbox INBOX] [--recent 2h]
Options:
--limit: Max results (default: 10)--mailbox: Mailbox to check (default: INBOX)--recent: Only show emails from last X time (e.g., 30m, 2h, 7d)--unseen: Only show unread messages
Output is an object: { "results": [...], "meta": {...} } (same shape as
search; meta.fallbackUsed is always false for check).
fetch
Fetch full email content by UID.
node scripts/imap.js [--account ] fetch [--mailbox INBOX]
download
Download all attachments from an email, or a specific attachment.
node scripts/imap.js [--account ] download [--mailbox INBOX] [--dir ] [--file ]
Options:
--mailbox: Mailbox (default: INBOX)--dir: Output directory (default: current directory)--file: Download only the specified attachment (default: download all)
search
Search emails with filters.
node scripts/imap.js [--account ] search [options]
Options:
--unseen Only unread messages
--seen Only read messages
--from From address contains
--subject Subject contains
--recent From last X time (e.g., 30m, 2h, 7d)
--since After date (YYYY-MM-DD)
--before Before date (YYYY-MM-DD)
--limit Max results (default: 20)
--mailbox Mailbox to search (default: INBOX)
--sort uid (default, fast) or date (strict INTERNALDATE sort;
fetches all matches, use when mailbox has COPY'd/backdated mail)
Output is an object: { "results": [...], "meta": {...} } where results is
an array of message objects and meta carries fallbackUsed, provider,
scope, scanned, matched, returned, truncated, and optional note.
For 163/126/188/yeah.net (NetEase) accounts, the IMAP server silently returns
empty for text-based SEARCH (--from/--subject). These are automatically
filtered client-side: server-side SEARCH keeps only date/flag criteria, then
fetched messages are filtered locally. When searching --from/--subject
without a date/flag scope, only the most recent 200 messages are scanned
(meta.truncated=true) — add --recent/--since to search a wider range.
mark-read / mark-unread
Mark message(s) as read or unread.
node scripts/imap.js [--account ] mark-read [uid2 uid3...]
node scripts/imap.js [--account ] mark-unread [uid2 uid3...]
list-mailboxes
List all available mailboxes/folders.
node scripts/imap.js [--account ] list-mailboxes
list-accounts
List all configured email accounts.
node scripts/imap.js list-accounts
node scripts/smtp.js list-accounts
Shows account name, email address, server addresses, and configuration status.
SMTP Commands (Sending Email)
send
Send email via SMTP.
node scripts/smtp.js [--account ] send --to --subject [options]
Required:
--to: Recipient (comma-separated for multiple)--subject: Email subject, or--subject-file
Optional:
--body: Plain text body--html: Send body as HTML--body-file: Read body from file--html-file: Read HTML from file--cc: CC recipients--bcc: BCC recipients--attach: Attachments (comma-separated)--from: Override default sender
Examples:
# Simple text email
node scripts/smtp.js send --to recipient@example.com --subject "Hello" --body "World"
# HTML email
node scripts/smtp.js send --to recipient@example.com --subject "Newsletter" --html --body "Welcome"
# Email with attachment
node scripts/smtp.js send --to recipient@example.com --subject "Report" --body "Please find attached" --attach report.pdf
# Multiple recipients
node scripts/smtp.js send --to "a@example.com,b@example.com" --cc "c@example.com" --subject "Update" --body "Team update"
test
Test SMTP connection by sending a test email to yourself.
node scripts/smtp.js [--account ] test
Security Notes
- Configuration is stored at
~/.config/mail-skills/.env(or~/.config/imap-smtp-email/.envfor legacy) with600permissions (owner read/write only) - Gmail: regular password is rejected — generate an App Password at https://myaccount.google.com/apppasswords
- For 163.com: use authorization code (授权码), not account password
Troubleshooting
Connection timeout:
- Verify server is running and accessible
- Check host/port configuration
Authentication failed:
- Verify username (usually full email address)
- Check password is correct
- For 163.com: use authorization code, not account password
- For Gmail: regular password won't work — generate an App Password at https://myaccount.google.com/apppasswords
TLS/SSL errors:
- Match
IMAP_TLS/SMTP_SECUREsetting to server requirements - For self-signed certs: set
IMAP_REJECT_UNAUTHORIZED=falseorSMTP_REJECT_UNAUTHORIZED=false
Related Skills
- caldav-sync - Calendar and task management via CalDAV protocol. Manage events, todos, and free/busy queries with Google Calendar, iCloud, NetEase, and more. Install with:
npx skills add https://github.com/gzlicanyi/mail-skills -s caldav-sync
Feedback
Issues and pull requests are welcome at github.com/gzlicanyi/mail-skills.
Questions people ask
- Does it work with Gmail?
- Yes, but regular account passwords are rejected. Enable 2-Step Verification on the Google Account and use a 16-character App Password generated at myaccount.google.com/apppasswords as the credential.
- Can I manage more than one email account?
- Yes. Add prefixed variables (e.g. WORK_PROVIDER, WORK_USERNAME) to the shared config and select the account with --account when running a command. Without --account, the unprefixed default account is used.
- Where is configuration stored?
- At ~/.config/mail-skills/.env with 600 permissions, shared with the caldav-sync skill so it survives skill updates. A legacy path ~/.config/imap-smtp-email/.env is still read first if it exists; bash setup.sh migrates it.
Related skills
Post videos, photos, text, and documents to 10 social platforms through a single REST API call.
Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.
Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.
Query Twitter/X profiles, tweets, follower events, and KOL data through the 6551 REST API.
Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.