MailHook 是一个用 Rust 编写的邮件驱动自动化工具:定时轮询 IMAP 邮箱,识别邮件正文中的 mailhook 指令块(TOML 格式),经安全校验后执行配置白名单中的脚本,并通过 SMTP 回信执行结果。远程发一封邮件,就能触发家里/NAS 上的定时任务。
工作流程
- 轮询 IMAP 收取未读邮件
- 发件人白名单校验
- 提取正文中的
```mailhook指令块 - 共享密钥校验 → 脚本白名单查找
- 执行脚本(带超时控制)
- 标记邮件已读
- SMTP 回信执行结果(退出状态、错误原因、stdout/stderr 摘要)
安全设计
- 脚本白名单:邮件只能引用配置中定义的脚本名,参数只能追加、不能替换 command 和固定参数
- 发件人白名单:
allowed_senders限制触发者,大小写不敏感 - 共享密钥校验:指令块须携带与配置一致的 secret
- 密码免落盘:
password = "env:VAR_NAME"从环境变量读取,不写进配置文件 - 超时强杀:超时后强制终止子进程,保留部分输出便于定位
- 处理即已读:每封邮件只处理一次,防止坏邮件无限重试
- 回信防刷屏:stdout/stderr 各截取前 2000 字符
指令格式
邮件正文中的指令块:
```mailhook
script = "backup"
secret = "your-shared-secret"
args = ["--full"]
```
配置结构(TOML)
[imap]:host / port / username / password / mailbox / 轮询间隔[smtp](可选):回信配置,支持 tls / starttls / plain[security]:发件人白名单与共享密钥[[scripts]]:脚本名、command、固定参数、超时(默认 60s)、工作目录
部署
从 Releases 下载对应平台产物:Linux 为 musl 静态链接、零运行时依赖(可直接跑在 Alpine、scratch 容器),Windows 同样无需额外运行时。也可 cargo build --release 自行构建。
CLI 参数:-c/--config 指定配置路径,--once 单次轮询(联调用),日志级别用 RUST_LOG 控制。
注意事项
- 只解析 text/plain;仅 HTML 正文的邮件会被忽略
- 多数邮箱需使用应用专用密码;网易系邮箱需开启 IMAP 并使用授权码(程序会自动发送 RFC 2971 ID 命令)
- 脚本执行完成后才标记已读,IMAP 连接中断可能导致重复执行,非幂等脚本需容忍重复触发
- 生产环境务必配置发件人白名单与共享密钥