通过构建一条可配置的处理流水线:IMAP抓取 → 多策略解析 → URL去重 → LLM分析 → 报告生成。自动从订阅邮件中提取文章链接,生成结构化 AI 分析报告。:
- 多过滤器(多来源)统一处理
- 通过策略模式,适配不同邮件结构
- 分析阶段支持增量输出,避免长任务数据丢失
- CLI 驱动 + 配置驱动,具备可扩展性
架构设计(Architecture)
架构图(Mermaid)
架构解读
模块划分
| 模块 | 职责 |
|---|---|
| Config | 配置加载 + 校验 |
| Fetcher | IMAP 拉取邮件 |
| Parser | URL 提取(多策略) |
| Analyzer | 调用 LLM 分析 |
| Reporter | 输出报告 |
数据流
- Email → URL → AnalysisResult → Report
设计
- 解耦:Fetcher / Parser / Analyzer 可独立替换
- 扩展性:新增解析策略无需改主流程
- 复用性:Analyzer 可用于任意 URL 数据源
核心流程(Main Flow)
流程图(Mermaid)
流程拆解
1. 启动 / 初始化
- 输入:CLI 参数 + config.toml
- 处理:加载配置、初始化模块
- 输出:Config 对象
2. 邮件抓取
-
输入:FilterConfig
-
处理:
- IMAP 搜索(UNSEEN + FROM)
- Python 二次过滤(关键词)
-
输出:邮件列表
3. URL 提取
-
输入:邮件内容(HTML/Text)
-
处理:
- 根据策略选择 parser
- 解析链接
- 去 tracking 参数
-
输出:ExtractedURL[]
4. 分析阶段
-
输入:URL + Prompt 模板
-
处理:
- 构造 Prompt
- 调用 Gemini CLI
- 清洗输出
-
输出:AnalysisResult
5. 输出生成
-
输入:URL + AnalysisResult
-
处理:
- Markdown 渲染
- JSON 序列化
-
输出:报告文件
核心实现解析(Key Implementation)
配置系统(类型安全 + 多过滤器)
统一管理多来源邮件规则,避免硬编码。
@dataclasses.dataclass
class FilterConfig:
name: str
sender: str
title_keywords: List[str]
max_emails: int
extract_format: str = "name_url"
for f in filters_data:
if name in names:
raise ValueError("Duplicate filter name")
设计
- ✔ 使用 dataclass → 类型安全
- ✔ 支持多 filter → 扩展性强
Fetcher(IMAP + 双层过滤)
高效筛选目标邮件,减少无效解析。
search_criteria = ["UNSEEN"]
if filter_config.sender:
search_criteria.extend(["FROM", filter_config.sender])
if not filter_config.title_keywords:
return True
设计
- IMAP 过滤(粗筛)
- Python 过滤(精筛)
- ✔ 减少网络数据量
- ✔ 灵活性高
Parser(策略模式)
适配不同邮件格式(Medium / Newsletter 等)
class ParserFactory:
def create(extract_format):
if extract_format == "name_url":
return MediumParser()
设计
- 多解析策略
- HTML + Text 双路径
- 去重(base URL)
- ✔ 高扩展性
- ✔ 易新增格式
URL 解析与清洗(抗噪核心)
去除跳转链接、过滤无效页面
redirect_params = ["redirectUrl", "url", "target"]
if any(keyword in lower_title for keyword in _NOISY_TITLE_KEYWORDS):
return False
设计
- 解析 query 参数获取真实 URL
- 基于规则过滤非文章链接
- ✔ 提高数据质量
Analyzer(LLM 调用工程化)
稳定调用 Gemini CLI,生成结构化分析
with tempfile.NamedTemporaryFile(...) as tmp_user:
env["GEMINI_SYSTEM_MD"] = tmp_sys_path
关键设计
- 文件传参(避免 shell 转义问题)
- retry + backoff
- 噪声过滤
- ✔ 稳定性强
- ✔ 可控性高
增量输出(防数据丢失)
for result in analyzer.analyze_articles(...):
reporter.generate_summaries_report(...)
设计
- 长任务不中断
- 每一步都有持久化
- ✔ 高可靠性
★
源码 URL:github.com/alwaysrun/E…
”