开源 · Python · 2026 年 6 月
Outlook 每日邮件汇总
一个 Python 文件,读取当天的收件箱和已发送邮件,整理成每日 Excel 报告,想运行几次都不会重复计数。
公开仓库 · MIT 许可证
演示在你的浏览器里运行,用的是一个虚构星期三的虚构收件箱。它不连接 Outlook,你在这里的操作也不会离开本页。脚本本身需要 Windows、Microsoft Outlook 和 Python。
它做什么
脚本在 Windows 上通过 COM(借助 pywin32)连接 Microsoft Outlook,读取收件箱和已发送邮件里当天的邮件。它统计发出、收到和回复了多少封,并计算邮件的长度。它还给写信给你的人、你写信的对象和来信的域名排名,并统计一天里各个小时收发了多少邮件。
结果写进一个排好版的 Excel 工作簿 DailyEmailSummary.xlsx,用 openpyxl 生成。Daily Log 工作表每天一行,共 17 列。每天还有一张 Detail 工作表,列出排名、每小时的邮件量、附件数量和大小、大致的回复时间,以及主题里最常见的词。
想运行几次都可以
每封 Outlook 邮件都有一个 EntryID,重启之后也不会变。脚本把已经计过的 EntryID 和当天的原始统计一起存在 email_tracking.json 里。上午 10 点、下午 2 点、下午 5 点各运行一次,最后得到的仍然是覆盖全天的一行。
扫描
在收件箱和已发送邮件里找出当天的邮件。
跳过
EntryID 已经在跟踪文件里的邮件一律跳过。
合并
把新邮件加进当天的累计统计。
重算
用合并后的统计重新算出每一项指标。
保存
先写跟踪文件,再更新当天那一行和 Detail 工作表。
怎么做的
- 语言
- Python,单个文件
- 运行环境
- 装有 Outlook 的 Windows
- 输出
- Excel 工作簿和 JSON
- 许可证
- MIT
- Python
- pywin32
- openpyxl
- Excel
脚本用 Outlook 的 Restrict 筛选,按收到或发出的时间只取当天的邮件。筛选失败时,就退回到较慢的整夹扫描。只统计邮件本身,会议邀请等其他类型会被排除。
回复数取自 Outlook 在每封收到的邮件上记录的回复时间。回复时间把一封发出的邮件和同一会话里最早收到的那封配对,只计入一天以内的间隔。
双击一个批处理文件就能运行。第一次运行、创建工作簿时,脚本会打印出用 Windows 任务计划程序每天定时运行的步骤。
在虚构的一天里运行它
演示在你的浏览器里运行,用的是一个虚构星期三的虚构收件箱。它不连接 Outlook,你在这里的操作也不会离开本页。脚本本身需要 Windows、Microsoft Outlook 和 Python。
选一个时间,然后运行脚本。邮件会在一天里陆续到达,每次运行只统计新邮件。在同一时间再运行一次,就能看到它跳过所有已经计过的邮件。
合成收件箱
2026 年 3 月 4 日星期三(虚构)
在你的浏览器里运行
时间只能往前走。想选更早的时间,请重新开始这一天。 已运行 0 次
- 已计数
- 已到达,尚未计数
- 尚未到达
当天的邮件,按时间先后收件箱 0/20 · 已发送邮件 0/10
- 07:58收IT Service DeskServer maintenance window tonight · 尚未到达
- 08:12收Jordan LeeQuarterly report draft · 1 个附件 · 08:40 已回复 · 尚未到达
- 08:30收Weekly DigestWeekly digest: data and analytics · 尚未到达
- 08:40发收件人: Jordan LeeRE: Quarterly report draft · 尚未到达
- 08:47收Sam PatelData request for the dashboard · 09:20 已回复 · 尚未到达
- 09:05收Mei ChenTeam lunch on Friday · 09:15 已回复 · 尚未到达
- 09:15发收件人: Mei Chen; Jordan LeeRE: Team lunch on Friday · 尚未到达
- 09:20发收件人: Sam PatelRE: Data request for the dashboard · 1 个附件 · 尚未到达
- 09:41收Finance TeamInvoice 4471 for March · 2 个附件 · 尚未到达
- 10:20收Jordan LeeRE: Quarterly report draft · 11:05 已回复 · 尚未到达
- 10:55收Chris WalkerTraining calendar for April · 1 个附件 · 尚未到达
- 11:05发收件人: Jordan LeeRE: Quarterly report draft · 1 个附件 · 尚未到达
- 11:30收Sam PatelRE: Data request for the dashboard · 1 个附件 · 12:10 已回复 · 尚未到达
- 12:05收IT Service DeskPassword expiry reminder · 尚未到达
- 12:10发收件人: Sam PatelRE: Data request for the dashboard · 尚未到达
- 12:40收Priya NairSurvey results for review · 2 个附件 · 13:30 已回复 · 尚未到达
- 13:15收Mei ChenRE: Team lunch on Friday · 尚未到达
- 13:30发收件人: Priya Nair; Chris WalkerRE: Survey results for review · 尚未到达
- 13:50收Jordan LeeDashboard figures for the board pack · 15:10 已回复 · 尚未到达
- 14:25收Weekly DigestWebinar: data quality in practice · 尚未到达
- 14:40发收件人: Finance TeamExpense claim for the conference · 1 个附件 · 尚未到达
- 14:58收Finance TeamRE: Invoice 4471 for March · 尚未到达
- 15:10发收件人: Jordan LeeRE: Dashboard figures for the board pack · 1 个附件 · 尚未到达
- 15:30收Sam PatelData request: second extract · 1 个附件 · 16:05 已回复 · 尚未到达
- 15:52收Chris WalkerRE: Training calendar for April · 尚未到达
- 16:05发收件人: Sam PatelRE: Data request: second extract · 尚未到达
- 16:20收Priya NairRE: Survey results for review · 16:45 已回复 · 尚未到达
- 16:44收IT Service DeskMaintenance moved to Thursday · 尚未到达
- 16:45发收件人: Priya NairRE: Survey results for review · 尚未到达
- 16:58收Jordan LeeRE: Dashboard figures for the board pack · 尚未到达
控制台
还没有运行过。选一个时间,然后运行脚本。
工作簿 · DailyEmailSummary.xlsx
工作表名、列名和各节标题沿用脚本的英文输出。
第一次找到邮件的运行会创建 DailyEmailSummary.xlsx。
演示和脚本的不同
收件箱是虚构的。人名、团队、主题和时间都是编的,所有地址都以 .example 结尾。
每封虚构邮件的字数和大小都是固定值。脚本则是去掉 HTML 之后数正文的词数,大小从 Outlook 读取。
脚本的两条规则原样保留。回复状态在邮件第一次被计数时读取,所以那次运行之后才发出的回复不会再补算。回复时间只在同一次运行找到的邮件之间配对,所以对早先已计数邮件的回复不会得到回复时间。只在 17:00 运行一次,就能计入全部回复。
源码:GitHub 上的 rNLKJA/Outlook-Mail-Counting,MIT 许可证。演示是把脚本的计数规则移植到浏览器里,为本页编写。