Forwarded mails (e.g. Yandex webmail) arrive as a single text/html part
with no <html>/<body> wrapper and no text/plain alternative. Two bugs made
their codes unextractable:
- stripHtmlTags dropped href attributes, so button-only mails (Netflix
'Get Code') reached the LLM with no URL at all → codeExist=0.
Anchors now render as 'label [url]' with & decoded.
- extractMailBodies only recognised single-part HTML wrapped in
<html>/<body>, so htmlBody was null and the Rendered preview was empty.
A bare fragment with Content-Type text/html now counts as the html body.
Verified against the real forwarded Netflix mail from production raw_mails:
content now carries the travel/verify link and classifies 5/5 as
login_code.
Gmail/Yahoo bulk-sender rules (2024) force large senders (Netflix via SES,
etc.) to add List-Unsubscribe to verification emails too, so it can no
longer be an unconditional bulk signal — real access-code mail was being
filtered before the LLM and never reached code_mails.
List-ID/List-Post, Precedence bulk/list, and ESP campaign X-headers remain
unconditional. List-Unsubscribe alone is now exempted when the decoded
subject looks transactional (code/verify/OTP/sign-in/reset/验证码/…);
genuine ads that slip through still get codeExist=0 from the classifier.
- src/mcp.ts: unused v1 JSON-RPC MCP implementation (claimed Basic Auth,
old tool names); the live server is src/mcp/server.ts
- test/mcp.test.ts: only tested the dead file
- db/schema.sql: superseded by migrations/