Zimbra 使用者訂閱了外部的 iCAL 行事曆(例如其他系統分享出來的 .ics 網址),常常會反映:分享端已經刪掉的行程,訂閱端隔了大半天還看得到。
這是因為外部行事曆訂閱是定時去抓的,而 Zimbra 預設的間隔是 12 小時。這篇說明怎麼查詢與調整這個輪詢間隔。
適用版本:Zimbra 10.x(NETWORK、FOSS 皆適用)

輪詢間隔的屬性
外部 iCAL 訂閱在 Zimbra 裡屬於 cal 類型的 data source,控制輪詢間隔的屬性是:
zimbraDataSourceCalendarPollingInterval
依 Zimbra 原始碼中的屬性定義,這個屬性可以設在帳號或 COS,default COS 的預設值是 12h;明確設成 0 則不會自動輪詢。
通用屬性已經棄用
網路上很多文章寫的是 zimbraDataSourcePollingInterval,但這個通用屬性自 6.0.0 起在帳號與 COS 層級已經棄用,設了也不會生效,原本的值會被遷移到各協定專屬的屬性。我在 Zimbra 10.1.16 實測,這個屬性設在 COS 或帳號上是寫不進去的。
生效優先順序
Zimbra 決定一個 data source 的輪詢間隔,順序由高到低是:
- data source 自身設定的
zimbraDataSourcePollingInterval - 帳號或 COS 上的協定專屬屬性
zimbraDataSourceCalendarPollingInterval - 內建預設值
另外還有一個 zimbraDataSourceMinPollingInterval(預設 1m),是允許的最短間隔。
查詢目前設定
查帳號的 data source 與各自的輪詢值:
zmprov gds user01@example.com
輸出中 zimbraDataSourceType: cal 的就是 iCAL 訂閱。如果該 data source 沒有 zimbraDataSourcePollingInterval 這一行,代表它沒有設定個別值,會使用帳號或 COS 的設定。
查帳號層級的設定:
zmprov ga user01@example.com zimbraDataSourceCalendarPollingInterval
查帳號所屬 COS 的設定:
zmprov gc $(zmprov ga user01@example.com zimbraCOSId | awk '/zimbraCOSId:/ {print $2}') zimbraDataSourceCalendarPollingInterval
或直接查 default COS:
zmprov gc default zimbraDataSourceCalendarPollingInterval
設定輪詢間隔
值的格式為 1h、30m、15m 這類寫法(d 天、h 小時、m 分鐘、s 秒),沒有加單位時預設為秒。
COS 層級(建議)
影響該 COS 底下的所有帳號:
zmprov mc default zimbraDataSourceCalendarPollingInterval 1h
zmprov gc default zimbraDataSourceCalendarPollingInterval
帳號層級
只影響單一帳號:
zmprov ma user01@example.com zimbraDataSourceCalendarPollingInterval 1h
個別 data source 層級
最精準,優先順序也最高。先用 zmprov gds 取得 data source 名稱,再設定:
zmprov mds user01@example.com 'CAL-123456' zimbraDataSourcePollingInterval 1h
重新啟動 mailboxd
設定完成後,重新啟動 mailboxd 讓設定生效:
zmmailboxdctl restart
清除設定
要回到預設值,把屬性設成空字串即可:
# 清除 COS 層級
zmprov mc default zimbraDataSourceCalendarPollingInterval ''
# 清除帳號層級
zmprov ma user01@example.com zimbraDataSourceCalendarPollingInterval ''
如果以前誤設過已棄用的通用屬性,也建議一併清掉,避免日後混淆:
zmprov mc default zimbraDataSourcePollingInterval ''
注意事項
- 間隔不要設太短:建議不要低於 5 到 10 分鐘。每次輪詢都會到分享端抓整份
.ics,間隔太短會增加兩端的負載,行事曆內容很多時尤其明顯 - COS 層級影響範圍大:會連帶影響同一個 COS 所有帳號的 iCAL 訂閱,只想調整單一帳號或單一訂閱,改用帳號或 data source 層級
- data source 的設定優先:任何 data source 本身有設定
zimbraDataSourcePollingInterval,會蓋過帳號與 COS 的設定 - 想立即更新內容:在訂閱端把該外部行事曆移除後重新加入,就會強制重新抓取一次
1h對行事曆訂閱來說通常已經足夠
結論
外部 iCAL 訂閱更新很慢,原因是 Zimbra 預設 12 小時才抓一次。調整時要注意用對屬性:zimbraDataSourceCalendarPollingInterval,不是網路文章常見、已經棄用的 zimbraDataSourcePollingInterval。一般建議在 COS 層級設成 1h,兼顧更新速度與系統負載。
參考資料
- Zimbra 原始碼:zimbra-attrs.xml(LDAP 屬性定義)
https://github.com/Zimbra/zm-mailbox/blob/develop/store/conf/attrs/zimbra-attrs.xml - Zimbra Wiki:zmprov
https://wiki.zimbra.com/wiki/Zmprov



