Install
openclaw skills install @songhonglei/invoice-auto-forward自动扫描邮箱(支持 QQ/163/126 等主流邮箱,provider 一键切换)里的发票邮件,解析发票(PDF/OFD/XML 三种格式)后按标准化模板转发给指定收件人(如财务/行政),支持抬头白名单过滤、定时无人值守运行、发送节奏控制(防反垃圾风控)。对「链接型发票」(邮件只有下载链接、无 PDF 附件,如腾讯云电子发票)也能自动扫描正文链接并下载发票文件(PDF/OFD/XML)后转发。This skill should be used when 用户想把邮箱收到的发票自动转发给他人、设置发票自动归档/报销流程、配置发票转发规则(授权码/收件人/主题模板),或触发词包括:发票转发、发票自动转发、QQ邮箱发票、163邮箱发票、126邮箱发票、链接型发票、OFD发票、XML发票、转发发票给财务、invoice forward。
openclaw skills install @songhonglei/invoice-auto-forward本 skill 引导用户完成一次性配置(邮箱授权码、转发规则、收件人、主题/正文模板),之后即可自动扫描邮箱中的发票邮件,解析 PDF 发票并按统一格式转发给指定人。支持定时无人值守运行与对话手动触发。
scripts/invoice_forward.py(子命令:setup / check / scan / run / parse)references/config.example.jsonreferences/troubleshooting.mdcheck --install-deps,装到当前 Python 环境):pdfplumber(PDF 解析首选)、pymupdf(PDF 兜底,二者至少其一)。OFD / XML 用 Python 内置 zipfile + xml.etree 解析,无需任何额外依赖。pip install pdfplumber pymupdfINVOICE_FORWARD_CONFIG(自定义 config.json 路径,默认 ~/.workbuddy/invoice-forward/config.json)python3 scripts/invoice_forward.py check --install-deps——缺少 pdfplumber/pymupdf 时会自动 pip 安装到当前 Python 环境(执行前向用户说明将安装这两个库);若用户环境禁止自动安装,改为给出 pip install pdfplumber pymupdf 命令让其自行执行。setup 子命令完成(推荐,见下方「一键配置」),它会验证连通性后写入 secrets(chmod 600)+ config.json,无需手工改文件。授权码只进 secrets 文件,绝不写入 config.json、SKILL.md 或任何 skill 包内文件。["发票"]{item} {amount} {date}references/config.example.json 的结构写入 ~/.workbuddy/invoice-forward/config.json(用 setup 子命令则自动生成)。python3 scripts/invoice_forward.py check — 体检全过才继续python3 scripts/invoice_forward.py scan — 干跑预览,向用户展示将转发的邮件清单(主题渲染结果),请用户确认run 子命令并复述输出;非 WorkBuddy 环境给出 crontab 行。提醒:创建后核对下次运行时间是否符合预期。把上面步骤 2–5 合并成一条命令:自动合并已有配置、应用你给的参数、交互补缺失项、验证 IMAP/SMTP 连通性,确认授权码真能用后才写入 secrets(chmod 600)与 config.json。凭证绝不会写进 config.json。
python3 scripts/invoice_forward.py setup \
--user yourname@163.com \ # 登录邮箱;省略 provider 时由域名推导主机
--provider 163 \ # qq/163/126/yeah 或域名;可省略,由 --user 域名自动推导
--auth-code xxxxxxxx \ # IMAP/SMTP 授权码;不传则交互隐藏输入(getpass,不回显)
--to finance@example.com \ # 转发收件人,多个用空格分隔
--days 7 \ # 扫描天数窗口
--buyer-whitelist "公司A" "公司B" \ # 抬头白名单,空=全部
--interval 3 --batch-limit 20 \ # 163/126 防反垃圾节奏(QQ 可设 0)
--fetch-links \ # 启用链接型发票抓取(默认开);--no-fetch-links 关闭
--link-domains myqcloud.com tencent.com \ # 仅下载这些域名后缀的链接(空=全部,靠 PDF 闸门兜底)
--config ~/.workbuddy/invoice-forward/config.json # 可放任意路径;默认即此
要点:
--no-verify 可跳过(仅当你确定授权码正确、或离线调试时)。--user/--auth-code 等且在终端(tty)下运行时会逐项交互询问;非交互(agent 批处理)则缺项直接报错,提示补参数。--provider 时,按 --user 域名(如 163.com/126.com)自动选主机,少记一个参数。check。python3 scripts/invoice_forward.py scan 向用户展示将发送清单,用户确认后再执行 python3 scripts/invoice_forward.py run 并复述输出(已发送/跳过/无PDF 各几封)。仅当用户明确说"直接发、不用确认"时才跳过 scan 直接 run。scan --days 30 / run --days 30(默认取 config.json 的 scan.days)。python3 scripts/invoice_forward.py scan(不写状态、不发送,随时可跑)。~/.workbuddy/invoice-forward/config.json 后重跑 check 验证。python3 scripts/invoice_forward.py parse /path/to/发票.pdf(或 .ofd / .xml,自动识别格式)。run 重复执行不会重复转发(状态存于 ~/.workbuddy/invoice-forward/processed.json)。%PDF、OFD=ZIP 且含 OFD.xml、XML=<?xml 开头),随后照常解析转发。适用于腾讯云电子发票等"邮件内只有下载链接"的场景(实测:腾讯云用 COS 预签名 URL,无需登录即可下载)。链接均失败才列入"无发票待人工"并注明原因(链接未返回发票文件=可能需登录或链接已过期 / 链接抓取已禁用)。config.json 的 scan 段可设 fetch_links(默认开)、link_domains(非空时仅下载这些域名后缀的链接,如 ["myqcloud.com","tencent.com"],空=全部)、link_timeout(下载超时秒)、link_max_bytes(单链接上限字节,默认 25MB)、link_user_agent。仅 http(s) 会被下载;字面量私有/环回/链路本地 IP 会被拒绝(SSRF 基础防护);真正兜底的是"仅接受发票格式响应"——绝不执行下载内容,只保存发票字节。config.json 的 send 段可设 interval(每封最小间隔秒)、jitter(额外随机秒上限)、batch_limit(单批上限,超出下轮续跑)。QQ 默认 0 即可;163/126 等严格风控邮箱建议 interval>=3、batch_limit<=20,主题模板建议加 {invoice_no} 提升区分度。account.provider 写 qq/163/126/yeah 或域名后缀自动选主机;也可直接写 imap_host/smtp_host 覆盖。网易系(163/126)登录后会自动发 IMAP ID 自报身份以绕过 "Unsafe Login" 风控(否则选文件夹会被拒)。MAIL_USER/MAIL_AUTH_CODE 临时传入(优先级高于 secrets 文件,便于隔离验证 / CI,授权码免落盘);排查问题时不得把授权码打印到聊天或日志。优先查阅 references/troubleshooting.md(含授权码获取、QQ IMAP 三个实测坑、限流说明、扩展支持 163 等其他邮箱的方法)。