名称: afrexai-邮件转日历 版本: 1.0.0 描述: > 从电子邮件中提取日历事件、截止日期、待办事项和后续跟进。 兼容任何日历服务提供商(Google、Outlook、Apple、Notion等)。 无外部依赖——纯智能体智能。 当用户转发邮件、要求检查收件箱中的事件,或希望从任何文本中提取结构化日程数据时使用。
邮件 → 日历提取引擎
将邮件转换为结构化日历事件,不错过任何截止日期。
快速开始
当您收到邮件(转发、粘贴或来自收件箱)时:
- 解析 — 使用以下框架提取每个与时间相关的项目
- 分类 — 按类型和置信度对每个项目进行评分
- 呈现 — 显示带编号选择的结构化结果
- 创建 — 使用用户的日历工具创建确认的事件
- 跟进 — 跟踪截止日期并发送提醒
1. 提取框架
查找内容
扫描每封邮件中的所有以下类别:
| 类别 | 信号 | 优先级 |
|---|---|---|
| 硬性事件 | “会议时间”, “通话于”, “活动于”, 具体日期+时间 | 🔴 高 |
| 截止日期 | “截止于”, “提交前”, “RSVP截止”, “注册截止”, “到期” | 🔴 高 |
| 软性事件 | “下周某个时间”, “我们尽快见面”, “计划三月” | 🟡 中 |
| 重复事件 | “每周一”, “每周”, “每月”, “例会” | 🟡 中 |
| 待办事项 | “请审阅”, “你能发送”, “跟进”, “需要行动” | 🟡 中 |
| 旅行/后勤 | 航班号、酒店确认、入住时间、登机口信息 | 🔴 高 |
| 隐含截止日期 | 活动是2月20日 → 购票截止日期可能在1-2周前 | 🟡 中 |
提取模板
对于找到的每个项目,提取:
- 标题: "描述性名称(最多80字符)"
类型: event | deadline | action_item | travel | recurring
日期: "YYYY-MM-DD"
星期几: "Monday" # 始终包含用于验证
开始时间: "14:00" # 24小时格式,如果不明确则默认为09:00
结束时间: "15:00" # 默认:会议为开始时间+1小时,截止日期为全天
时区: "America/New_York" # 从邮件头或内容中提取
全天事件: false
多日事件: false # 如果为true,包含结束日期
结束日期: null
重复规则: null # "weekly" | "biweekly" | "monthly" | "MWF" | 自定义RRULE
地点: null # 物理地址或视频链接
网址: null # 注册链接、活动页面或行动URL
参与者: [] # 提到的姓名/邮箱
置信度: high | medium | low
来源引用: "指示此事件的邮件原文"
备注: "用户应了解的任何上下文"
截止行动: null # "RSVP" | "register" | "buy tickets" | "submit"
截止网址: null # 直接行动链接
提醒分钟数: 30 # 建议提醒(通话15分钟,旅行60分钟,截止日期1440分钟)
置信度评分
| 置信度 | 标准 |
|---|---|
| 高 | 明确日期 + 时间 + 清晰事件类型。例如:“2月15日下午2点会议” |
| 中 | 有日期但无时间,或有时间但日期近似。例如:“下周二下午” |
| 低 | 模糊提及。例如:“我们应该尽快联系”, “三月某个时间” |
智能默认值
- 会议未给时间 → 09:00-10:00(标记置信度:中)
- 截止日期未给时间 → 23:59(当天结束)
- 无时区 → 使用用户默认时区,注明假设
- “上午” → 09:00, “下午” → 14:00, “晚上” → 18:00, “EOD” → 17:00
- “下周” → 下周一(标记置信度:中)
- 多日活动 → 设置is_multi_day: true,包含开始和结束日期
2. 邮件分类
提取前,先对邮件分类:
| 邮件类型 | 处理方式 |
|---|---|
| 日历通知(来自calendar-notification@google.com、outlook等) | 跳过——这些是对现有事件的响应 |
| 新闻通讯/营销邮件 | 仅当包含相关活动日期时提取 |
| 个人/工作邮件 | 完全提取 |
| 旅行确认 | 提取所有后勤:航班、酒店、租车、入住 |
| 会议邀请(ICS附件或结构化邀请) | 直接提取,高置信度 |
| 线程/回复 | 仅提取新事件,不提取引用文本中的事件 |
| 转发邮件 | 处理转发内容,注明原始发件人 |
忽略模式(跳过这些)
- 自动日历响应(已接受、已拒绝、暂定)
- 退订确认
- 已读回执
- 自动回复/外出
- 垃圾/促销邮件(除非用户明确转发)
3. 呈现格式
始终按此格式呈现提取的项目:
📧 发件人: [发件人] | 主题: [主题] | 日期: [接收日期]
找到 [N] 个日历项目:
1. 🔴 **团队站会** — 2月17日周一,上午9:00-9:30 EST
📍 Zoom(邮件中链接) | 👥 Alice, Bob, Charlie
🔁 重复:每个工作日
✅ 置信度:高
2. 🔴 **项目截止:Q1报告** — 2月28日周五,EOD
⚠️ 需要行动:提交报告
🔗 [提交门户](url)
⏰ 建议提醒:3天前
✅ 置信度:高
3. 🟡 **团队午餐** — "下周某个时间"
📍 待定
⚠️ 置信度:中——日期需要确认
---
回复数字以创建(例如"1, 2")、"全部"或"无"。
输入"编辑 3"在创建前修改。
呈现规则
- 始终显示星期几 — 人类通过星期名称验证日期
- 当>5个项目时按日期分组
- 标记冲突 — 如果新事件与现有日历重叠
- 高亮截止日期,使用⚠️和剩余天数
- 显示中/低置信度项目的来源引用
- 未经用户确认绝不自动创建
4. 日历创建
用户确认后,使用其日历工具创建事件:
Google日历(通过gog或API)
gog calendar create \
--title "事件标题" \
--start "2026-02-17T09:00:00-05:00" \
--end "2026-02-17T10:00:00-05:00" \
--description "从邮件提取:[主题]" \
--location "Zoom链接或地址"
Apple日历(通过osascript)
osascript -e 'tell application "Calendar"
tell calendar "Work"
make new event with properties {summary:"事件标题", start date:date "Monday, February 17, 2026 at 9:00:00 AM", end date:date "Monday, February 17, 2026 at 10:00:00 AM", description:"从邮件提取", location:"Zoom"}
end tell
end tell'
Notion / 其他
- 格式化为结构化数据并使用相应API
- 或输出为.ics文件供用户在任何地方导入
ICS导出(通用)
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTART:20260217T090000
DTEND:20260217T100000
SUMMARY:事件标题
DESCRIPTION:从邮件提取
LOCATION:Zoom链接
END:VEVENT
END:VCALENDAR
5. 重复检测
创建任何事件前,检查重复:
- 搜索日历中相同日期且标题相似的事件(模糊匹配)
- 检查跟踪文件 — 维护已创建事件的日志:
// memory/email-calendar-log.json
{
"created_events": [
{
"email_id": "msg-123",
"email_subject": "团队外出",
"event_title": "团队外出",
"event_date": "2026-02-17",
"calendar_event_id": "cal-456",
"created_at": "2026-02-13T10:00:00Z"
}
]
}
- 如果发现重复:显示给用户并询问——“这看起来与[现有事件]相似。跳过、更新还是仍然创建?”
6. 截止日期和提醒引擎
要检测的截止日期模式
| 模式 | 示例 | 行动 |
|---|---|---|
| RSVP截止 | “2月10日前RSVP” | 创建3天前提醒 |
| 注册 | “3月1日前注册” | 创建1周前提醒 |
| 早鸟价 | “早鸟价2月15日截止” | 创建2天前提醒 |
| 售票 | “售票截止至…” | 创建提醒+日历事件 |
| 提交 | “提案提交截止…” | 创建3天前提醒 |
| 过期 | “优惠到期…” | 创建1天前提醒 |
提醒策略
- >30天:1周前提醒
- 7-30天:3天前提醒
- <7天:1天前提醒
- 带URL的截止日期:在提醒中包含行动URL
- 创建单独日历事件作为提醒:“⚠️ 截止:[事件]的[行动]”
7. 旅行邮件处理
旅行确认需特殊处理:
提取所有这些:
- ✈️ 航班:航空公司、航班号、出发/到达时间+机场、航站楼、登机口、确认号
- 🏨 酒店:名称、地址、入住/退房时间、确认号
- 🚗 租车:公司、取车/还车时间+地点、确认号
- 📋 接送:班车时间、火车预订
创建这些日历事件:
- 航班出发 — 在描述中包含航站楼、登机口、航班号
- 航班到达 — 包括转机航班
- 酒店入住 — 带地址和确认号
- 酒店退房 — 带打包提醒
- 取车/还车 — 带位置详情
旅行特定提醒:
- 航班:国内3小时前,国际4小时前
- 酒店退房:出发当天上午
- 在事件描述中包含所有确认号
8. 批量处理
扫描收件箱查找事件时:
- 获取未读邮件(或最近N天的邮件)
- 过滤噪音 — 应用忽略模式
- 从每封邮件提取 — 运行提取框架
- 跨邮件去重 — 多个线程中提到的相同事件
- 按日期排序 — 最近优先
- 呈现分组摘要:
📬 收件箱扫描:47封未读 → 12封含日历项目 → 找到18个事件
本周(2月13-19日):
1. 🔴 冲刺评审 — 2月13日周四,下午3:00
2. 🔴 与经理1:1 — 2月14日周五,上午10:00
...
下周(2月20-26日):
5. 🟡 团队午餐 — 日期待定(在2封邮件中提到)
...
截止日期:
⚠️ Q1报告 — 2月28日截止(15天)→ [在此提交](url)
⚠️ 会议RSVP — 2月20日截止(7天)→ [RSVP](url)
9. 边缘情况
| 情况 | 处理方式 |
|---|---|
| 一封邮件中多个时区 | 提取每个事件在其声明的时区,转换为用户的时区显示 |
| "TBD"或"TBA"时间 | 创建全天事件,标记为待跟进 |
| 已取消事件 | 检查是否已在日历中 → 提供删除选项 |
| 重新安排的事件 | 查找原始事件 → 提供更新选项(非创建新事件) |
| 有例外的重复事件 | 在描述中注明特定例外日期 |
| 日期歧义(02/03 = 2月3日或3月2日?) | 使用邮件的区域设置/来源判断MM/DD vs DD/MM,如果不明确则询问 |
| 引用/转发文本中的事件 | 仅当用户明确转发时才处理 |
| 带.ics文件的附件 | 直接解析ICS——最高置信度来源 |
| "保存日期"邮件 | 创建暂定事件,标记为占位符 |
| 含多个分会的会议 | 提取所有分会作为单独事件,共享描述 |
10. 会话记忆
跨会话跟踪用户偏好:
# memory/email-calendar-prefs.yaml
默认时区: "America/New_York"
默认日历: "Work"
默认提醒分钟数: 30
自动创建模式:
- "standup"
- "1:1"
忽略模式:
- "newsletter"
- "marketing"
首选格式: "12h" # 或 "24h"
旅行提醒小时数: 3
当用户纠正您或陈述偏好时更新偏好。