替换现有的Outlook日历约会

我正在做一个icalndar预约一代的工作; 这将允许代表查看活动的网站,并单击提供的链接以将约会添加到他们的日历。

我有一个工作程序集,它将根据一组已知的信息(开始日期,结束日期,标题等)生成一个ics格式的输出(作为物理文件或流)。

我为日历约会生成的输出示例如下:

BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN VERSION:2.0 METHOD:PUBLISH X-MS-OLK-FORCEINSPECTOROPEN:TRUE BEGIN:VEVENT CLASS:PUBLIC CREATED:20110210T124703Z DESCRIPTION:Anything Else\n\nHopefully some useful information would be written here\n DTEND:20110212T100000Z DTSTAMP:20110210T124600Z DTSTART:20110212T090000Z LAST-MODIFIED:20110210T124703Z LOCATION:Dummy Location PRIORITY:5 SEQUENCE:0 SUMMARY;LANGUAGE=en-us:Dummy Meeting TRANSP:OPAQUE UID:040000008200E00074C5B7101A82E00800000000B0D1061C57C8CB01000000000000000 010000000281117EDC1194242B64F0247C54DB401 X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\nDummy Meeting\n\n\n\n\n

&lt\;h1&gt\;Anyt hing Else&lt\;/h1&gt\;&lt\;p&gt\;Hopefully some useful information would b e written here&lt\;/p&gt\;
\n
\n

\n\n\n X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-IMPORTANCE:1 END:VEVENT END:VCALENDAR

我被问到的是; 是否可以更改约会,但下次有人请求提醒时,它会检测到他们的日历中已存在的约会并更新它而不是创建新条目?

所以我试图找到是否可以覆盖现有的日历约会。

我注意到有一个UID值,我试过保持这个值相同,但它似乎没有提供日历约会之间的链接。

日历约会上的“保存并关闭”操作是否可能生成新的UID,因此不再有链接?

我还能尝试什么?

可以更新约会,但不能更新约会。 这是重要的:

  • METHOD应该是REQUESTPUBLISH事件不会更新,它会一次又一次地添加。 REQUEST会议请求的行为不同,甚至在用户批准之前更新现有会议。 我注意到,如果事件已经是Publish类型,则无法更新(至少据我所知)。
  • 您必须使用完全相同的UID
  • DTSTAMP应该大于现有的日期戳(如果你动态创建它,这应该没问题)
  • 包括一个ORGANIZER – Outlook可能不允许人们在没有它的情况下接受会议(不是真正相关,但很重要)。

我在我的博客中对此进行了部分总结 – 通过ASP.NET邮件向Outlook发送会议请求 ,虽然它没有将批准发送给组织者和时区(这非常重要,所以我听说过)。

另请参阅: RFC 2446 – iTIP ,搜索1.3 ITIP角色和事务

可以更新PUBLISH ed条目。 您无需将METHOD更改为REQUEST (并在每个ATTENDEE上设置RSVP=FALSE )。

要让新副本替换现有副本,您只需要修改SEQUENCE值即可。 SEQUENCE属性主要用于区分时间相关变化的条目版本(例如DTSTART )。

但是, RFC 2445并不排除SEQUENCE因任何原因而被撞(例如修复拼写错误)。 这样做会使条目的任何工作流响应无效,因为它们将用于较低的SEQUENCE值,但在PUBLISH情况下,确实没有工作流; 一切都是这样的。

如果您没有对条目进行任何与时间相关的更改,则只需将DTSTAMP值更改为较新的值即可。 收件人将看到他们已经拥有UIDSEQUENCE值但是旧的DTSTAMP ,所以他们应该只更新他们已经拥有的。

任何在更新SEQUENCEDTSTAMP时未能更新PUBLISH ed条目的人都不理解标准或未能正确实施。