通过 IMAP 协议读取、搜索和管理邮件,通过 SMTP 发送邮件。支持 Gmail、Outlook、163.com、vip.163.com、126.com、vip.126.com、188.com、vip.188.com 以及任何标准 IMAP/SMTP 服务器。
配置 运行安装脚本配置邮箱账号:
bash setup.sh
配置文件存储在 ~/.config/imap-smtp-email/.env(技能更新后不会丢失)。如果在该路径未找到配置,技能会回退到技能目录下的 .env 文件(向后兼容)。
配置文件格式 # 默认账号(无前缀)
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=INBOXSMTP_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
# 文件访问白名单(安全)
ALLOWED_READ_DIRS=~/Downloads,~/Documents
ALLOWED_WRITE_DIRS=~/Downloads
多账号 可以在同一配置文件中配置多个邮箱账号。每个账号使用名称前缀(大写)标记所有变量。
添加账号 运行安装脚本并选择"添加新账号":
bash setup.sh
或手动在 ~/.config/imap-smtp-email/.env 中添加带前缀的变量:
# 工作账号(WORK_ 前缀)
WORK_IMAP_HOST=imap.company.com
WORK_IMAP_PORT=993
WORK_IMAP_USER=me@company.com
WORK_IMAP_PASS=password
WORK_IMAP_TLS=true
WORK_IMAP_REJECT_UNAUTHORIZED=true
WORK_IMAP_MAILBOX=INBOX
WORK_SMTP_HOST=smtp.company.com
WORK_SMTP_PORT=587
WORK_SMTP_SECURE=false
WORK_SMTP_USER=me@company.com
WORK_SMTP_PASS=password
WORK_SMTP_FROM=me@company.com
WORK_SMTP_REJECT_UNAUTHORIZED=true
使用指定账号 在命令前添加 --account <名称>:
node scripts/imap.js --account work check
node scripts/smtp.js --account work send --to foo@bar.com --subject Hi --body Hello
不指定 --account 时使用默认(无前缀)账号。
账号名称规则 仅限字母和数字(如 work、163、personal2)
不区分大小写:work 和 WORK 指同一账号
.env 中的前缀始终为大写(如 WORK_IMAP_HOST)
ALLOWED_READ_DIRS 和 ALLOWED_WRITE_DIRS 为所有账号共享(始终无前缀)常用邮件服务器 服务商 IMAP 主机 IMAP 端口 SMTP 主机 SMTP 端口 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 邮箱 imap.qq.com 993 smtp.qq.com 587
Gmail 注意事项:
Gmail 不接受 常规账号密码
必须生成应用专用密码 :https://myaccount.google.com/apppasswords
使用生成的 16 位应用专用密码作为 IMAP_PASS / SMTP_PASS
需要已启用两步验证的 Google 账号 163.com 注意事项:
使用授权码 ,而非账号密码
需先在网页版设置中开启 IMAP/SMTP IMAP 命令(收信) check
检查新邮件/未读邮件。
node scripts/imap.js [--account <名称>] check [--limit 10] [--mailbox INBOX] [--recent 2h]
选项:
--limit :最大结果数(默认:10)
--mailbox <名称>:要检查的邮箱(默认:INBOX)
--recent <时间>:仅显示最近 X 时间内的邮件(如 30m、2h、7d)fetch
按 UID 获取完整邮件内容。
node scripts/imap.js [--account <名称>] fetch [--mailbox INBOX]
download
下载邮件的所有附件,或指定附件。
node scripts/imap.js [--account <名称>] download [--mailbox INBOX] [--dir <路径>] [--file <文件名>]
选项:
--mailbox <名称>:邮箱(默认:INBOX)
--dir <路径>:输出目录(默认:当前目录)
--file <文件名>:仅下载指定附件(默认:下载全部)search
按条件搜索邮件。
node scripts/imap.js [--account <名称>] search [选项]选项:
--unseen 仅未读邮件
--seen 仅已读邮件
--from <邮箱> 发件人包含
--subject <文本> 主题包含
--recent <时间> 最近 X 时间内(如 30m、2h、7d)
--since <日期> 日期之后(YYYY-MM-DD)
--before <日期> 日期之前(YYYY-MM-DD)
--limit 最大结果数(默认:20)
--mailbox <名称> 搜索的邮箱(默认:INBOX)
mark-read / mark-unread
将邮件标记为已读或未读。
node scripts/imap.js [--account <名称>] mark-read [uid2 uid3...]
node scripts/imap.js [--account <名称>] mark-unread [uid2 uid3...]
list-mailboxes
列出所有可用的邮箱/文件夹。
node scripts/imap.js [--account <名称>] list-mailboxes
list-accounts
列出所有已配置的邮箱账号。
node scripts/imap.js list-accounts
node scripts/smtp.js list-accounts
显示账号名称、邮箱地址、服务器地址和配置状态。
SMTP 命令(发信) send
通过 SMTP 发送邮件。
node scripts/smtp.js [--account <名称>] send --to <邮箱> --subject <文本> [选项]
必填:
--to <邮箱>:收件人(多个用逗号分隔)
--subject <文本>:邮件主题,或使用 --subject-file <文件>可选:
--body <文本>:纯文本正文
--html:以 HTML 格式发送正文
--body-file <文件>:从文件读取正文
--html-file <文件>:从文件读取 HTML
--cc <邮箱>:抄送
--bcc <邮箱>:密送
--attach <文件>:附件(多个用逗号分隔)
--from <邮箱>:覆盖默认发件人示例:
# 简单文本邮件
node scripts/smtp.js send --to recipient@example.com --subject "Hello" --body "World"# HTML 邮件
node scripts/smtp.js send --to recipient@example.com --subject "Newsletter" --html --body "
Welcome "# 带附件的邮件
node scripts/smtp.js send --to recipient@example.com --subject "Report" --body "Please find attached" --attach report.pdf
# 多收件人
node scripts/smtp.js send --to "a@example.com,b@example.com" --cc "c@example.com" --subject "Update" --body "Team update"
test
发送测试邮件给自己,测试 SMTP 连接。
node scripts/smtp.js [--account <名称>] test
依赖安装 npm install
安全说明 配置文件存储在 ~/.config/imap-smtp-email/.env,权限为 600(仅所有者可读写)
Gmail :常规密码会被拒绝——需在 https://myaccount.google.com/apppasswords 生成应用专用密码
163.com :使用授权码,而非账号密码故障排除 连接超时:
认证失败:
确认用户名(通常为完整邮箱地址)
检查密码是否正确
163.com:使用授权码,而非账号密码
Gmail:常规密码无法使用——需在 https://myaccount.google.com/apppasswords 生成应用专用密码 TLS/SSL 错误:
确保 IMAP_TLS/SMTP_SECURE 设置与服务器要求匹配
自签名证书:设置 IMAP_REJECT_UNAUTHORIZED=false 或 SMTP_REJECT_UNAUTHORIZED=false
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 configure your email account:
bash setup.sh
Configuration is stored at ~/.config/imap-smtp-email/.env (survives skill updates). If no config is found there, the skill falls back to a .env file in the skill directory (for backward compatibility).
Config file format # 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=INBOXSMTP_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
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/imap-smtp-email/.env:
# Work account (WORK_ prefix)
WORK_IMAP_HOST=imap.company.com
WORK_IMAP_PORT=993
WORK_IMAP_USER=me@company.com
WORK_IMAP_PASS=password
WORK_IMAP_TLS=true
WORK_IMAP_REJECT_UNAUTHORIZED=true
WORK_IMAP_MAILBOX=INBOX
WORK_SMTP_HOST=smtp.company.com
WORK_SMTP_PORT=587
WORK_SMTP_SECURE=false
WORK_SMTP_USER=me@company.com
WORK_SMTP_PASS=password
WORK_SMTP_FROM=me@company.com
WORK_SMTP_REJECT_UNAUTHORIZED=true
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: work and WORK refer to the same account
The prefix in .env is always uppercase (e.g., WORK_IMAP_HOST)
ALLOWED_READ_DIRS and ALLOWED_WRITE_DIRS are 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
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)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)
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 senderExamples:
# 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
Dependencies npm install
Security Notes Configuration is stored at ~/.config/imap-smtp-email/.env with 600 permissions (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_SECURE setting to server requirements
For self-signed certs: set IMAP_REJECT_UNAUTHORIZED=false or SMTP_REJECT_UNAUTHORIZED=false