Outlook-web-app 没有从我生成的 icalendar 导入事件
Outlook-web-app is not importing events from my generated icalendar
对于我的应用程序,我使用 laravel 5.3
和一个名为 markuspoerschke/iCal
的包,您可以找到 here.
当学生想要订阅他或她的日历时,我们会生成一个 URL 可以将其填写到 Google 日历和 Outlook 中。除了最后提到的 outlook
它没有导入任何事件。
我们生成的 ICS 的外观示例。这包含 1 个事件,描述为 'test'。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.onderwijsonline.nl
X-PUBLISHED-TTL:PT15M
BEGIN:VEVENT
UID:58e5f21fc2551
DTSTART;TZID=Europe/Amsterdam:20170406T090000
SEQUENCE:0
TRANSP:OPAQUE DTEND;TZID=Europe/Amsterdam:20170406T140000 URL:http://oo.dev/calendar/event/420
SUMMARY:Test
CLASS:PUBLIC
DTSTAMP:20170406T094535Z
END:VEVENT
END:VCALENDAR
调用包生成这个的脚本:
public function getIcal($token = null)
{
$user = $this->userRepository->getByToken($token);
$vCalendar = new \Eluceo\iCal\Component\Calendar('www.onderwijsonline.nl');
$vCalendar->setPublishedTTL('PT15M');
if (!is_null($user)) {
/**
* Calendar events
*/
$events = $this->calendarRepository->getEventsForUser($user->id, Carbon::now()->subWeeks(2), Carbon::now()->addWeeks(6));
foreach ($events as $event) {
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent
->setUseTimezone(true)
->setUseUtc(false)
->setDtStart(Carbon::parse($event['start']))
->setDtEnd(Carbon::parse($event['end']))
->setNoTime(($event['allDay'] == 1 ? true : false))
->setUrl($event['href'])
->setDescription($event['description'])
->setSummary($event['title']);
$vCalendar->addComponent($vEvent);
}
/**
* Project events
*/
$events = $this->calendarRepository->getEventsForProjects($user->id, null, null);
foreach ($events as $event) {
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent
->setUseTimezone(true)
->setUseUtc(false)
->setDtStart(Carbon::parse($event['start']))
->setDtEnd(Carbon::parse($event['end']))
->setNoTime(($event['allDay'] == 1 ? true : false))
->setUrl($event['href'])
->setSummary($event['title']);
$vCalendar->addComponent($vEvent);
}
/**
* Timetable events
*/
$events = $this->calendarRepository->getEventsForTimetables($user->id, Carbon::now()->subWeeks(2), Carbon::now()->addWeeks(6));
foreach ($events as $event) {
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent
->setUseTimezone(true)
->setUseUtc(false)
->setDtStart(Carbon::parse($event['start']))
->setDtEnd(Carbon::parse($event['end']))
->setNoTime(($event['allDay'] == 1 ? true : false))
->setSummary($event['title']);
$vCalendar->addComponent($vEvent);
}
}
header('Content-Type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=onderwijsonline.ics');
return $vCalendar->render();
}
正如我上面提到的,这种设置适用于 Google 日历,但不适用于 outlook。
有谁知道为什么以及如何解决这个问题?
您正在使用 TZID=Europe/Amsterdam 但您的 ics 文件不包含与此 TZID 对应的 VTIMEZONE 定义。所以在你的 BEGIN:VEVENT 之前,你应该有一个 BEGIN:VTIMEZONE...END:VTIMEZONE 组件。
至于为什么它仍然适用于 Google 但不适用于 Outlook:许多产品确实使用 Olson TZID,因此他们可以忽略缺少 VTIMEZONE 定义的事实,并假设您的 TZID =Europe/Amsterdam对应他们的映射。
另一方面,Microsoft 有自己的一组 TZID 标识符(例如 "Central Europe Standard Time"),因此无法将您的 Europe/Amsterdam 映射到已知定义。
最后,在堆栈溢出时,至少您的 TRANSP、DTEND 和 URL 属性 确实出现在同一行上。我假设这只是提交问题时的格式问题 (???)。
对于我的应用程序,我使用 laravel 5.3
和一个名为 markuspoerschke/iCal
的包,您可以找到 here.
当学生想要订阅他或她的日历时,我们会生成一个 URL 可以将其填写到 Google 日历和 Outlook 中。除了最后提到的 outlook
它没有导入任何事件。
我们生成的 ICS 的外观示例。这包含 1 个事件,描述为 'test'。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.onderwijsonline.nl
X-PUBLISHED-TTL:PT15M
BEGIN:VEVENT
UID:58e5f21fc2551
DTSTART;TZID=Europe/Amsterdam:20170406T090000
SEQUENCE:0
TRANSP:OPAQUE DTEND;TZID=Europe/Amsterdam:20170406T140000 URL:http://oo.dev/calendar/event/420
SUMMARY:Test
CLASS:PUBLIC
DTSTAMP:20170406T094535Z
END:VEVENT
END:VCALENDAR
调用包生成这个的脚本:
public function getIcal($token = null)
{
$user = $this->userRepository->getByToken($token);
$vCalendar = new \Eluceo\iCal\Component\Calendar('www.onderwijsonline.nl');
$vCalendar->setPublishedTTL('PT15M');
if (!is_null($user)) {
/**
* Calendar events
*/
$events = $this->calendarRepository->getEventsForUser($user->id, Carbon::now()->subWeeks(2), Carbon::now()->addWeeks(6));
foreach ($events as $event) {
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent
->setUseTimezone(true)
->setUseUtc(false)
->setDtStart(Carbon::parse($event['start']))
->setDtEnd(Carbon::parse($event['end']))
->setNoTime(($event['allDay'] == 1 ? true : false))
->setUrl($event['href'])
->setDescription($event['description'])
->setSummary($event['title']);
$vCalendar->addComponent($vEvent);
}
/**
* Project events
*/
$events = $this->calendarRepository->getEventsForProjects($user->id, null, null);
foreach ($events as $event) {
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent
->setUseTimezone(true)
->setUseUtc(false)
->setDtStart(Carbon::parse($event['start']))
->setDtEnd(Carbon::parse($event['end']))
->setNoTime(($event['allDay'] == 1 ? true : false))
->setUrl($event['href'])
->setSummary($event['title']);
$vCalendar->addComponent($vEvent);
}
/**
* Timetable events
*/
$events = $this->calendarRepository->getEventsForTimetables($user->id, Carbon::now()->subWeeks(2), Carbon::now()->addWeeks(6));
foreach ($events as $event) {
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent
->setUseTimezone(true)
->setUseUtc(false)
->setDtStart(Carbon::parse($event['start']))
->setDtEnd(Carbon::parse($event['end']))
->setNoTime(($event['allDay'] == 1 ? true : false))
->setSummary($event['title']);
$vCalendar->addComponent($vEvent);
}
}
header('Content-Type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=onderwijsonline.ics');
return $vCalendar->render();
}
正如我上面提到的,这种设置适用于 Google 日历,但不适用于 outlook。
有谁知道为什么以及如何解决这个问题?
您正在使用 TZID=Europe/Amsterdam 但您的 ics 文件不包含与此 TZID 对应的 VTIMEZONE 定义。所以在你的 BEGIN:VEVENT 之前,你应该有一个 BEGIN:VTIMEZONE...END:VTIMEZONE 组件。
至于为什么它仍然适用于 Google 但不适用于 Outlook:许多产品确实使用 Olson TZID,因此他们可以忽略缺少 VTIMEZONE 定义的事实,并假设您的 TZID =Europe/Amsterdam对应他们的映射。
另一方面,Microsoft 有自己的一组 TZID 标识符(例如 "Central Europe Standard Time"),因此无法将您的 Europe/Amsterdam 映射到已知定义。
最后,在堆栈溢出时,至少您的 TRANSP、DTEND 和 URL 属性 确实出现在同一行上。我假设这只是提交问题时的格式问题 (???)。