邮件ICS文件详解
概述
有時收到一些會議邀請郵件時會收到一個以 .ics 為后綴的附件,這個文件執行后能夠在本地的日歷中添加一個事件提醒。這篇文章介紹了 ics 文件的概念,介紹了 ics 文件內容以及編寫 ics 文件。
ICS文件是什么
ICS (Internet Calendaring and Scheduling) 文件是以iCalendar 標準編寫的文本文件,可用于共享日歷事件信息(標題、摘要、開始時間、結束時間等),一般通過電子郵件給他人以共享會議請求或待辦事項,收件人可以直接導入到自己的日歷軟件。iCalendar 是日歷數據交換標準,通常以.ics 或 .ifb 為后綴的文本文件保存。
協議
郵件頭格式
通常 iCalendar 使用UTF-8字符編碼,所以可以使用中文。也可以在MIME中的charset參數來指定其他字符編碼。iCalendar的MIME 類型是 text/calendar 。Header示例如下:
Content-Type: text/calendar; method="REQUEST"; name="Appointment.ics"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Description: attachment; filename="Appointment.ics"
Content-class: urn:content-classes:calendarmessage
Filename: Appointment.ics
Path: Appointment.ics
iCalendar格式
iCalendar每一行必須以換行(CR+LF) 結尾,每一行不得超過 75 字節,如果超過限制,必須換行,后面一行使用空格符或制表符作開始,標識本行是上一行內容的繼續,內容數據中的換行符可以反斜杠符 \ 后跟數字(UTF-8中為 5C6E 或 5C4E)來表示。
所有屬性名、屬性參數、枚舉的屬性值和屬性參數值不區分大小寫,其他屬性值區分大小寫(除非單獨約定)。屬性名和屬性值以 : 分隔,中間無空格,如 DTSTAMP:20210108T220000Z 。
所有時間類屬性的格式都遵循 ISO 8601 標準。時間格式為:yyyyMMdd'T'HHmmssZ ,如 20210108T220000Z ,日期和時間之間使用 T 分隔,最后的 Z 表示使用 UTC 時間。
持續時間值以 P 開頭,每個持續時間段由一個整數表示,后面跟一個周期標識符,如果包含時間元素,需要使用 T 分隔,如 P1D 、P2W 、P1Y2D 、P1DT12H 、PT3600S 。
| 周期標識符 | 描述 |
|---|---|
| Y | 年 |
| M | 月 |
| D | 日 |
| W | 周(將被轉成D,因此不能與D同時使用) |
| H | 時 |
| M | 分 |
| S | 秒 |
可以使用 # 或 // 添加注釋,注意不能在其他元素行尾使用,只能注釋整行。
內容組成
iCalendar 中頂級元素是日歷和計劃核心對象,一組日歷和計劃信息。通常指包含單一的 iCalendar 對象,但可以在一個組中聲明多個 iCalendar 對象。
第一行必須是 BEGIN:VCALENDER ,最后一行必須是 END:VCALENDER ,這兩行之間的數據稱為 icalbody。
icalbody 由一系列日歷屬性和一個或以上數量的日歷組件組成。日歷屬性作用于整個日歷,日歷組件則是若干日歷屬性構成。日歷組件可以指定一個事件(VEVENT)、一個待辦事項列表(VTODO)、一個旅行事項(VJOURNAL)、時區信息(VZONE)、繁忙/空閑時間信息(VFREEBUSY),或者一個警報(VALARM)。其中警報可以包含于其他組件中。
日歷屬性
日歷屬性中必須包含 PRODID 和 VERSION 兩個屬性。
- VERSION 遵循的 iCalendar 版本號,目前是
2.0,老版本的值為1.0 - PRODID 創建該 iCalendar 的軟件的標識信息,如
-//Google Inc//Google Calendar 70.9054//EN - CALSCALE 歷法,
GREGORIAN- 公歷 - METHOD 方法,
PUBLISH- 公開,REQUEST- 請求
時區VTIMEZONE
VTIMEZONE 用于存儲時區在任何給定時間點(即夏令時和標準時間)的 UTC 偏移量的特定規則。由于UTC時間存在邊界問題,對于周期性的規則不適用。
VTIMEZONE屬性:
- DTSTART:表示轉換時區的開始時間,格式為YYYYMMDDTHHMMSS。
- TZOFFSETFROM:表示轉換前的時區偏移量,格式為±HHMM。
- TZOFFSETTO:表示轉換后的時區偏移量,格式為±HHMM。
- TZNAME:表示時區的名稱。
事件EVENT
事件(VEVENT)是日歷上一系列計劃好的時間點。如果用戶接受一個日歷事件,則認為用戶在該時間段是忙碌的。也可以應用在沒有具體時間的日歷事件上,如周年紀念、每日提醒。
VEVENT 的屬性:
- DTSTART 開始時間,如果是循環事件,則為第一個事件的開始時間
- DTEND 結束時間
- SUMMARY 概要,標題
- DESCRIPTION 詳情描述,可用 html 語法
- DTSTAMP 時間戳,表示事件的創建時間或更新時間
- UID 唯一標識,取消與更新事件時用來找到唯一的日歷事件
- METHOD 操作,如果要取消事件,該值為
CANCEL - STATUS 事件狀態,
TENTATIVE- 試探、CONFIRMED- 確認、CANCELLED取消 - SEQUENCE 序列號,更新事件時需要指定新的序列號,如第一次更新指定
SEQUENCE:1 - CLASS 保密類型,
PRIVATE- 私有 - CREATED 創建時間
- LAST-MODIFIED 最后修改時間
- LOCATION 地址
- TRANSP 對于忙閑狀態查詢是否透明,
OPAQUE- 不透明、TRANSPARENT- 透明 - VALARM 警報對象
待辦事項 VTODO
不是所有軟件都支持待辦事項的,如 Outlook 就不能導出 VTODO 記錄,導入時 VTODO 也會忽略。
待辦事項中的屬性:
- ACTION 動作,要執行的動作
- TRIGGER 觸發時間,數據格式與 DURATION 一致,如果是提前觸發,需要在值前加負號
-,如提前一天觸發-PT1440M - REPEAT 重復次數
- DURATION 持續時間
旅行事項 VJOURNAL
旅行事項(VJOURNAL)將一段描述文字關聯到一個詳細的日歷日期上,可用于記錄活動或成長日志,或描述待辦事項的進展。旅行事項不會影響日歷上的時間狀態,不影響空閑和繁忙狀態。實際上只有少量程序支持 VJOURNAL 。
擴展屬性
iCalendar 支持軟件私有的擴展屬性,這些屬性只在特定軟件中生效,在屬性名前加 X- 前綴表示擴展屬性。如:
- X-MICROSOFT-CDO-BUSYSTATUS 忙碌狀態
- X-MICROSOFT-CDO-IMPORTANCE 重要程度
- X-WR-CALNAM 通用擴展屬性,表示本日歷名稱
- X-WR-TIMEZONE 通用擴展屬性,表示時區,值如:
Asia/Shanghai
示例格式
BEGIN:VCALENDAR #日歷開始
PRODID:-//Google Inc//Google Calendar 70.9054//EN #軟件信息
VERSION:2.0 #遵循的 iCalendar 版本號
CALSCALE:GREGORIAN #歷法:公歷
METHOD:PUBLISH #方法:公開 也可以是 REQUEST 等用于日歷間的信息溝通方法
X-WR-CALNAME:yulanggong@gmail.com #這是一個通用擴展屬性 表示本日歷的名稱
X-WR-TIMEZONE:Asia/Shanghai #通用擴展屬性,表示時區
BEGIN:VEVENT #事件開始
DTSTART:20090305T112200Z #開始的日期時間
DTEND:20090305T122200Z #結束的日期時間
DTSTAMP:20140613T033914Z #有Method 屬性時表示 實例創建時間,沒有時表示最后修訂的日期時間
UID:9r5p7q78uohmk1bbt0iedof9s4@google.com #UID
CLASS:PRIVATE #保密類型
CREATED:20090305T092105Z #創建的日期時間
DESCRIPTION:test #描述
LAST-MODIFIED:20090305T092130Z #最后修改日期時間
LOCATION:test #地址
SEQUENCE:1 #排列序號
STATUS:CONFIRMED #狀態 TENTATIVE 試探 CONFIRMED 確認 CANCELLED 取消
SUMMARY: test #簡介 一般是標題
TRANSP:OPAQUE #對于忙閑查詢是否透明 OPAQUE 不透明 TRANSPARENT 透明
END:VEVENT #事件結束
END:VCALENDAR #日歷結束
軟件支持
- Microsoft Outlook
- Mozilla Sunbird
- Microsoft Works
- 谷歌日歷
- 蘋果 iCal 日歷
Python生成與解析
生成ICS文件
from icalendar import Calendar, Event
from datetime import datetime
from pytz import UTC # timezonecal = Calendar()
cal.add('prodid', '-//My calendar product//mxm.dk//')
cal.add('version', '2.0')event = Event()
event.add('summary', 'Python meeting about calendaring')
event.add('dtstart', datetime(2005,4,4,8,0,0,tzinfo=UTC))
event.add('dtend', datetime(2005,4,4,10,0,0,tzinfo=UTC))
event.add('dtstamp', datetime(2005,4,4,0,10,0,tzinfo=UTC))
event['uid'] = '20050115T101010/27346262376@mxm.dk'
event.add('priority', 5)cal.add_component(event)f = open('example.ics', 'wb')
f.write(cal.to_ical())
f.close()
解析ICS文件
with open('example.ics','rb') as g:gcal = Calendar.from_ical(g.read())for component in gcal.walk():if component.name == "VEVENT":print(component.get('summary'))print(component.get('dtstart'))print(component.get('dtend'))print(component.get('dtstamp'))
參考
日歷標準格式研究 · GitHub
使用Python解析文件(ICS / iCalendar)
總結
- 上一篇: 02-PDI(Kettle)导入与导出
- 下一篇: macbook快捷键_MacBook 键