Gmail 与 Calendar 自动化
Google Workspace 的 Gmail 和 Calendar 通过 Apps Script 和 API 可以实现强大的邮件和日程自动化。
自动化架构
graph TB
A[Gmail/Calendar 自动化] --> B[邮件处理]
A --> C[日程管理]
A --> D[跨工具联动]
B --> B1[自动分类]
B --> B2[批量回复]
B --> B3[附件提取]
C --> C1[会议自动创建]
C --> C2[冲突检测]
C --> C3[会议纪要]
D --> D1[邮件→任务]
D --> D2[日程→提醒]
D --> D3[日程→报表]
style A fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style B fill:#c8e6c9,stroke:#43a047,stroke-width:2px
style C fill:#fff9c4,stroke:#f9a825,stroke-width:2px
邮件自动化引擎
from dataclasses import dataclass, field
from enum import Enum
import re
class EmailCategory(Enum):
URGENT = "紧急"
CLIENT = "客户"
INTERNAL = "内部"
NEWSLETTER = "订阅"
SPAM = "垃圾"
OTHER = "其他"
@dataclass
class Email:
sender: str
subject: str
body: str
timestamp: str
has_attachment: bool = False
labels: list[str] = field(default_factory=list)
class EmailClassifier:
"""邮件自动分类器"""
RULES = [
(r"(urgent|紧急|ASAP|尽快)", EmailCategory.URGENT),
(r"@(client|customer)\.(com|cn)", EmailCategory.CLIENT),
(r"@(company\.com|内部)", EmailCategory.INTERNAL),
(r"(unsubscribe|退订|newsletter)", EmailCategory.NEWSLETTER),
]
VIP_SENDERS = ["ceo@company.com", "boss@company.com"]
def classify(self, email: Email) -> EmailCategory:
"""基于规则的邮件分类"""
# VIP 发件人直接标记为紧急
if email.sender in self.VIP_SENDERS:
return EmailCategory.URGENT
text = f"{email.subject} {email.body}".lower()
for pattern, category in self.RULES:
if re.search(pattern, text, re.IGNORECASE):
return category
return EmailCategory.OTHER
class EmailAutoResponder:
"""邮件自动回复器"""
TEMPLATES = {
EmailCategory.CLIENT: (
"感谢您的来信,我们已收到您的邮件。"
"工作日内将在24小时内回复。"
),
EmailCategory.NEWSLETTER: None, # 不回复
}
OOO_TEMPLATE = (
"您好,我目前不在办公室,将于 {return_date} 返回。"
"紧急事务请联系 {backup_contact}。"
)
def should_auto_reply(self, category: EmailCategory) -> bool:
return category in self.TEMPLATES and self.TEMPLATES[category]
def generate_reply(self, category: EmailCategory) -> str | None:
return self.TEMPLATES.get(category)
def generate_ooo(
self, return_date: str, backup_contact: str
) -> str:
return self.OOO_TEMPLATE.format(
return_date=return_date,
backup_contact=backup_contact,
)
日程自动化
from dataclasses import dataclass, field
from datetime import datetime, timedelta
@dataclass
class CalendarEvent:
title: str
start: datetime
end: datetime
attendees: list[str] = field(default_factory=list)
location: str = ""
description: str = ""
recurring: bool = False
class CalendarAutomation:
"""Google Calendar 自动化"""
def __init__(self):
self.events: list[CalendarEvent] = []
def detect_conflicts(
self, new_event: CalendarEvent
) -> list[CalendarEvent]:
"""检测日程冲突"""
conflicts = []
for event in self.events:
if (new_event.start < event.end and
new_event.end > event.start):
conflicts.append(event)
return conflicts
def find_free_slots(
self,
date: datetime,
duration_minutes: int = 60,
work_start: int = 9,
work_end: int = 18,
) -> list[tuple[datetime, datetime]]:
"""查找空闲时间段"""
day_events = sorted(
[e for e in self.events
if e.start.date() == date.date()],
key=lambda e: e.start
)
slots = []
current = date.replace(hour=work_start, minute=0)
end_of_day = date.replace(hour=work_end, minute=0)
duration = timedelta(minutes=duration_minutes)
for event in day_events:
if event.start - current >= duration:
slots.append((current, event.start))
current = max(current, event.end)
if end_of_day - current >= duration:
slots.append((current, end_of_day))
return slots
def auto_schedule_meeting(
self,
title: str,
attendees: list[str],
duration_minutes: int,
preferred_dates: list[datetime],
) -> CalendarEvent | None:
"""自动安排会议——找到所有人都空闲的时间"""
for date in preferred_dates:
slots = self.find_free_slots(date, duration_minutes)
if slots:
start, _ = slots[0]
end = start + timedelta(minutes=duration_minutes)
event = CalendarEvent(
title=title,
start=start,
end=end,
attendees=attendees,
)
self.events.append(event)
return event
return None
邮件自动化场景对比
| 场景 | 工具 | 触发方式 | 复杂度 | 节省时间 |
|---|---|---|---|---|
| 邮件自动分类标签 | Gmail Filter + Apps Script | 收件触发 | 低 | 30分钟/天 |
| 客户邮件自动回复 | Apps Script | 收件触发 | 低 | 15分钟/天 |
| 附件自动保存到Drive | Zapier / Apps Script | 收件触发 | 中 | 20分钟/天 |
| 未回复邮件提醒 | Apps Script 定时 | 定时触发 | 中 | 减少遗漏 |
| 会议自动安排 | Calendar API | 手动/Bot | 高 | 1小时/周 |
| 会议纪要自动发送 | AI + Calendar | 会议结束 | 高 | 30分钟/会 |
本章小结
- 邮件分类先于自动回复——先分类再决定是否/如何回复
- VIP 发件人规则优先级最高——老板/客户邮件自动标记紧急
- 日程冲突检测——新会议创建前自动检查冲突
- 空闲时间查找——自动找到最近可用时段
- 跨工具联动——邮件可触发任务创建、日程可触发提醒
下一章:OCR 与合同抽取