详细分析 ▾
- 所需权限/范围的明确列表(OAuth客户端ID、令牌或连接器名称)
- 它期望哪些二进制文件或平台提供的连接器(例如'gog' CLI)
- 提取的数据和提醒存储或发送位置的清晰描述
- 处理邮箱内容的隐私/安全策略。如果您继续,授予最小范围(如果仅提取,则只读收件箱访问,仅在审查后显式日历写入范围),使用非敏感邮箱进行测试,并验证技能不会将邮箱内容传输到未知外部端点。当前打包不一致——在应该被信任之前需要澄清。
运行时依赖
版本
afrexai-email-to-calendar v1.0.0 - 初始发布,用于从邮件中提取日历事件、截止日期、行动和物流的技能。- 支持任何日历提供商(Google、Outlook、Apple、Notion等),无外部依赖。- 解析邮件中的硬事件、截止日期、重复事件、行动项目、旅行和隐式调度信号。- 提供带置信度评分和类别优先级的结构化提取模板。- 在创建之前以编号列表形式呈现检测到的事件供用户确认。- 包括重复事件检测和可自定义的提醒建议。- 导出到各种格式(Google日历、Apple日历、Notion、ICS)。
安装命令 点击复制
技能文档
Turn emails into structured calendar events with zero missed deadlines.
Quick 开始
When you receive an email (forwarded, pasted, or from inbox):
- 解析 — Extract every 时间-relevant item 使用 框架 下面
- Classify — Score 每个 item 由 类型 和 confidence
- Present — Show structured results 带有 numbered selection
- 创建 — 使用 用户's 日历 tool 到 创建 confirmed events
- 关注 up — Track deadlines 和 发送 reminders
1. Extraction 框架
什么 到 Look 对于
Scan every email for ALL of these categories:
| Category | Signals | Priority |
|---|---|---|
| Hard Events | "meeting at", "call on", "event on", specific date+time | 🔴 High |
| Deadlines | "due by", "submit before", "RSVP by", "register by", "expires" | 🔴 High |
| Soft Events | "sometime next week", "let's meet soon", "planning for March" | 🟡 Medium |
| Recurring | "every Monday", "weekly", "monthly", "standing meeting" | 🟡 Medium |
| Action Items | "please review", "can you send", "follow up on", "action required" | 🟡 Medium |
| Travel/Logistics | Flight numbers, hotel confirmations, check-in times, gate info | 🔴 High |
| Implicit Deadlines | Event is Feb 20 → ticket deadline is likely 1-2 weeks before | 🟡 Medium |
Extraction 模板
For each item found, extract:
- title: "Descriptive name (max 80 chars)"
type: event | deadline | action_item | travel | recurring
date: "YYYY-MM-DD"
day_of_week: "Monday" # Always include for verification
time_start: "14:00" # 24h format, default 09:00 if unclear
time_end: "15:00" # Default: start + 1h for meetings, all-day for deadlines
timezone: "America/New_York" # Extract from email headers or content
is_all_day: false
is_multi_day: false # If true, include end_date
end_date: null
recurrence: null # "weekly" | "biweekly" | "monthly" | "MWF" | custom RRULE
location: null # Physical address or video link
url: null # Registration link, event page, or action URL
attendees: [] # Names/emails mentioned
confidence: high | medium | low
source_quote: "exact text from email that indicates this event"
notes: "any context the user should know"
deadline_action: null # "RSVP" | "register" | "buy tickets" | "submit"
deadline_url: null # Direct link to take action
reminder_minutes: 30 # Suggested reminder (15 for calls, 60 for travel, 1440 for deadlines)
Confidence Scoring
| Confidence | Criteria |
|---|---|
| High | Explicit date + time + clear event type. E.g. "Meeting on Feb 15 at 2pm" |
| Medium | Date but no time, or time but approximate date. E.g. "next Tuesday afternoon" |
| Low | Vague reference. E.g. "we should catch up soon", "sometime in March" |
Smart Defaults
- 否 时间 given 对于 meeting → 09:00-10:00 (mark confidence: medium)
- 否 时间 given 对于 deadline → 23:59 (end 的 day)
- 否 timezone → 使用 用户's 默认 timezone, note assumption
- "Morning" → 09:00, "Afternoon" → 14:00, "Evening" → 18:00, "EOD" → 17:00
- "下一个 week" → Following Monday (mark confidence: medium)
- Multi-day 事件 → 设置 is_multi_day: 真, include 开始 和 end dates
2. Email Classification
Before extracting, classify the email:
| Email Type | How to Handle |
|---|---|
| Calendar notification (from calendar-notification@google.com, outlook, etc.) | SKIP — these are responses to existing events |
| Newsletter/marketing | Extract only if contains relevant event dates |
| Personal/work email | Full extraction |
| Travel confirmation | Extract ALL logistics: flights, hotels, car rentals, check-ins |
| Meeting invite (ICS attachment or structured invite) | Extract directly, high confidence |
| Thread/reply | Only extract NEW events, not ones from quoted text |
| Forwarded email | Process the forwarded content, note original sender |
Ignore Patterns (Skip These)
- Automated 日历 responses (Accepted, Declined, Tentative)
- 退订 confirmations
- 读取 receipts
- Auto-replies / Out 的 office
- Spam/promotional (unless 用户 explicitly forwards )
3. Presentation 格式
Always present extracted items in this format:
📧 From: [sender] | Subject: [subject] | Date: [received date]Found [N] calendar items:
- 🔴 Team Standup — Mon Feb 17, 9:00-9:30 AM EST
📍 Zoom (link in email) | 👥 Alice, Bob, Charlie
🔁 Recurring: Every weekday
✅ Confidence: High- 🔴 Project Deadline: Q1 Report — Fri Feb 28, EOD
⚠️ ACTION REQUIRED: Submit report
🔗 Submission portal
⏰ Suggested reminder: 3 days before
✅ Confidence: High- 🟡 Team Lunch — "sometime next week"
📍 TBD
⚠️ Confidence: Medium — date needs confirmation
Reply with numbers to create (e.g. "1, 2"), "all", or "none".
Type "edit 3" to modify before creating.
Presentation Rules
- Always show day 的 week — humans 验证 dates 由 day name
- 分组 由 日期 当...时 >5 items
- 标志 conflicts — 如果 新的 事件 overlaps existing 日历
- Highlight deadlines 带有 ⚠️ 和 days remaining
- Show source quote 对于 medium/low confidence items
- Never auto-创建 没有 用户 confirmation
4. 日历 Creation
After user confirms, create events using their calendar tool:
Google 日历 (通过 gog 或 API)
gog calendar create \
--title "Event Title" \
--start "2026-02-17T09:00:00-05:00" \
--end "2026-02-17T10:00:00-05:00" \
--description "Extracted from email: [subject]" \
--location "Zoom link or address"
Apple 日历 (通过 osascript)
osascript -e 'tell application "Calendar"
tell calendar "Work"
make new event with properties {summary:"Event Title", 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:"Extracted from email", location:"Zoom"}
end tell
end tell'
Notion / 其他
- 格式 作为 structured data 和 使用 appropriate API
- 或 输出 作为 .ics file 用户 可以 导入 anywhere
ICS 导出 (Universal)
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTART:20260217T090000
DTEND:20260217T100000
SUMMARY:Event Title
DESCRIPTION:Extracted from email
LOCATION:Zoom link
END:VEVENT
END:VCALENDAR
5. Duplicate Detection
Before creating any event, check for duplicates:
- 搜索 日历 对于 events 在...上 相同 日期 带有 similar title (fuzzy match)
- Check tracking file — maintain log 的 created events:
// memory/email-calendar-log.json
{
"created_events": [
{
"email_id": "msg-123",
"email_subject": "Team Offsite",
"event_title": "Team Offsite",
"event_date": "2026-02-17",
"calendar_event_id": "cal-456",
"created_at": "2026-02-13T10:00:00Z"
}
]
}
- 如果 duplicate found: Show 用户 和 ask — " looks similar 到 [existing 事件]. Skip, 更新, 或 创建 anyway?"
6. Deadline & Reminder Engine
Deadline Patterns 到 Detect
| Pattern | Example | Action |
|---|---|---|
| RSVP deadline | "RSVP by Feb 10" | Create reminder 3 days before |
| Registration | "Register by March 1" | Create reminder 1 week before |
| Early bird | "Early bird ends Feb 15" | Create reminder 2 days before |
| Ticket sales | "Tickets on sale until..." | Create reminder + calendar event |
| Submission | "Submit proposal by..." | Create reminder 3 days before |
| Expiration | "Offer expires..." | Create reminder 1 day before |
Reminder Strategy
- >30 days away: Remind 1 week 之前
- 7-30 days away: Remind 3 days 之前
- <7 days away: Remind 1 day 之前
- Deadlines 带有 URLs: Include action URL 在...中 reminder
- 创建 reminder 作为 separate 日历 事件: "⚠️ DEADLINE: [action] 对于 [事件]"
7. Travel Email Handling
Travel confirmations get special treatment:
Extract 所有 的 these:
- ✈️ Flights: airline, flight #, departure/arrival 乘以+airports, terminal, gate, confirmation #
- 🏨 Hotels: name, address, check-在...中/out 乘以, confirmation #
- 🚗 Car rentals: company, pickup/dropoff 乘以+locations, confirmation #
- 📋 Transfers: shuttle 乘以, train bookings
创建 these 日历 events:
- Flight departure — include terminal, gate, flight # 在...中 description
- Flight arrival — 对于 connecting flights too
- Hotel check-在...中 — 带有 address 和 confirmation #
- Hotel check-out — 带有 reminder 到 pack
- Car pickup/dropoff — 带有 location details
Travel-specific reminders:
- Flight: 3 hours 之前 (domestic), 4 hours 之前 (international)
- Hotel check-out: Morning 的 departure
- Include 所有 confirmation numbers 在...中 事件 descriptions
8. Batch 处理中
When scanning an inbox for events:
- 获取 unread emails (或 emails 从 最后的 N days)
- 过滤 out noise — apply ignore patterns
- Extract 从 每个 — run extraction 框架
- Deduplicate 穿过 emails — 相同 事件 mentioned 在...中 multiple threads
- 排序 由 日期 — nearest 第一个
- Present grouped summary:
📬 Inbox Scan: 47 unread → 12 with calendar items → 18 events foundTHIS WEEK (Feb 13-19):
- 🔴 Sprint Review — Thu Feb 13, 3:00 PM
- 🔴 1:1 with Manager — Fri Feb 14, 10:00 AM
...NEXT WEEK (Feb 20-26):
- 🟡 Team Lunch — date TBD (mentioned in 2 emails)
...DEADLINES:
⚠️ Q1 Report — Due Feb 28 (15 days) → Submit here
⚠️ Conference RSVP — Due Feb 20 (7 days) → RSVP
9. Edge Cases
| Situation | How to Handle |
|---|---|
| Multiple timezones in one email | Extract each event in its stated timezone, convert to user's TZ for display |
| "TBD" or "TBA" times | Create all-day event, flag for follow-up |
| Cancelled events | Check if already in calendar → offer to delete |
| Rescheduled events | Find original → offer to update (not create new) |
| Recurring with exceptions | Note specific exception dates in description |
| Date ambiguity (02/03 = Feb 3 or Mar 2?) | Use email's locale/origin for MM/DD vs DD/MM, ask if unclear |
| Events in quoted/forwarded text | Only process if user explicitly forwarded it |
| Attachments with .ics files | Parse ICS directly — highest confidence source |
| "Save the date" emails | Create tentative event, mark as placeholder |
| Conference with multiple sessions | Extract all sessions as separate events with shared description |
10. 会话 Memory
Track user preferences across sessions:
# memory/email-calendar-prefs.yaml
default_timezone: "America/New_York"
default_calendar: "Work"
default_reminder_minutes: 30
auto_create_patterns:
- "standup"
- "1:1"
ignore_patterns:
- "newsletter"
- "marketing"
preferred_format: "12h" # or "24h"
travel_reminder_hours: 3
Update preferences when user corrects you or states a preference.
免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制