Python自动提取邮件订阅链接并解析

通过构建一条可配置的处理流水线: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)

配置系统(类型安全 + 多过滤器)

统一管理多来源邮件规则,避免硬编码。

plain 复制代码
@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 + 双层过滤)

高效筛选目标邮件,减少无效解析。

plain 复制代码
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 等)

plain 复制代码
class ParserFactory:
    def create(extract_format):
        if extract_format == "name_url":
            return MediumParser()

设计

  • 多解析策略
  • HTML + Text 双路径
  • 去重(base URL)
  • ✔ 高扩展性
  • ✔ 易新增格式

URL 解析与清洗(抗噪核心)

去除跳转链接、过滤无效页面

plain 复制代码
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,生成结构化分析

plain 复制代码
with tempfile.NamedTemporaryFile(...) as tmp_user:

env["GEMINI_SYSTEM_MD"] = tmp_sys_path

关键设计

  • 文件传参(避免 shell 转义问题)
  • retry + backoff
  • 噪声过滤
  • ✔ 稳定性强
  • ✔ 可控性高

增量输出(防数据丢失)

plain 复制代码
for result in analyzer.analyze_articles(...):
    reporter.generate_summaries_report(...)

设计

  • 长任务不中断
  • 每一步都有持久化
  • ✔ 高可靠性

源码 URL:https://github.com/alwaysrun/EmailExtractor

相关推荐
把我格子衫拿来6 小时前
VTK 体绘制入门到排错:传递函数、采样距离与透明度的关系
python·vtk·可视化·医学影像·体绘制
张张123y11 小时前
后端第一课:输入 URL 后发生了什么?我用手写 Socket 把全链路跑通了
python·websocket·ai·socket·url·后端开发
全栈弄潮儿14 小时前
Python实战第7期:字典与集合
后端·python·编程语言
2603_9651481114 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya15 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
把我格子衫拿来15 小时前
Dice 很高就够了吗?分割评价中的 IoU、表面距离与 HD95
python·图像分割·模型评估·医学影像·dice
曲径海盗15 小时前
【Python 学习第 31 天】复习:变量与数据类型 等 3 题
python·学习笔记·编程入门
Data_Journal15 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
我命由我1234516 小时前
智能助手通用问答边界
人工智能·python·学习·ai·学习方法·ai编程·智能体
Angeldream12316 小时前
第 4 章 医学影像预处理
图像处理·人工智能·python·医学影像·医学影像处理