name: email version: 0.0.2 author: 7Sageer, Claude description: | 通过IMAP/SMTP协议进行电子邮件操作的技能,用于发送、获取和阅读邮件。 使用curl配合OpenSSL/LibreSSL实现可靠的TLS兼容性,支持腾讯企业邮箱等邮件服务商。 凭证安全存储在macOS钥匙串中。 when_to_use: | 当用户请求电子邮件相关操作时使用此技能:
- 发送邮件(“发送邮件给…”,“给X发邮件关于…”)
- 检查邮件(“检查我的邮件”,“有新邮件吗?”,“查看邮件”)
- 阅读特定邮件(“阅读邮件#5”,“显示最新邮件”,“读取邮件”)
- 邮件自动化任务(“当…时通知我”,“转发这个给…”)
电子邮件操作技能
概述
本技能通过curl直接访问IMAP/SMTP协议提供电子邮件功能。支持:
- 发送邮件:通过SMTP+TLS
- 获取邮件列表:通过IMAP
- 按ID阅读邮件内容
- 多账户支持:凭证安全存储
架构
- 协议:直接通过TLS的IMAP(端口993)和SMTP(端口465)
- 安全性:密码存储在macOS钥匙串中,从不存储在配置文件中
- 兼容性:使用curl配合OpenSSL/LibreSSL(比rustls更好地支持腾讯企业邮箱)
- 配置:基于YAML的账户管理,位于
references/accounts.yaml
可用脚本
1. 发送邮件(send-email.sh)
通过SMTP发送邮件,支持内联或基于文件的内容。
用法:
./scripts/send-email.sh -t recipient@example.com -s "主题" -b "消息内容"
./scripts/send-email.sh -t recipient@example.com -s "主题" -f message.txt
./scripts/send-email.sh -t recipient@example.com -c another@example.com -s "主题" -b "消息内容"
参数:
-a ACCOUNT- 账户名称(默认:来自accounts.yaml)-t EMAIL- 收件人邮箱(必需)-c EMAIL- 抄送收件人(可选)-s TEXT- 邮件主题(必需)-b TEXT- 内联邮件正文(如果没有-f则必需)-f FILE- 来自文件的邮件正文(如果没有-b则必需)
2. 获取邮件(fetch-emails.sh)
从邮箱中检索邮件头信息。
用法:
./scripts/fetch-emails.sh # 从INBOX获取10封最新邮件
./scripts/fetch-emails.sh -n 20 # 获取20封最新邮件
./scripts/fetch-emails.sh -m "Sent" # 从已发送文件夹获取
参数:
-a ACCOUNT- 账户名称(默认:来自accounts.yaml)-m FOLDER- 邮箱文件夹(默认:INBOX)-n N- 要获取的邮件数量(默认:10)
3. 阅读邮件(read-email.sh)
按ID阅读特定邮件的完整内容。
用法:
./scripts/read-email.sh 123 # 阅读完整邮件
./scripts/read-email.sh -p HEADER 123 # 仅邮件头
./scripts/read-email.sh -p BODY 123 # 仅邮件正文
参数:
-a ACCOUNT- 账户名称(默认:来自accounts.yaml)-m FOLDER- 邮箱文件夹(默认:INBOX)-p PART- 要检索的部分:HEADER、BODY或TEXT(默认:TEXT)EMAIL_ID- 邮件ID(必需,位置参数)
配置
账户设置
编辑references/accounts.yaml添加电子邮件账户:
default_account: SUSTech
accounts:
SUSTech:
email: qihr2022@mail.sustech.edu.cn
display_name: Hanrui Qi
imap:
host: imap.exmail.qq.com
port: 993
login: qihr2022@mail.sustech.edu.cn
protocol: imaps
smtp:
host: smtp.exmail.qq.com
port: 465
login: qihr2022@mail.sustech.edu.cn
protocol: smtps
密码管理
密码存储在macOS钥匙串中。使用以下命令设置:
# IMAP密码
security add-generic-password \
-a "qihr2022@mail.sustech.edu.cn" \
-s "email-imap-sustech" \
-w "your-password" \
-U
# SMTP密码
security add-generic-password \
-a "qihr2022@mail.sustech.edu.cn" \
-s "email-smtp-sustech" \
-w "your-password" \
-U
钥匙串服务命名约定:
- IMAP:
email-imap-{account_name_lowercase} - SMTP:
email-smtp-{account_name_lowercase}
常见使用场景
1. 快速发送邮件
当用户说:“发送邮件给alice@example.com关于会议”
cd /Users/seven/Claude/.claude/skills/email
./scripts/send-email.sh \
-t alice@example.com \
-s "会议讨论" \
-b "你好Alice,我想跟进我们的会议..."
2. 检查最近邮件
当用户说:“检查我的邮件"或"有新邮件吗?”
cd /Users/seven/Claude/.claude/skills/email
./scripts/fetch-emails.sh -n 5
解析输出并为用户总结。
搜索/过滤(管道+grep/rg)
这是在fetch-emails.sh获取的最近邮件(仅邮件头:发件人/主题/日期)中进行"搜索"的轻量级方式。
cd /Users/seven/Claude/.claude/skills/email
# 任意关键字(例如github),同时保留邮件ID行(便于后续读取)
./scripts/fetch-emails.sh -n 200 | rg -i "github" -B 2
# 主题关键字(建议用rg;没有rg就用grep -E)
./scripts/fetch-emails.sh -n 200 | rg "主题:.*会议" -B 2
./scripts/fetch-emails.sh -n 200 | grep -E "主题:.*会议" -B 2
# 发件人关键字
./scripts/fetch-emails.sh -n 200 | rg "发件人:.*alice" -B 1
# 提取匹配到的邮件ID,然后读取正文(取第一个匹配)
email_id="$(
./scripts/fetch-emails.sh -n 200 |
rg -i "github" -B 2 |
sed -nE 's/.*邮件 #([0-9]+).*/\1/p' |
head -n 1
)"
./scripts/read-email.sh "$email_id"
如果email_id为空,增加-n(获取更多最近邮件)或调整关键字/正则表达式。
3. 阅读特定邮件
当用户说:“阅读邮件#3"或"显示最新邮件”
cd /Users/seven/Claude/.claude/skills/email
./scripts/read-email.sh 3
4. 邮件自动化
与其他技能结合实现自动化:
- 检查日历 → 发送提醒邮件
- 监控收件箱 → 创建系统通知
- 获取邮件 → 解析并提取信息
错误处理
常见问题
-
认证失败
- 验证钥匙串密码是否正确设置
- 检查邮件服务商设置中是否启用了IMAP/SMTP
- 对于腾讯企业邮箱,使用应用专用密码
-
连接超时
- 验证网络连接
- 检查防火墙设置,端口993(IMAP)和465(SMTP)
- 确认accounts.yaml中的主机和端口
-
TLS握手失败
- 本技能使用curl配合OpenSSL/LibreSSL以获得更好的兼容性
- 如果问题持续,检查邮件服务商的TLS要求
安全考虑
- 从不记录或显示密码 - 仅存储在钥匙串中
- 发送前确认 - 特别是重要邮件
- 验证收件人 - 发送前检查电子邮件地址
- 尊重隐私 - 除非明确要求,否则不阅读邮件
服务商特定说明
腾讯企业邮箱(exmail.qq.com)
- IMAP:imap.exmail.qq.com:993(SSL/TLS)
- SMTP:smtp.exmail.qq.com:465(SSL/TLS)
- 需要在设置中启用IMAP/SMTP
- 推荐使用应用专用密码
- 注意:某些腾讯企业邮箱服务器上,IMAP的
SEARCH字符串条件(如SUBJECT/FROM/HEADER)可能不可靠;建议通过fetch-emails.sh | rg/grep进行客户端过滤。
Gmail
- IMAP:imap.gmail.com:993
- SMTP:smtp.gmail.com:587(STARTTLS)
- 需要"低安全性应用访问"或应用密码
- 可能需要OAuth2以增强安全性
Outlook/Office 365
- IMAP:outlook.office365.com:993
- SMTP:smtp.office365.com:587
- 需要现代身份验证
技术细节
为什么使用curl而不是rustls?
rustls TLS库与某些邮件服务商(特别是腾讯企业邮箱)存在兼容性问题。curl配合OpenSSL/LibreSSL提供:
- 更好的TLS握手兼容性
- 更广泛的密码套件支持
- 与企业电子邮件系统经过验证的可靠性
IMAP vs POP3
本技能使用IMAP(而非POP3),因为:
- IMAP支持文件夹管理
- 邮件保留在服务器上
- 更适合多设备访问
- 更灵活的搜索和过滤
未来增强
潜在的改进(尚未实现):
- 服务器端IMAP SEARCH(主题/发件人/日期;取决于服务商)
- 附件处理
- HTML邮件撰写
- 邮件过滤和规则
- OAuth2身份验证支持
- 批量操作