统一邮件管理技能,用于读取、发送、回复、转发邮件及管理草稿箱和文件夹。用户提及「读邮件」「发邮件」「回复」「草稿箱」「未读邮件」「收件箱」「邮箱」等邮件相关操作时使用此技能。基于 Python 脚本操作任意 IMAP/SMTP 邮箱。
bingo-email — 统一邮件管理是一项面向实际任务的技能,主要用于基于 Python IMAPClient + smtplib 的全功能邮件管理工具,支持 任意 IMAP/SMTP 邮箱;多邮箱支持;
中文无乱码;草稿箱使用 base64 编码(非 q。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
基于 Python IMAPClient + smtplib 的全功能邮件管理工具,支持任意 IMAP/SMTP 邮箱。
| 特性 | 说明 |
|---|---|
| 多邮箱支持 | 腾讯企业邮箱、QQ邮箱、126/163、Gmail、Outlook + 自定义 |
| 126/163 兼容 | 自动处理 IMAP ID (RFC 2971) 要求 |
| 中文无乱码 | 草稿箱使用 base64 编码(非 quoted-printable) |
| 零外部依赖 | 仅需 imapclient(pip install 即可),无需编译 |
| 配置外置 | TOML 配置文件,不含硬编码凭据,可安全共享 |
| 文件权限 600 | save_config 后自动 chmod 600,仅本人可读 |
| 回复引用 | 自动附带原始邮件 inline quote(> 格式) |
| Reply-All | --all 标志一键回复所有人,智能排除自己 |
| 线程归并 | 自动设置 In-Reply-To / References 头 |
| 自动诊断 | check 命令非交互式检测依赖和配置状态 |
当用户首次触发邮件相关操作时,AI 应按以下流程自动执行:
python3/scripts/bingo_email.py check
pip3 install imapclient
# 运行交互式向导(推荐) python3/scripts/bingo_email.py init
向导会引导你选择邮箱服务商并填写账号密码。支持预设模板:
| 编号 | 服务商 | 说明 |
|---|---|---|
| 1 | 腾讯企业邮箱 | imap.exmail.qq.com (默认 TLS) |
| 2 | QQ 邮箱 | imap.qq.com |
| 3 | 163 网易邮箱 | imap.163.com — 自动启用 IMAP ID |
| 4 | 126 网易邮箱 | imap.126.com — 自动启用 IMAP ID |
| 5 | Gmail | imap.gmail.com(需应用专用密码) |
| 6 | Outlook | outlook.office365.com(支持 STARTTLS) |
| 7+ | 自定义 | 手动输入服务器地址 |
关于授权码:大部分邮箱不使用登录密码,而是使用「授权码」或「应用专用密码」。
- 腾讯企业邮箱:企业邮箱后台 → 设置 → POP/SMTP 服务
- QQ 邮箱:设置 → 账户 → POP3/SMTP服务 → 开启并获取授权码
- 163/126:设置 → POP3/SMTP/IMAP → 开启并获取授权码
- Gmail:Google Account → Security → App Passwords(需要开启 2FA)
python3/scripts/bingo_email.py test
输出示例:
正在测试连接... 邮箱: you@example.com IMAP: imap.example.com:993 SMTP: smtp.example.com:465 ✓ IMAP 连接成功 — 收件箱共 42 封邮件 ✓ SMTP 连接成功
看到两个 ✓ 就说明配置正确。
配置保存在 ~/.config/bingo-email/config.toml:
⚠️ 安全警告:此文件包含明文密码/授权码!
- 文件权限已自动设为 600(仅本人可读),请勿修改权限
- 绝对不要将此文件提交到 Git / GitHub(已通过
.gitignore排除)- 分享 skill 给他人时,只分享代码,不分享此文件
- 如果不小心上传了,立即轮换授权码
# bingo-email 配置文件 [account] email = "your@email.com" display_name = "Your Name" [imap] host = "imap.exmail.qq.com" port = 993 encryption = "tls" # tls | starttls | none login = "your@email.com" password = "your_auth_code" require_imap_id = false # ⚠️ 关键字段!126/163 必须设为 true [smtp] host = "smtp.exmail.qq.com" port = 465 encryption = "tls" # tls | starttls | none login = "your@email.com" password = "your_auth_code"
| 字段 | 必填 | 说明 |
|---|---|---|
account.email |
✅ | 你的邮箱地址 |
account.display_name |
❌ | 发件显示名称 |
imap.host |
✅ | IMAP 服务器地址 |
imap.port |
❌ | IMAP 端口(默认 993) |
imap.encryption |
❌ | 加密方式:tls(SSL), starttls, none |
imap.login |
❌ | IMAP 登录名(默认同 email) |
imap.password |
✅ | 授权码或密码 |
imap.require_imap_id |
❌ | 是否发送 IMAP ID 命令(126/163 必须=true) |
smtp.host |
✅ | SMTP 服务器地址 |
smtp.port |
❌ | SMTP 端口(默认 465) |
smtp.encryption |
❌ | 加密方式(同 imap) |
smtp.login |
❌ | SMTP 登录名(默认同 email) |
smtp.password |
✅ | 授权码或密码(可与 imap 共用) |
网易的 126 和 163 邮箱强制要求 RFC 2971 IMAP ID 扩展。客户端必须在 LOGIN 之前或之后立即发送 ID 命令,否则服务器会拒绝登录并返回 "Unsafe Login" 错误。
bingo-email 内置了两种连接模式:
标准模式(require_imap_id = false):使用 imapclient 库正常连接。适用于腾讯企业邮箱、QQ、Gmail、Outlook 等大多数邮箱服务商。
IMAP ID 模式(require_imap_id = true):通过 raw SSL socket 手动实现完整的 IMAP 握手流程:
TCP Connect → TLS Handshake → CAPABILITY → ID → LOGIN → [Ready]
选择 126 或 163 预设模板时,require_imap_id 会自动设为 true。手动配置时确保:
[imap] host = "imap.163.com" # 或 imap.126.com require_imap_id = true # ← 这行是关键
IMAP ID 命令格式(RFC 2971):
A02 ID (("name" "bingo-email") ("version" "1.0"))
这告诉服务器客户端的身份信息,满足网易的安全策略要求。标准 IMAP 客户库(如 imapclient)默认不发送此命令,因此需要对 126/163 做特殊处理。
python3/scripts/bingo_email.py [args...]
python3 bingo_email.py init # 交互式初始化配置(首次必做) python3 bingo_email.py test # 测试 IMAP/SMTP 连接 python3 bingo_email.py check # 非交互式环境检查(自动诊断依赖+配置)
🤖 AI Agent 注意:在执行任何邮件操作之前,必须先运行
check命令确认环境就绪。
- 如果 exit code = 0 → 环境正常,继续执行用户请求的操作
- 如果 exit code ≠ 0 → 根据输出提示用户完成缺失的步骤(安装依赖或运行 init)
python3 bingo_email.py list [N] # 列出最近 N 封邮件(默认20封) python3 bingo_email.py unread [N] # 列出未读邮件 python3 bingo_email.py read# 读取指定 ID 的邮件详情 python3 bingo_email.py folders # 列出所有文件夹
python3 bingo_email.py send[--body "正文"] python3 bingo_email.py reply [--body "回复正文"] [--all] # --all = 回复所有人 python3 bingo_email.py forward [--body "附言"]
回复功能说明:
reply默认只回复发件人,自动附带原始邮件 inline quote 引用(标准>格式)reply ... --all为 Reply-All 模式,额外 Cc 给原始邮件 To/Cc 中的其他收件人(自动排除自己)- 回复邮件自动设置
In-Reply-To和References头,确保邮件客户端能正确归并对话线程draft-reply同样支持--all参数,保存为回复全部草稿
python3 bingo_email.py draft --to--subject [--body "正文"] python3 bingo_email.py draft-reply [--body "回复正文"] [--all] # --all = 回复所有人草稿
python3 bingo_email.py delete# 删除邮件(移至已删除) python3 bingo_email.py move # 移动到其他文件夹
三种方式传入邮件正文(优先级从高到低):
--body 参数(推荐用于脚本调用):
python3 bingo_email.py send a@b.com "主题" --body "这是正文内容"
管道传入:
echo "正文内容" | python3 bingo_email.py send a@b.com "主题"
交互输入(不带以上两种时自动进入):
python3 bingo_email.py send a@b.com "主题" # 请输入邮件正文(输入空行结束): # > 第一行 # > 第二行 # > (直接回车结束)
| 操作 | 输出格式 | 说明 |
|---|---|---|
list / unread |
表格 | ID / 标记(*=未读) / 主题(截断40字) / 发件人 / 日期 |
read |
结构化文本 | From, To, Cc, Subject, Date, Message-ID + 正文 |
folders |
列表 | 文件夹名称 + flags |
send/reply/forward/draft |
状态行 | ✓ 操作结果 |
| 错误 | 以 错误: 开头 |
后跟具体原因 |
| 维度 | himalaya | bingo-email |
|---|---|---|
| 语言 | Rust CLI | Python 脚本 |
| 中文草稿 | quoted-printable → 乱码 ✗ | base64 → 正常 ✓ |
| 126/163 | 需编译自定义版本 | 配置项一键切换 |
| 配置 | TOML 文件 | TOML 文件(兼容格式) |
| 依赖 | 单二进制 | imapclient (~1MB pip 包) |
| 可定制性 | 需改源码重编译 | 直接改 Python |
将整个 bingo-email/ 目录放到 WorkBuddy skills 目录:
# 复制到用户级 skills 目录(所有项目可用) cp -r bingo-email/ ~/.workbuddy/skills/ # 或复制到项目级 skills 目录(仅当前项目可用) cp -r bingo-email/ .workbuddy/skills/
然后运行 init 命令配置自己的邮箱即可。
# 1. 下载脚本 curl -o ~/bin/bingo_email.py https://your-host/scripts/bingo_email.py chmod +x ~/bin/bingo_email.py # 2. 安装依赖 pip3 install imapclient # 3. 初始化配置 ~/bin/bingo_email.py init # 4. 使用 ~/bin/bingo_email.py unread
给其他人使用前,确认对方完成以下步骤:
pip3 install imapclientbingo_email.py init 完成配置bingo_email.py test 验证连接init 时选择了对应预设(或手动设 require_imap_id = true)新用户快速验证:直接运行
python3 bingo_email.py check即可一键诊断所有前置条件。
| 措施 | 实现方式 |
|---|---|
| 文件权限 600 | save_config() 写入后自动 chmod 0o600,仅文件所有者可读写 |
| 密码输入无回显 | init 命令使用 getpass.getpass() 终端不显示明文 |
| Git 防泄露 | .gitignore 已排除 config.toml 和 __pycache__/ |
| 无硬编码凭据 | 源代码中不含任何真实密码或 token |
发布前确认以下事项:
config.toml 不在仓库中:确认 .gitignore 包含 config.tomlgit log -p -- config.toml 确认从无此文件your_auth_code 占位符config.toml# 使用 BFG 或 git-filter-repo 从历史中彻底删除 # 然后强制推送(需谨慎!)
最终用户应了解:
config.toml 权限为 600(程序自动设置)A: 首次使用必须先运行 python3 bingo_email.py init 进行配置。
A: 检查以下几点:
A: 确认配置中 require_imap_id = true。如果用的旧版配置,重新运行 init 选择 126 或 163 模板即可。
A: 这个问题在 bingo-email 中不会出现——草稿统一使用 MIMEText + base64 编码写入。如果遇到乱码请报 bug。
A: 编辑 ~/.config/bingo-email/config.toml 修改账号信息,或重新运行 init 覆盖配置。
Sent Messages(不是 Sent)Drafts相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.7万人学习
共49课时 | 82.4万人学习
最新文章