Outlook未在ics文件中导入多个事件

时间:2014-07-21 11:03:19

标签: php outlook icalendar

生成的iCal文件存在问题。

它似乎正在正确生成代码,而.ics文件加载了多个事件,但是当我在outlook中打开文件时,它只将第一个事件导入我的日历,其余的不会被添加。

这是生成的iCal文件

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-WR-CALNAME: Calendar
CALSCALE:GREGORIAN
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:DAYLIGHT
TZOFFSETFROM:+0000
TZOFFSETTO:+0100
DTSTART:19810329T010000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
TZNAME:BST
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
DTSTART:19961027T020000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
TZNAME:GMT
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART:20140906T090000
DTEND:20140906T170000
UID:224
DTSTAMP:20140721T102908
LOCATION:
DESCRIPTION:Explore the College with current students\, chat with the Director of Studies in your subject\, meet our admissions tutors\,
URL;VALUE=URI:http://www.domain.com/events-224
SUMMARY:Open Day (undergraduate)
END:VEVENT
BEGIN:VEVENT
DTSTART:20141208T000000
DTEND:20141212T000000
UID:416
DTSTAMP:20140721T102908
LOCATION:
DESCRIPTION:Admissions Interviews
URL;VALUE=URI:http://www.domain.com/events-416
SUMMARY:Admissions Interviews
END:VEVENT
BEGIN:VEVENT
DTSTART:20141215T000000
DTEND:20141218T000000
UID:417
DTSTAMP:20140721T102908
LOCATION:
DESCRIPTION:Admissions Interviews
URL;VALUE=URI:http://www.domain.com/events-417
SUMMARY:Admissions Interviews
END:VEVENT
BEGIN:VEVENT
DTSTART:20150112T000000
DTEND:20150116T000000
UID:419
DTSTAMP:20140721T102908
LOCATION:
DESCRIPTION:Admissions Interviews
URL;VALUE=URI:http://www.domain.com/events-419
SUMMARY:Admissions Interviews
END:VEVENT
BEGIN:VEVENT
DTSTART:20150314T000000
DTEND:20150314T000000
UID:67
DTSTAMP:20140721T102908
LOCATION:
DESCRIPTION:Explore the College with current students\, chat with the Director of Studies in your subject and meet our admissions tutors. 

URL;VALUE=URI:http://www.domain.com/events-67
SUMMARY:Admissions Open Day (Arts)
END:VEVENT
BEGIN:VEVENT
DTSTART:20150425T000000
DTEND:20150425T000000
UID:73
DTSTAMP:20140721T102908
LOCATION:
DESCRIPTION:Explore the College with current students\, chat with the Director of Studies in your subject and meet our admissions tutors.
URL;VALUE=URI:http://www.domain.com/events-73
SUMMARY:Admissions Open Day (Sciences)
END:VEVENT
END:VCALENDAR

以下是设置iCal文件页眉和页脚的变量

$iCalHeader = "" .
        "BEGIN:VCALENDAR\n" .
        "PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN\n" .
        "VERSION:2.0\n" .
        "METHOD:PUBLISH\n";

    $iCalHeaderBottom = "CALSCALE:GREGORIAN\n" .
        "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n" .
        "BEGIN:VTIMEZONE\n" .
        "TZID:Europe/London\n" .
        "BEGIN:DAYLIGHT\n" .
        "TZOFFSETFROM:+0000\n" .
        "TZOFFSETTO:+0100\n" .
        "DTSTART:19810329T010000\n" .
        "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\n" .
        "TZNAME:BST\n" .
        "END:DAYLIGHT\n" .
        "BEGIN:STANDARD\n" .
        "TZOFFSETFROM:+0100\n" .
        "TZOFFSETTO:+0000\n" .
        "DTSTART:19961027T020000\n" .
        "RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\n" .
        "TZNAME:GMT\n" .
        "END:STANDARD\n" .
        "END:VTIMEZONE\n";

    $iCalFooter = "END:VCALENDAR";

最后生成事件的代码

$iCal .= "BEGIN:VEVENT\n".
                "DTSTART:" . date('Ymd\THis', strtotime($row2["EVENT_StartDateTime"])) ."\n".
                "DTEND:" . date('Ymd\THis', strtotime($row2["EVENT_EndDateTime"])) . "\n".
                "UID:" . $row2["EVENT_ID"] . "\n".
                "DTSTAMP:" . date('Ymd\THis', time()) . "\n".
                "LOCATION:$address\n".
                "DESCRIPTION:" . $this->escapeString($description) . "\n".
                "URL;VALUE=URI:http://www.domain.com/events-" . $row2["EVENT_ID"] . "\n".
                "SUMMARY:" . $this->escapeString($title) . "\n".
                "END:VEVENT\n";

它适用于第一个事件所以我不认为这是为每个事件生成的代码的问题,我做了一些研究,但我似乎无法找到解决方案,是否有一个额外的声明,需要在每个事件之间使用吗?

或许outlook可能不支持单个iCal中的多个事件,因此只导入第一个?

非常感谢任何帮助或建议。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您的Icalendar传递了this validator,但尝试为每个事件添加一个ORGANIZER。我在阅读the spec时必须填写此字段。

这可能是一个期望的问题。当您说“导入”时,您如何发送/打开日历以及您希望发生什么?一般来说,outlook和其他客户对Icalendars有两种处理方法。如果Icalendar包含一个事件,具有METHOD = REQUEST,并且是lucky,它将显示为邀请,并带有一个按钮,可直接将其添加到用户的日历中。 (如果非常幸运,并且收件人的电子邮件位于与会者字段中,则事件可能会在预览或在邮件视图中打开之前显示在日历中。否则将在预览后显示。)< / p>

如果它有多个事件或任何其他一些小问题,它将显示为附件(如果通过邮件收到),用户将不得不四处打开它。通过邮件接收或从URL打开的多事件日历将被视为单独的日历。没有提议将他们的事件添加到用户的日历中,但是如果用户知道他们正在做什么,则用户可以选择并拖动事件。

答案 1 :(得分:0)

可能是很晚才回答这个问题的方法,但可能会对其他人有所帮助。

https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcical/d2a0a079-02a6-4643-9e78-0ac35998e1fb

X-MS-OLK-FORCEINSPECTOROPEN

如果此属性设置为TRUE,则应将iCalendar流作为单个Calendar对象导入,而不考虑iCalendar中存在的VEVENT组件数量。请注意,通过使用在部分中指定的RECURRENCE-ID属性,包含多个VEVENT组件的iCalendar文件可能代表一个约会。