常用软件之邮件、日历和通讯录管理
现状和问题 现状 问题 折中方案 晋级方案 方向一:使用 Gmail CardDAV 管理 + Google API 来同步到日历 方向二:使用 iCloud 通讯录 + AppleScript + Google API 同步日历 记忆中从 2014 年开始,我就开始使用邮件做一些重要的汇报和事项的确认,后来到百度后,发现邮件的使用越来越频繁,慢慢的又依赖上了日历,习惯性的使用日历做一些提醒,如:还房贷、重要性提醒等。 现状和问题 在现在(2025),也需要使用邮件和日历,但会有一些限制,导致我最近换电脑后折腾了很长一段时间,这里也记录下大概的内容。 现状 我有以下需求: 邮箱1 - 使用邮件和日历功能 邮箱2 - 使用邮件和日历功能 Gmail QQ邮箱 农历的日期提醒 问题 如果我使用系统(macOS+iOS)邮件+日历+通讯录,逐个登录这些账户,其实可以完美的配合。但比较尴尬的是邮箱1只允许使用某种协议连接,系统App是不支持的,这里我们举例只能使用 Microsoft Outlook 为例来写。 那么我们使用 Outlook 登录所有的账户,并在 iOS 内使用 CardDAV 连接 Gmaill 用于通讯录的管理。但发现 iOS 通讯录和 Outlook 联系人的协议(vCard)版本存在差异: 如果在 iOS 通讯录里编辑的农历日期提醒,在 Outlook 日历却没有提醒 如果在 Outlook 联系人里编辑的日期,确实是有日历提醒,但只能是阳历,这导致我预期的日期提醒不准确 应该是 Apple vCard 3.0+ 才支持了农历的日期,并且是 Apple 扩展的,独家的。 本来我想使用一个App(系统的或 Outlook 等)来管理所有的账户,而手机的通讯录只是基于 CardDAV 镜像数据。但发现系统 App 不能用后,用三方 App 太难了,没有系统级的支持,怎么做都不舒心。 当然我还在找一些 Sync 同步的一些工作,看能不能做到只维护一个 App 源。 折中方案 我相信工欲善其事,必先利其器。合适的工作流可以让我提高效率、信息更集中、管理更方便。目前我基于以下方向尝试了下,基本能满足需求吧。 账户 用途 说明 账户1 Outlook 邮件、日历 收发邮件、管理日常会议和入职时间提醒 账户2 Outlook 邮件、日历 收发邮件、管理日常会议和入职时间提醒 Gmail Outlook 邮件、日历 收发邮件,管理个人日常的重要提醒,如:还房贷、买彩票能中奖的幸运日等 QQ邮箱 Outlook 邮件 收发邮件 iCloud 通讯录 管理好联系人,并在联系人里完善特殊日期,使用系统日历进行提醒 整体的效果就是: 我每天的事项只要一看 Outlook 日历即可快速了解当天的会议情况、重点事项 依赖 iOS 日历的 T-1 提醒通讯录里的生日和特殊纪念日 晋级方案 上面整个方案下来基本已经可用了,并且维护成本较低。但我在想,能不能只在源里写入,而在一个地方查看呢? 假如:会议、邮件全在 Outlook 里写,联系人全在 iOS/macOS 通讯录里写,做个自动同步呢? 方向一:使用 Gmail CardDAV 管理 + Google API 来同步到日历 由于手机和电脑的通讯录都是支持基于统一协议 CardDAV 来远程管理,那么我是不是可以写个定时脚本来做同步的事?流程如: 每天00点使用 API 调用 Google People API 获取所有联系人信息 查询所有联系人的日期相关的字段 根据日期类型(如农历)自动转成当年的阳历 根据阳历日期数据,调用 Google Calendar API 来判断当天是否有指定的事件 如果有 title=【自动】$title 这样的事件,则忽略 如果没有事件,则调用 API 来创建 思路一通,真的轻松。于是开干,然后。。emm 发现了问题:iOS/macOS 里的自定义字段(如:农历生日、xx纪念日)都属于扩展字段,而 Google People API 只支持枚举的标准字段,导致获取不了所有字段。 怎么办??? 难不倒我。。既然 Apple 不守规矩,那么我也可以。。我可以定义一套 xiaowu schema ,放到备注字段中。因为这个字段是 vCard 标准字段。如: 备注: xx纪念日:农历2025年1月1日 xx中大奖日:2025年5月25日 基于这个数据,我可以自己解析出指对应的日期,并根据日历相关数据进行处理。 优点:面向标准化,不惧未来系统级别的迁移(iOS->Android) 缺点: 没有了 iOS/macOS 通讯录内的系统关联能力(点击日期自动跳转),并且 xiaowu schema 编辑体验不太帅 依赖翻Q 方向二:使用 iCloud 通讯录 + AppleScript + Google API 同步日历 由于 iCloud 本身是不提供 RESTful API ,但可以在 macOS 上使用 AppleScript 来读取,那么大概的流程就是: iOS&macOS 开启 iCloud 通讯录同步 macOS 中使用 AppleScript 读取通讯录所有数据,输出为 vCard 3.0 格式 Node.js 读取 vCard 数据,并解析对应的日期内容 调用 Google API 同步日历 但发现苹果是真的6,vCard 数据不但自定义格式,还对内容进行了混淆。 X-ALTBDAY;CALSCALE=chinese:007700310101 item1.X-ABLabel:身份证 item2.IMPP;X-SERVICE-TYPE=户口本姓名:x-apple:************(手动替换) item2.X-ABLabel:户口本姓名 item3.X-ABLabel:_$!<Child>!$_ 其实 X-ALTBDAY;CALSCALE=chinese:007700310101 这行是个坑,表示了农历的生日,但日期的混淆算法我是没找到,解不开了。我试了一些数据,发现挺难的。。 1679己未年正月初一 -> 007200560101 1900庚子年正月初一 -> 007600370101 1954甲午年二月十七 -> 007700310217 1998戊寅年正月初一 -> 007800150101 2000庚辰年正月初一 -> 007800170101 2008戊子年正月初一 -> 007800250101 优点:基于 iCloud 强大的系统集成和同步能力,非常好 缺点:需要自行解析 vCard ,并分析农历数据的编码规则 综上,还是使用折中方案吧。。
以上内容来自博客订阅源,版权归原作者。关注作者后可以在 关注列表 第一时间查看作者文章。

登录后,加入这场讨论。
登录参与