跳转到内容

安装后端(CLI + mail-sync)

后端是整个 MailAgent 的引擎:它在后台同步邮件、跑 AI 分类、维护本地数据库。桌面 App 只是它的图形界面。先把后端跑通,再装 App。

整个过程分五步,照着做大约 15 分钟。

第 1 步:克隆仓库并建虚拟环境

Section titled “第 1 步:克隆仓库并建虚拟环境”

打开终端(Terminal 或 iTerm2),执行:

Terminal window
git clone https://github.com/ChenyqThu/MailAgent.git ~/Documents/MailAgent
cd ~/Documents/MailAgent
python3 -m venv venv
source venv/bin/activate
pip install -e ".[cli,dev]"
cp .env.example .env

最后一行 pip install -e ".[cli,dev]" 会把 mailagent 命令装进虚拟环境,-e(可编辑安装)让你 git pull 拉到的代码改动立刻生效,不用重装。

验证装好了:

Terminal window
which mailagent # 应指向 venv/bin/mailagent
mailagent --version # 期望输出 3.0.0

第 2 步:在 Notion 里建好数据库(关键且容易漏)

Section titled “第 2 步:在 Notion 里建好数据库(关键且容易漏)”

MailAgent 把邮件同步到两个 Notion 数据库:一个存邮件,一个存日历。这两个库需要你先在 Notion 里建好,并按下表配齐字段——字段名和类型必须对得上,否则同步会失败。

  1. 浏览器打开 www.notion.so/my-integrations
  2. New integration,起个名字(如 MailAgent),关联到你的工作区。
  3. 创建后复制 Internal Integration Token(以 ntn_ 开头)——这就是 .env 里的 NOTION_TOKEN

新建一个 Notion 数据库(页面里输入 /database → Table - Full page),按下表加好字段。字段名严格对应

字段名类型说明
SubjectTitle邮件主题(数据库自带的标题列改名即可)
Message IDText邮件唯一标识,用于去重
Thread IDText线程标识,同一话题的邮件共享
FromEmail发件人地址
From NameText发件人显示名
ToText收件人
CCText抄送
DateDate邮件日期
Parent ItemRelation(指向本数据库自身)线程头关联,串起一个话题
MailboxSelect收件箱 / 发件箱 / 存档 等
Is ReadCheckbox是否已读
Is FlaggedCheckbox是否已标旗
Has AttachmentsCheckbox是否有附件
AI ActionSelectAI 建议动作(需要回复 / 仅供参考 / …)
AI PrioritySelect选项:Critical / Urgent / Important / Normal / Low
AI Review StatusSelect选项:Pending / Reviewed

Parent Item 是一个指向自身的 Relation:建字段时数据源选这个数据库本身。它让同一话题的回复挂到线程头下面。

建好后,打开数据库右上角 ⋯ → Connections(连接)→ 添加你刚建的 MailAgent Integration,否则它没有写入权限。数据库 URL 里那段 32 位十六进制就是 EMAIL_DATABASE_ID

https://www.notion.so/<workspace>/<这一段是 DATABASE_ID>?v=...

同样新建一个数据库,配齐:

字段名类型说明
TitleTitle事件标题
Event IDText事件唯一标识,用于去重
TimeDate(含起止)事件起止时间
URLURLTeams / 会议链接
LocationText地点
OrganizerText组织者

同样记得加上 Integration 连接,URL 里的 ID 就是 CALENDAR_DATABASE_ID

用任意编辑器打开 ~/Documents/MailAgent/.env,至少填好这五项:

Terminal window
NOTION_TOKEN=ntn_xxxxxxxx # 第 2a 步拿到的 Integration Token
EMAIL_DATABASE_ID=xxxxxxxx # 第 2b 步邮件数据库的 ID
CALENDAR_DATABASE_ID=xxxxxxxx # 第 2c 步日历数据库的 ID
USER_EMAIL=[email protected] # 你的邮箱地址
MAIL_ACCOUNT_NAME=Exchange # Mail.app 里这个账户的名字(AppleScript 后端用)

不确定 Mail.app 里账户叫什么名字?跑一句:

Terminal window
mailagent debug mail-structure

它会列出 Mail.app 里所有账户和邮箱,把你的账户名填进 MAIL_ACCOUNT_NAME

完整的可选配置(飞书、Redis、AI 网关、各功能开关)都在 .env.example 里有注释,按需取用。

MailAgent 用一行配置在两条邮箱接入路径间切换:

Terminal window
MAILAGENT_BACKEND=applescript # 代码默认;或改成 davmail
后端怎么连邮箱适合谁速度
applescript直接驱动 macOS 自带 Mail.app已经在 Mail.app 里配好邮箱、想最省事单封约 1 秒
davmail通过 DavMail 桥接企业 Exchange(IMAP / SMTP / CalDAV)企业 Exchange / Microsoft 365 用户,要更快更稳单封约 236 毫秒

先用 AppleScript 跑通最简单:只要 Mail.app 里已经登录了邮箱,无需额外组件。等熟悉之后再考虑切 DavMail。

DavMail 是一个独立的 Java 桥接程序,把 Exchange 翻译成标准邮件协议。除了上面那行,还要补:

Terminal window
MAILAGENT_BACKEND=davmail
DAVMAIL_USER=[email protected] # 通常同 USER_EMAIL
DAVMAIL_CIPHER_KEY=xxx # 与本机 davmail.properties 的 cipher key 一致
# DAVMAIL_IMAP_PORT=1143 # 与 davmail.properties 一致
# DAVMAIL_SMTP_PORT=1025
# DAVMAIL_ROOT=/绝对路径/MailAgent/davmail-poc # 打包 App 必填绝对路径

DavMail 进程一般用 PM2 以 davmail-poc 之名常驻。DAVMAIL_CIPHER_KEY 必须和本机 davmail.properties 里的 cipher key 完全一致,否则解不开凭据。

第 5 步:授予 macOS 权限,并启动服务

Section titled “第 5 步:授予 macOS 权限,并启动服务”

运行 MailAgent 的终端 App(Terminal / iTerm2)需要下面这些权限。打开 系统设置 → 隐私与安全性逐项授予:

权限位置用途
完全磁盘访问权限隐私与安全性 → 完全磁盘访问权限读取 Mail.app 的本地数据库(SQLite 雷达)
自动化 → Mail隐私与安全性 → 自动化用 AppleScript 操作 Mail.app(标已读 / 旗标 / 草稿)
自动化 → System Events隐私与安全性 → 自动化创建草稿时模拟按键粘贴内容
辅助功能隐私与安全性 → 辅助功能System Events 发送按键
屏幕录制隐私与安全性 → 屏幕录制仅在用 --screenshot 截图草稿时需要

如果系统没自动弹出权限请求,先跑一次 mailagent debug mail-structure 触发它,再到上面位置勾选。注意:PM2 启动的进程继承启动时所在终端的权限,换终端要重新授权。

开发 / 测试,前台跑:

Terminal window
python3 main.py

生产 / 长期跑,用 PM2 后台守护(注意必须指定 venv 里的 Python 解释器):

Terminal window
npm install -g pm2
pm2 start main.py --name mail-sync --interpreter ./venv/bin/python3
pm2 save && pm2 startup

常用 PM2 命令:

Terminal window
pm2 status # 看进程是否 online
pm2 logs mail-sync # 跟踪日志
pm2 restart mail-sync # 重启
Terminal window
mailagent admin health -o json | jq .data.healthy # 期望 true
tail -f logs/sync.log # 日志里不应有 ERROR 行

看到 SQLite 雷达每 5 秒跑一次、healthytrue,后端就装好了。

后端就绪后,下一步是把历史邮件灌进 Notion:首次同步。装完后端也想要图形界面的话,去 安装桌面 App


深入了解:README 快速开始 · CLI 命令全表 · DavMail 与架构内核