25

我正在生成 ICalendar (.ics) 文件。

使用 UID 和 SEQUENCE 字段,我可以更新 Google 日历和 Windows 日历中的现有事件,但不能更新MS Outlook 2007 中的现有事件 - 它只会创建第二个事件

如何让他们为 Outlook 工作?

谢谢

汤姆

4

5 回答 5

26

我继续做一些测试,现在已经设法让 Outlook 根据 .cs 文件更新和取消事件。

Outlook 实际上似乎响应RFC 2446中定义的规则

总之,您必须指定

METHOD:REQUESTORGANIZER:xxxxxxxx

除了UID:和SEQUENCE:

对于取消,您必须指定METHOD:CANCEL

请求/更新示例

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//SYFADIS//PORTAIL FORMATION//FR
METHOD:REQUEST
BEGIN:VEVENT
UID:TS_229377_MS_262145@syfadis.com
SEQUENCE:5
DTSTAMP:20081106T154911Z
ORGANIZER:catalog@syfadis.com
DTSTART:20081113T164907
DTEND:20081115T170000
SUMMARY:TestTraining
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR

取消示例;

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//SYFADIS//PORTAIL FORMATION//FR
METHOD:CANCEL
BEGIN:VEVENT
UID:TS_229377_MS_262145@syfadis.com
SEQUENCE:7
DTSTAMP:20081106T154916Z
ORGANIZER:catalog@syfadis.com
DTSTART:20081113T164907
SUMMARY:TestTraining
STATUS:CANCELLED
END:VEVENT
END:VCALENDAR
于 2008-09-05T14:52:00.670 回答
8

我抓住了提问者汤姆·卡特。他有一个工作示例,请求后取消。我错了,我的 METHOD 应该在我的 VEVENT 里面,而它应该在外面。所以这是一个有效的更新!

原来的:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WA//FRWEB//EN
METHOD:REQUEST
BEGIN:VEVENT
UID:FRICAL201
SEQUENCE:0
DTSTAMP:20081108T151809Z
ORGANIZER:donotreply@test.com
DTSTART:20081109T121200
SUMMARY:11/9/2008 12:12:00 PM TRIP FROM JFK AIRPORT (JFK)
LOCATION:JFK AIRPORT (JFK)
END:VEVENT
END:VCALENDAR

更新:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WA//FRWEB//EN
METHOD:REQUEST
BEGIN:VEVENT
UID:FRICAL201
SEQUENCE:1
DTSTAMP:20081108T161809Z
ORGANIZER:donotreply@test.com
DTSTART:20081109T121300
SUMMARY:11/9/2008 12:13:00 PM TRIP FROM JFK AIRPORT (JFK)
LOCATION:JFK AIRPORT (JFK)
END:VEVENT
END:VCALENDAR

我所做的只是添加请求方法(在正确的位置!)和一个组织者。

于 2008-11-11T05:06:37.497 回答
3

我正在使用 Outlook 2003(从阅读帖子来看,2007 的行为方式似乎相同)并且您需要清楚地区分 ics 文件的显式文件导入的行为和“双击 ics 文件时的隐式导入”的行为'。

在 Outlook 菜单文件/导入和导出... Outlook 将加载与文件中一样多的 VEVENT 条目,并且没有任何更改 UID:、SEQUENCE: 或 DTSTAMP: 值会改变这一点,即如果您更改任何数据并重新导入它你只是得到一组重复的条目。

如果你双击一个 ics 文件,它只处理第一个 VEVENT 条目。但是,它会识别 UID,如果 DTSTAMP: 较晚(序列可以相同但不能更低),系统会提示您,它会更新日历中的事件。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.membership-services.net
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20090126T210000
DTEND:20090126T220000
SUMMARY:Avondale - Thameside Away Game vs Croydon
LOCATION:Whitgift School
DESCRIPTION:http://maps.google.co.uk/maps?f=q&hl=en&geocode=&q=CR2+6YT 
UID:AWPC_8
SEQUENCE:0
DTSTAMP:20090123T112600
END:VEVENT
BEGIN:VEVENT
DTSTART:20090202T213000
DTEND:20090202T223000
SUMMARY:Avondale - Thameside Home Game vs Orcas
LOCATION:Putney
DESCRIPTION:http://maps.google.co.uk/maps?f=q&source=s_q&hl=en&ie=UTF8&ll=51.4635,-0.2285&spn=0.005,0.009613&t=h&z=17&iwloc=lyrftr:w2t.90,0x48760f04a04b1801:0x49ebf12503a5d5a9,51.463459,-0.228674 
UID:AWPC_10
SEQUENCE:0
DTSTAMP:20090123T112600
END:VEVENT
END:VCALENDAR
于 2009-01-23T11:49:23.537 回答
2

将此添加到您的 ICS 文件中

X-WR-RELCALID:MyCal123   

其中 MyCal123 是您日历的唯一标识符。

通过将此行添加到 ICS 文件,整个日历都会得到更新(在 Outlook 中出现提示后)。您甚至不需要更改 DTSTAMP 或 SEQUENCE 或 ORGANIZER 并且 METHOD:PUBLISH 可以用于更新。只需更新活动详情,双击 ICS,日历就会更新。请注意,如果您已经发布了日历并提供了一个 URL 供人们查看,这也可以正常工作。他们只需要在大约 2 分钟后点击刷新,他们也会得到更新。

感谢 David Bjørnhart 指出这一点:打开 ics 文件时,ICal 导入会创建新日历

于 2016-06-21T23:38:29.510 回答
0

我正在使用 Entourage,因此这可能与您看到的行为不完全匹配,但我希望它有所帮助。

使用您回复中的 iCalendar,Entourage 甚至不会导入数据。使用已知良好的文件,我将其导入,然后成功更新。比较这两个文件,唯一的结构差异如下:

  • 我的已知商品没有VERSION元素
  • 我的已知商品没有PRODID元素
  • 我的已知商品没有STATUS元素
  • 我的已知商品没有SEQUENCE元素

由于微软对开放标准的支持往往滞后,我建议在没有VERSION信息的情况下尝试。

于 2008-09-05T12:48:10.063 回答