Pixiv

MailHook

通过邮件触发本地脚本执行的自动化工具 —— 定时轮询 IMAP 邮箱,识别邮件中的 mailhook 指令块,经安全校验后执行白名单脚本,并回信执行结果。

RustTokioIMAP/SMTP

MailHook 是一个用 Rust 编写的邮件驱动自动化工具:定时轮询 IMAP 邮箱,识别邮件正文中的 mailhook 指令块(TOML 格式),经安全校验后执行配置白名单中的脚本,并通过 SMTP 回信执行结果。远程发一封邮件,就能触发家里/NAS 上的定时任务。

工作流程

  1. 轮询 IMAP 收取未读邮件
  2. 发件人白名单校验
  3. 提取正文中的 ```mailhook 指令块
  4. 共享密钥校验 → 脚本白名单查找
  5. 执行脚本(带超时控制)
  6. 标记邮件已读
  7. 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 连接中断可能导致重复执行,非幂等脚本需容忍重复触发
  • 生产环境务必配置发件人白名单与共享密钥
0%