Gemini 3.5-flash 功能全景:用 AI 实现邮件自动分类与摘要生成
文章摘要:文章介绍如何利用Gemini 3.5-flash AI模型实现邮件自动化处理,解决日常工作中邮件分类、摘要生成和待办事项提取的痛点。通过Python示例演示了从IMAP读取邮件、设计提示词、调用API生成结构化JSON结果的完整流程,并提供了规则兜底、优先级策略等优化建议。这种方案特别适合需要处理大量邮件的开发者、运营和项目经理,能将低效的邮件筛选转化为可自动化的高效流程。文章还推荐了 KULAAI 镜像平台作为低门槛体验多种AI模型的入口。
每天打开邮箱,最怕看到的不是未读邮件,而是“未读 99+”:客户反馈、系统告警、会议通知、报表抄送、广告订阅混在一起,真正需要处理的内容反而被淹没。对开发者、运营、项目经理来说,邮件整理是一件低价值但高频的事。现在可以把这类重复劳动交给 Gemini 3.5-flash 来完成:自动识别邮件类型、生成摘要、提取待办事项。如果你只是想先低门槛体验 Gemini、ChatGPT、Claude、Grok、DeepSeek 等模型,也可以使用KULAAI镜像平台(https://ouai.me),手机或邮箱注册即可进入,无需特殊网络。
1. 为什么适合用 Gemini 3.5-flash 处理邮件?
邮件处理有几个典型特点:
- 文本量不算极大,但数量多;
- 内容结构相对稳定;
- 分类标准可以提前定义;
- 摘要结果要求简洁、稳定、可复用;
- 很多邮件并不需要人工逐字阅读。
这正好适合轻量、高响应速度的模型处理。
以 Gemini 3.5-flash 这类偏“快速响应”的模型为例,它适合做三件事:
自动分类
判断邮件属于客户咨询、系统告警、会议通知、账单报表、广告订阅、内部协作等类型。摘要生成
把一封较长的邮件压缩成 2~4 句话,保留关键信息。行动项提取
自动识别“需要谁在什么时候做什么”,方便后续接入待办系统。
如果你每天要处理几十封甚至上百封邮件,这个流程可以明显减少筛选时间。
2. 实现思路:邮件进入,AI 输出结构化结果
我们先设计一个简单流程:
text
读取邮箱邮件 ↓ 提取标题、发件人、正文 ↓ 调用 Gemini 3.5-flash ↓ 输出分类、摘要、优先级、待办事项 ↓ 保存到本地 JSON / 数据库 / 表格这里最关键的是:不要让模型随意输出一大段自然语言,而是要求它返回固定 JSON。
例如我们希望结果长这样:
json
{ "category": "客户反馈", "priority": "高", "summary": "客户反馈登录接口偶发超时,希望尽快排查并同步处理进度。", "actions": [ { "owner": "技术支持", "task": "排查登录接口超时问题", "deadline": "今天下班前" } ] }结构化结果的好处是后续容易接入系统,比如写入数据库、导入飞书表格、同步到工单系统等。
3. 准备 Python 环境
CSDN 读者一般更关心可落地方案,这里用 Python 做一个最小可运行版本。
安装依赖:
bash
pip install google-generativeai python-dotenv beautifulsoup4项目结构可以这样:
text
email-ai-demo/ ├── main.py ├── .env └── requirements.txt.env文件中放模型 API Key 和邮箱配置:
env
GEMINI_API_KEY=your_api_key EMAIL_HOST=imap.example.com EMAIL_USER=your_email@example.com EMAIL_PASSWORD=your_email_password_or_app_password注意:实际生产环境不要把密钥直接写进代码仓库,建议使用环境变量、密钥管理服务或 CI/CD 平台的 Secret 配置。
4. 读取邮件内容
下面用 IMAP 演示读取最近几封邮件。不同邮箱服务商的 IMAP 地址不同,使用前需要在邮箱设置里开启 IMAP。
python
import imaplib import email from email.header import decode_header from bs4 import BeautifulSoup import os from dotenv import load_dotenv load_dotenv() EMAIL_HOST = os.getenv("EMAIL_HOST") EMAIL_USER = os.getenv("EMAIL_USER") EMAIL_PASSWORD = os.getenv("EMAIL_PASSWORD") def decode_text(text): if not text: return "" parts = decode_header(text) result = "" for content, charset in parts: if isinstance(content, bytes): result += content.decode(charset or "utf-8", errors="ignore") else: result += content return result def extract_body(msg): body = "" if msg.is_multipart(): for part in msg.walk(): content_type = part.get_content_type() content_disposition = str(part.get("Content-Disposition")) if "attachment" in content_disposition: continue payload = part.get_payload(decode=True) if not payload: continue charset = part.get_content_charset() or "utf-8" text = payload.decode(charset, errors="ignore") if content_type == "text/plain": body += text elif content_type == "text/html" and not body: soup = BeautifulSoup(text, "html.parser") body += soup.get_text(separator="\n") else: payload = msg.get_payload(decode=True) if payload: charset = msg.get_content_charset() or "utf-8" body = payload.decode(charset, errors="ignore") return body.strip() def fetch_latest_emails(limit=5): mail = imaplib.IMAP4_SSL(EMAIL_HOST) mail.login(EMAIL_USER, EMAIL_PASSWORD) mail.select("INBOX") status, data = mail.search(None, "ALL") if status != "OK": return [] email_ids = data[0].split() latest_ids = email_ids[-limit:] results = [] for eid in reversed(latest_ids): status, msg_data = mail.fetch(eid, "(RFC822)") if status != "OK": continue raw_email = msg_data[0][1] msg = email.message_from_bytes(raw_email) subject = decode_text(msg.get("Subject")) sender = decode_text(msg.get("From")) date = msg.get("Date") body = extract_body(msg) results.append({ "subject": subject, "sender": sender, "date": date, "body": body[:6000] }) mail.logout() return results这里做了一个小限制:正文只截取前 6000 个字符。原因很简单,邮件里可能包含很长的历史引用、签名、免责声明。对分类和摘要来说,前面部分通常已经足够。
5. 设计提示词:让模型稳定输出 JSON
提示词是邮件自动化效果的核心。不要只写“帮我总结这封邮件”,而是要明确角色、分类标准和输出格式。
示例 Prompt:
python
def build_prompt(email_item): return f""" 你是一个企业邮件智能助理,请根据邮件内容完成分类、摘要和待办提取。 分类只能从以下选项中选择一个: - 客户咨询 - 客户反馈 - 系统告警 - 会议通知 - 账单报表 - 内部协作 - 广告订阅 - 其他 优先级只能从以下选项中选择一个: - 高 - 中 - 低 请严格返回 JSON,不要输出 Markdown,不要添加解释文字。 JSON 格式如下: {{ "category": "分类", "priority": "优先级", "summary": "不超过80字的摘要", "actions": [ {{ "owner": "负责人,如果无法判断则写未知", "task": "需要完成的事项", "deadline": "截止时间,如果没有则写未提及" }} ] }} 邮件信息: 标题:{email_item["subject"]} 发件人:{email_item["sender"]} 时间:{email_item["date"]} 正文: {email_item["body"]} """这个 Prompt 有几个关键点:
- 分类项固定,减少模型自由发挥;
- 优先级固定,便于后续排序;
- 摘要限制字数,适合列表展示;
- 待办事项结构化,方便接入任务系统;
- 要求只返回 JSON,便于程序解析。
6. 调用 Gemini 3.5-flash 生成结果
下面给出一个调用示例。不同 SDK 版本的接口名称可能略有变化,实际使用时以官方文档为准。
python
import google.generativeai as genai import json import os from dotenv import load_dotenv load_dotenv() genai.configure(api_key=os.getenv("GEMINI_API_KEY")) model = genai.GenerativeModel("gemini-3.5-flash") def analyze_email(email_item): prompt = build_prompt(email_item) response = model.generate_content(prompt) text = response.text.strip() # 兼容模型偶尔返回 ```json 包裹的情况 if text.startswith("```"): text = text.replace("```json", "").replace("```", "").strip() try: return json.loads(text) except json.JSONDecodeError: return { "category": "其他", "priority": "中", "summary": "模型返回结果解析失败,需要人工查看。", "actions": [] }再把前面的邮件读取逻辑串起来:
python
def main(): emails = fetch_latest_emails(limit=5) for index, item in enumerate(emails, start=1): result = analyze_email(item) print("=" * 60) print(f"邮件 {index}") print("标题:", item["subject"]) print("发件人:", item["sender"]) print("分类:", result.get("category")) print("优先级:", result.get("priority")) print("摘要:", result.get("summary")) print("待办:", result.get("actions")) if __name__ == "__main__": main()运行后,你就可以看到类似结果:
text
============================================================ 邮件 1 标题:登录接口偶发超时问题反馈 发件人:customer@example.com 分类:客户反馈 优先级:高 摘要:客户反馈登录接口偶发超时,希望技术团队尽快排查并同步处理进度。 待办:[{'owner': '技术支持', 'task': '排查登录接口超时问题', 'deadline': '未提及'}]7. 让结果更像“可用工具”,而不是 Demo
如果只是打印到控制台,价值还不够。建议继续做三层增强。
7.1 保存到 JSON 文件
python
def save_results(results, filename="email_results.json"): with open(filename, "w", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2)主流程中可以这样处理:
python
def main(): emails = fetch_latest_emails(limit=10) final_results = [] for item in emails: analysis = analyze_email(item) final_results.append({ "subject": item["subject"], "sender": item["sender"], "date": item["date"], "analysis": analysis }) save_results(final_results)7.2 增加规则兜底
AI 分类很好用,但生产环境建议保留规则兜底。例如:
- 标题包含“告警”“报警”“异常”,优先标记为系统告警;
- 发件人来自财务系统,优先标记为账单报表;
- 发件人来自订阅平台,优先标记为广告订阅。
这样可以降低误判风险。
python
def rule_based_category(email_item): subject = email_item["subject"] if any(keyword in subject for keyword in ["告警", "报警", "异常", "失败"]): return "系统告警" if any(keyword in subject for keyword in ["账单", "发票", "付款", "费用"]): return "账单报表" return None调用时可以先走规则,再走模型:
python
def analyze_with_rules(email_item): category = rule_based_category(email_item) result = analyze_email(email_item) if category: result["category"] = category return result7.3 建立优先级策略
优先级不能完全依赖语气判断,可以组合多个条件:
- 客户反馈 + 负面情绪 = 高;
- 系统告警 + 失败/宕机/超时 = 高;
- 会议通知 + 今天/明天 = 中或高;
- 广告订阅默认低。
在实际项目里,可以让模型给出初判,再由规则做修正。
8. 常见问题与优化建议
8.1 邮件太长怎么办?
可以先做正文清洗:
- 删除历史引用;
- 删除签名;
- 删除免责声明;
- 删除重复空行;
- 只保留最近一次回复。
如果仍然很长,可以分段摘要,再汇总成最终摘要。
8.2 JSON 解析失败怎么办?
模型偶尔会输出多余文本。解决方式有三种:
- Prompt 中强调“只返回 JSON”;
- 对返回内容做清洗;
- 解析失败时重新请求一次,并附上“上次格式错误,请只返回合法 JSON”。
8.3 如何避免泄露敏感信息?
邮件里可能包含客户信息、合同金额、内部账号等内容。建议:
- 调用前做脱敏处理;
- 不处理高度敏感邮件;
- 保留访问日志;
- 对输出结果做权限控制;
- 在企业场景中遵守内部数据安全规范。
8.4 分类不准怎么办?
不要一开始就设置十几个分类。建议从 5~8 个高频类别开始,跑一周后再优化。
还可以收集人工修正结果,形成 few-shot 示例:
text
示例1: 标题:服务器 CPU 使用率超过 90% 分类:系统告警 优先级:高 示例2: 标题:本周五项目例会安排 分类:会议通知 优先级:中把这些示例加入 Prompt,准确率通常会更稳定。
9. 小结
Gemini 3.5-flash 很适合做邮件自动化中的“轻量智能层”:它不负责替你做所有决策,而是帮你把杂乱邮件变成结构化信息。
本文完成了一个基础闭环:
- 通过 IMAP 读取邮件;
- 提取标题、发件人、时间和正文;
- 使用模型完成分类、摘要、待办提取;
- 返回 JSON 结构化结果;
- 加入规则兜底,提高可控性。
如果继续扩展,可以接入数据库、Web 后台、消息通知、工单系统,甚至做成一个团队级邮件助手。真正的价值不在于“AI 帮你看邮件”这个概念,而在于它把低效筛选变成了可自动化、可追踪、可持续优化的流程。
注:本文配图由ChatGpt Image-2 辅助生成。
【本文完】
