📦 Iris — Rainbow Messenger — Iris — 彩虹信使
v1.0.0Iris — Rainbow Messenger,读取您的Gmail收件箱,根据紧急程度和发送者重要性对每封邮件进行评分,草拟前5封邮件的回复,并生成每日行动...
运行时依赖
安装命令
点击复制技能文档
🌈 Iris — Inbox Intelligence v1.0 ⚡ 快速开始 前往 myaccount.google.com/apppasswords → 为 "Mail" 生成应用密码 设置 GMAIL_ADDRESS 和 GMAIL_APP_PASSWORD 运行 — 在 2 分钟内获取您的收件箱评分、优先级和回复草稿 您将获得: 每封电子邮件根据紧急程度、发送者重要性和内容信号评分为 0-100 附件 📎 和会议 📅 标志 — 以便不会错过操作项 快速两次获取:所有电子邮件的标题,仅前 5 封的全文(处理大型收件箱) 颜色编码的优先级表: 🔴 立即操作 · 🟠 今天 · 🟡 本周 · ⚪ 归档 根据您的姓名/角色为前 5 封电子邮件生成上下文感知的回复草稿 退订候选项:您从未打开的列表中的电子邮件 inbox_report_[日期].md 中的所有已组织的内容 🔒 安全 连接到: imap.gmail.com (您的凭据,仅读取) · 无外部服务 应用密码仅限于特定应用 — 在 Google 账户设置中撤销它们即可立即切断访问。 步骤 1 — 安装 pip3 install rich --break-system-packages --quiet 步骤 2 — 分析您的收件箱 导入 os、imaplib、email、re 从 email.header 导入 decode_header 从 email.utils 导入 parsedate_to_datetime 从 datetime 导入 datetime、timezone 从 rich.console 导入 Console 从 rich.table 导入 Table 从 rich.panel 导入 Panel 从 rich 导入 box console = Console() GMAIL_ADDR = os.environ.get("GMAIL_ADDRESS", "") GMAIL_PASS = os.environ.get("GMAIL_APP_PASSWORD", "") 尝试: SCAN_COUNT = int(os.environ.get("SCAN_COUNT", "50")) 除 ValueError 外: console.print("[yellow]⚠️ SCAN_COUNT 必须是整数 — 默认为 50[/yellow]") SCAN_COUNT = 50 VIP_RAW = os.environ.get("VIP_SENDERS", "") VIP_LIST = [v.strip().lower() for v in VIP_RAW.split(",") if v.strip()] YOUR_NAME = os.environ.get("YOUR_NAME", "") YOUR_ROLE = os.environ.get("YOUR_ROLE", "") 如果不 GMAIL_ADDR 或不 GMAIL_PASS: console.print(Panel("[red]GMAIL_ADDRESS 和 GMAIL_APP_PASSWORD 是必需的。[/red]\n\n" "在 [bold]myaccount.google.com/apppasswords[/bold] 创建应用密码\n" "选择:Mail →您的计算机", title="设置必需", border_style="red")) 引发 SystemExit(1) URGENT_KEYWORDS = ["urgent","asap","deadline","immediately","action required","time sensitive", "overdue","past due","invoice","payment","legal","lawsuit","critical","emergency"] REPLY_KEYWORDS = ["?","question","can you","could you","please","request","following up","reminder"] NOISE_PATTERNS = [r"unsubscribe",r"newsletter",r"no-reply",r"noreply",r"marketing@", r"notifications?@",r"donotreply",r"info@.*\.(com|net)"] def decode_str(s): 如果不 s: 返回 "" parts = decode_header(s) result = "" 对于 part、enc 在 parts 中: 如果 isinstance(part, bytes): 尝试: result += part.decode(enc 或 "utf-8", errors="replace") 除 Exception 外: result += part.decode("latin-1", errors="replace") 否则: result += str(part) 返回 result.strip() MEETING_KEYWORDS = ["calendar invite","meeting request","zoom","teams meeting","google meet", "webex","invited you","join the meeting","scheduled a","let's meet","video call"] def score_email(subject, sender, body_snippet, age_hours, has_attachment=False): 评分 = 50 subj_lower = subject.lower() body_lower = body_snippet.lower() sender_lower = sender.lower() 噪声惩罚首先应用 — VIP 可以克服它 is_noise = any(re.search(p, sender_lower) for p in NOISE_PATTERNS) 如果 is_noise: 评分 -= 40 VIP 发送者 如果 any(vip in sender_lower for vip in VIP_LIST): 评分 += 40 紧急关键词在主题中 对于 kw 在 URGENT_KEYWORDS 中: 如果 kw 在 subj_lower 中: 评分 += 15 中断 回复信号 如果 any(kw in subj_lower or kw in body_lower for kw in REPLY_KEYWORDS): 评分 += 10 会议/日历邀请 如果 any(kw in subj_lower or kw in body_lower for kw in MEETING_KEYWORDS): 评分 += 20 具有附件 — 可能需要操作 如果 has_attachment: 评分 += 15 新鲜度 如果 age_hours < 2: 评分 += 20 elif age_hours < 8: 评分 += 10 elif age_hours > 48: 评分 -= 10 RE:或 FWD:(线程,可能需要响应) 如果 re.match(r"^(re:|fwd?:)", subj_lower): 评分 += 5 返回 max(0, min(100, 评分)) def get_priority(score): 如果评分 >= 80: 返回 ("🔴", "立即操作", "red") 如果评分 >= 60: 返回 ("🟠", "今天", "orange3") 如果评分 >= 40: 返回 ("🟡", "本周", "yellow") 返回 ("⚪", "归档", "dim") console.print(Panel("[bold cyan]📧 🌈 Iris — Inbox Intelligence v1.0[/bold cyan]\n连接到 Gmail...", border_style="cyan")) 尝试: mail = imaplib.IMAP4_SSL("imap.gmail.com") mail.login(GMAIL_ADDR, GMAIL_PASS) mail.select("inbox") 除 Exception as e 外: console.print(