Commit Graph
3 Commits
  • fix(unsub): List-Unsubscribe 头兜底 + mailto 退订按钮放行
    两封推广邮件无退订按钮,两个独立根因:
    1. Cloudflare 邮件 (msg_id=1364):程序只喂纯文本给 AI,纯文本里
       'Unsubscribe' 无 URL;邮件头 List-Unsubscribe 的权威退订链接被丢弃。
       -> 解析 List-Unsubscribe 头 (RFC 2369) 存入 Email.list_unsubscribe,
          注入 AI 提示词;显示层新增 _ensure_unsub_link 兜底:AI 漏提取时
          直接用头部 http(s)/mailto 链接补退订按钮(不依赖 AI)。
    2. InferX 邮件 (msg_id=1363):AI 提取到 mailto:team@inferx.net?subject=Unsubscribe,
       但 _link_buttons 只放行 http 协议把它过滤掉。
       -> URL 校验放行 mailto:(退订场景常见)。
    
    send_summary / tg_send_and_mark 均应用兜底并写回 summary_data.links,
    回调恢复视图也能显示退订按钮。新增 6 个测试,共 14 个全部通过。
  • fix(tg_bot): 放宽退订链接 URL 长度上限,长 tracking 链接不被误杀
    实测 D:\DOWNLOADS\mail_bot.db 中 ChatGPT 推广邮件的退订链接
    (https://r.openai.com/asm/unsubscribe/?...) 长度 700+ 字符,
    而 _link_buttons 的 len(url) < 200 校验会把它过滤掉,导致
    即使 AI 提取出退订链接、显示层也修好了,按钮依然不显示。
    上限 200 -> 2048(Telegram inline URL 按钮安全范围)。
    
    新增回归测试 test_long_unsub_url_rendered / test_oversized_url_filtered,
    共 9 个用例全部通过。
  • fix(tg_bot): 推广邮件键盘渲染退订链接 + 强化提示词提取优先级
    - _summary_keyboard 推广分支忽略 links 参数,AI 提取到退订链接也不显示
      现改为退订链接排第一行(🔕),保留告诉我更多/查看原文按钮
    - CALLBACK_PROMO_DETAIL 展开详情键盘同样带上退订链接
    - 抽取 _is_unsub_link/_link_buttons 辅助函数,退订链接(含 URL 关键词变体)排最前
    - SYSTEM_PROMPT: 退订提取规则提升为最高优先级,推广邮件必须输出退订链接
      且占 links 第一位,其余链接最多 2 条,不得挤掉退订链接
    - 新增 tests/test_unsub_keyboard.py 7 个用例全部通过