feat: verification emails displayed as platform + code

This commit is contained in:
2026-07-08 16:15:51 +08:00
parent 9991e4ef17
commit be4e957af9
2 changed files with 17 additions and 2 deletions

View File

@@ -17,6 +17,7 @@ SYSTEM_PROMPT = """你是一个邮件摘要助手。请分析邮件内容并以
"sender": "发件人", "sender": "发件人",
"category": "normal/promotion/notification", "category": "normal/promotion/notification",
"summary": "50字以内的核心摘要", "summary": "50字以内的核心摘要",
"verification_code": "",
"priority": "high/medium/low", "priority": "high/medium/low",
"action_required": true/false, "action_required": true/false,
"action_items": ["待办事项1", "待办事项2"], "action_items": ["待办事项1", "待办事项2"],
@@ -31,7 +32,8 @@ SYSTEM_PROMPT = """你是一个邮件摘要助手。请分析邮件内容并以
其中: 其中:
- subject 不能照抄原邮件主题,必须是你总结生成的简短标题 - subject 不能照抄原邮件主题,必须是你总结生成的简短标题
- category: 邮件类型。推广邮件(营销、促销、广告、 newsletter 推广等)标记为 "promotion"系统通知类(账单、验证码、订阅提醒等)标记为 "notification";普通邮件标记为 "normal" - category: 邮件类型。推广邮件(营销、促销、广告、 newsletter 推广等)标记为 "promotion"验证码邮件标记为 "notification";普通邮件标记为 "normal"
- verification_code: 仅当 category 为 "notification" 且邮件包含验证码时填写,格式为「平台名称 验证码」如「GitHub 123456」「微信 888888」。非验证码邮件留空字符串
- 当 category 为 "promotion"summary 直接写成一句话:「[发送方名称] 在推广 [推广的产品/服务/活动]」,例如「腾讯云在推广双十一云服务器折扣」。此时 priority 固定为 "low"action_required 为 falsecan_reply 为 falseaction_items 和 reply_suggestions 为空数组 - 当 category 为 "promotion"summary 直接写成一句话:「[发送方名称] 在推广 [推广的产品/服务/活动]」,例如「腾讯云在推广双十一云服务器折扣」。此时 priority 固定为 "low"action_required 为 falsecan_reply 为 falseaction_items 和 reply_suggestions 为空数组
- can_reply 为 false 表示无需回复或不适合建议回复(此时忽略 reply_suggestions - can_reply 为 false 表示无需回复或不适合建议回复(此时忽略 reply_suggestions
- is_simple 为 true 表示纯确认性回复(如"好的""收到"),用户选择后可直发 - is_simple 为 true 表示纯确认性回复(如"好的""收到"),用户选择后可直发

View File

@@ -26,10 +26,12 @@ def send_summary(tg_cfg: TelegramConfig, chat_id: str, summary_text: str,
original_reply_to: str = "", account_email: str = "") -> int: original_reply_to: str = "", account_email: str = "") -> int:
can_reply = summary_data.get("can_reply", True) can_reply = summary_data.get("can_reply", True)
is_promotion = summary_data.get("category") == "promotion" is_promotion = summary_data.get("category") == "promotion"
is_verification = summary_data.get("category") == "notification" and summary_data.get("verification_code")
plain_text = is_promotion or is_verification
result = _tg_req(tg_cfg, "sendMessage", { result = _tg_req(tg_cfg, "sendMessage", {
"chat_id": chat_id, "chat_id": chat_id,
"text": summary_text, "text": summary_text,
"parse_mode": "MarkdownV2" if not is_promotion else None, "parse_mode": "MarkdownV2" if not plain_text else None,
"reply_markup": _summary_keyboard(can_reply, is_promotion), "reply_markup": _summary_keyboard(can_reply, is_promotion),
}) })
msg_id = result["result"]["message_id"] msg_id = result["result"]["message_id"]
@@ -97,6 +99,8 @@ def format_summary(data: dict, account_email: str = "") -> str:
category = data.get("category", "normal") category = data.get("category", "normal")
if category == "promotion": if category == "promotion":
return _format_promotion(data, account_email) return _format_promotion(data, account_email)
if category == "notification" and data.get("verification_code"):
return _format_verification(data, account_email)
return _format_normal(data, account_email) return _format_normal(data, account_email)
@@ -109,6 +113,15 @@ def _format_promotion(data: dict, account_email: str = "") -> str:
return "\n".join(lines) return "\n".join(lines)
def _format_verification(data: dict, account_email: str = "") -> str:
code = data.get("verification_code", "")
lines = [
f"🔑 {_escape(code)}",
f"账户: {_escape(account_email)}",
]
return "\n".join(lines)
def _format_normal(data: dict, account_email: str = "") -> str: def _format_normal(data: dict, account_email: str = "") -> str:
priority = data.get("priority", "medium") priority = data.get("priority", "medium")
icon = _priority_icon.get(priority, "") icon = _priority_icon.get(priority, "")