05月24, 2025

常用软件之邮件、日历和通讯录管理

记忆中从 2014 年开始,我就开始使用邮件做一些重要的汇报和事项的确认,后来到百度后,发现邮件的使用越来越频繁,慢慢的又依赖上了日历,习惯性的使用日历做一些提醒,如:还房贷、重要性提醒等。

现状和问题

在现在(2025),也需要使用邮件和日历,但会有一些限制,导致我最近换电脑后折腾了很长一段时间,这里也记录下大概的内容。

现状

我有以下需求:

  1. 邮箱1 - 使用邮件和日历功能
  2. 邮箱2 - 使用邮件和日历功能
  3. Gmail
  4. QQ邮箱
  5. 农历的日期提醒

问题

如果我使用系统(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 通讯录 管理好联系人,并在联系人里完善特殊日期,使用系统日历进行提醒

整体的效果就是:

  1. 我每天的事项只要一看 Outlook 日历即可快速了解当天的会议情况、重点事项
  2. 依赖 iOS 日历的 T-1 提醒通讯录里的生日和特殊纪念日

晋级方案

上面整个方案下来基本已经可用了,并且维护成本较低。但我在想,能不能只在源里写入,而在一个地方查看呢?

假如:会议、邮件全在 Outlook 里写,联系人全在 iOS/macOS 通讯录里写,做个自动同步呢?

方向一:使用 Gmail CardDAV 管理 + Google API 来同步到日历

由于手机和电脑的通讯录都是支持基于统一协议 CardDAV 来远程管理,那么我是不是可以写个定时脚本来做同步的事?流程如:

  1. 每天00点使用 API 调用 Google People API 获取所有联系人信息
  2. 查询所有联系人的日期相关的字段
  3. 根据日期类型(如农历)自动转成当年的阳历
  4. 根据阳历日期数据,调用 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)
  • 缺点:
    1. 没有了 iOS/macOS 通讯录内的系统关联能力(点击日期自动跳转),并且 xiaowu schema 编辑体验不太帅
    2. 依赖翻Q

方向二:使用 iCloud 通讯录 + AppleScript + Google API 同步日历

由于 iCloud 本身是不提供 RESTful API ,但可以在 macOS 上使用 AppleScript 来读取,那么大概的流程就是:

  1. iOS&macOS 开启 iCloud 通讯录同步
  2. macOS 中使用 AppleScript 读取通讯录所有数据,输出为 vCard 3.0 格式
  3. Node.js 读取 vCard 数据,并解析对应的日期内容
  4. 调用 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 ,并分析农历数据的编码规则

综上,还是使用折中方案吧。。

本文链接:https://xuexb.com/post/software-office.html

-- EOF --

发表于 2025年05月24日 15:48:34 ,最后修改于 2025年05月24日 18:19:57

提醒: 本文最后更新于 230 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。

AltStyle によって変換されたページ (->オリジナル) /