Python自動(dòng)提取郵件訂閱鏈接并解析
通過構(gòu)建一條可配置的處理流水線:IMAP抓取 → 多策略解析 → URL去重 → LLM分析 → 報(bào)告生成。自動(dòng)從訂閱郵件中提取文章鏈接,生成結(jié)構(gòu)化 AI 分析報(bào)告。:
- 多過濾器(多來源)統(tǒng)一處理
- 通過策略模式,適配不同郵件結(jié)構(gòu)
- 分析階段支持增量輸出,避免長(zhǎng)任務(wù)數(shù)據(jù)丟失
- CLI 驅(qū)動(dòng) + 配置驅(qū)動(dòng),具備可擴(kuò)展性
架構(gòu)設(shè)計(jì)(Architecture)
架構(gòu)圖(Mermaid)

架構(gòu)解讀
模塊劃分
| 模塊 | 職責(zé) |
|---|---|
| Config | 配置加載 + 校驗(yàn) |
| Fetcher | IMAP 拉取郵件 |
| Parser | URL 提取(多策略) |
| Analyzer | 調(diào)用 LLM 分析 |
| Reporter | 輸出報(bào)告 |
數(shù)據(jù)流
- Email → URL → AnalysisResult → Report
設(shè)計(jì)
- 解耦:Fetcher / Parser / Analyzer 可獨(dú)立替換
- 擴(kuò)展性:新增解析策略無需改主流程
- 復(fù)用性:Analyzer 可用于任意 URL 數(shù)據(jù)源
核心流程(Main Flow)
流程拆解
1. 啟動(dòng) / 初始化
- 輸入:CLI 參數(shù) + config.toml
- 處理:加載配置、初始化模塊
- 輸出:Config 對(duì)象
2. 郵件抓取
輸入:FilterConfig
處理:
- IMAP 搜索(UNSEEN + FROM)
- Python 二次過濾(關(guān)鍵詞)
輸出:郵件列表
3. URL 提取
輸入:郵件內(nèi)容(HTML/Text)
處理:
- 根據(jù)策略選擇 parser
- 解析鏈接
- 去 tracking 參數(shù)
輸出:ExtractedURL[]
4. 分析階段
輸入:URL + Prompt 模板
處理:
- 構(gòu)造 Prompt
- 調(diào)用 Gemini CLI
- 清洗輸出
輸出:AnalysisResult
5. 輸出生成
輸入:URL + AnalysisResult
處理:
- Markdown 渲染
- JSON 序列化
輸出:報(bào)告文件
核心實(shí)現(xiàn)解析(Key Implementation)
配置系統(tǒng)(類型安全 + 多過濾器)
統(tǒng)一管理多來源郵件規(guī)則,避免硬編碼。
@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")
設(shè)計(jì)
- ? 使用 dataclass → 類型安全
- ? 支持多 filter → 擴(kuò)展性強(qiáng)
Fetcher(IMAP + 雙層過濾)
高效篩選目標(biāo)郵件,減少無效解析。
search_criteria = ["UNSEEN"]
if filter_config.sender:
search_criteria.extend(["FROM", filter_config.sender])
if not filter_config.title_keywords:
return True
設(shè)計(jì)
- IMAP 過濾(粗篩)
- Python 過濾(精篩)
- ? 減少網(wǎng)絡(luò)數(shù)據(jù)量
- ? 靈活性高
Parser(策略模式)
適配不同郵件格式(Medium / Newsletter 等)
class ParserFactory:
def create(extract_format):
if extract_format == "name_url":
return MediumParser()
設(shè)計(jì)
- 多解析策略
- HTML + Text 雙路徑
- 去重(base URL)
- ? 高擴(kuò)展性
- ? 易新增格式
URL 解析與清洗(抗噪核心)
去除跳轉(zhuǎn)鏈接、過濾無效頁面
redirect_params = ["redirectUrl", "url", "target"]
if any(keyword in lower_title for keyword in _NOISY_TITLE_KEYWORDS):
return False
設(shè)計(jì)
- 解析 query 參數(shù)獲取真實(shí) URL
- 基于規(guī)則過濾非文章鏈接
- ? 提高數(shù)據(jù)質(zhì)量
Analyzer(LLM 調(diào)用工程化)
穩(wěn)定調(diào)用 Gemini CLI,生成結(jié)構(gòu)化分析
with tempfile.NamedTemporaryFile(...) as tmp_user: env["GEMINI_SYSTEM_MD"] = tmp_sys_path
關(guān)鍵設(shè)計(jì)
- 文件傳參(避免 shell 轉(zhuǎn)義問題)
- retry + backoff
- 噪聲過濾
- ? 穩(wěn)定性強(qiáng)
- ? 可控性高
增量輸出(防數(shù)據(jù)丟失)
for result in analyzer.analyze_articles(...):
reporter.generate_summaries_report(...)
設(shè)計(jì)
- 長(zhǎng)任務(wù)不中斷
- 每一步都有持久化
- ? 高可靠性
以上就是Python自動(dòng)提取郵件訂閱鏈接并解析的詳細(xì)內(nèi)容,更多關(guān)于Python提取郵件訂閱鏈接的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)Sqlite將字段當(dāng)做索引進(jìn)行查詢的方法
這篇文章主要介紹了Python實(shí)現(xiàn)Sqlite將字段當(dāng)做索引進(jìn)行查詢的方法,涉及Python針對(duì)sqlite數(shù)據(jù)庫索引操作的相關(guān)技巧,需要的朋友可以參考下2016-07-07
Seaborn數(shù)據(jù)分析NBA球員信息數(shù)據(jù)集
這篇文章主要為大家介紹了Seaborn數(shù)據(jù)分析處理NBA球員信息數(shù)據(jù)集案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Python中處理unchecked未捕獲異常實(shí)例
這篇文章主要介紹了Python中處理unchecked未捕獲異常實(shí)例,本文講解使用回調(diào)或者是鉤子來處理unchecked異常,需要的朋友可以參考下2015-01-01
python 根據(jù)pid殺死相應(yīng)進(jìn)程的方法
下面小編就為大家?guī)硪黄猵ython 根據(jù)pid殺死相應(yīng)進(jìn)程的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Python實(shí)現(xiàn)的線性回歸算法示例【附csv文件下載】
這篇文章主要介紹了Python實(shí)現(xiàn)的線性回歸算法,涉及Python使用最小二乘法、梯度下降算法實(shí)現(xiàn)線性回歸相關(guān)算法操作與使用技巧,需要的朋友可以參考下2018-12-12
利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例
今天小編就為大家分享一篇利用pandas將numpy數(shù)組導(dǎo)出生成excel的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06

