【问题标题】:Outlook-web-app is not importing events from my generated icalendarOutlook-web-app 未从我生成的 icalendar 导入事件
【发布时间】:2017-04-21 17:54:44
【问题描述】:

对于我的应用程序,我使用laravel 5.3 和一个名为markuspoerschke/iCal 的包,您可以找到here

当学生想要订阅他或她的日历时,我们会生成一个可以填写到 Google 日历和 Outlook 中的 URL。除了最后提到的outlook,它没有导入任何事件。

我们生成的 ICS 外观示例。这包含 1 个事件,描述为“测试”。

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。

有谁知道为什么以及如何解决这个问题?

【问题讨论】:

    标签: php laravel outlook icalendar outlook-web-app


    【解决方案1】:

    您使用的是 TZID=Europe/Amsterdam,但您的 ics 文件不包含与此 TZID 对应的 VTIMEZONE 定义。所以在你的 BEGIN:VEVENT 之前,你应该有一个 BEGIN:VTIMEZONE...END:VTIMEZONE 组件。

    至于为什么它仍然适用于 Google 但不适用于 Outlook:许多产品确实使用 Olson TZID,因此他们可以忽略缺少 VTIMEZONE 定义的事实,并假设您的 TZID=Europe/Amsterdam 对应于他们的映射。

    另一方面,Microsoft 有自己的一组 TZID 标识符(例如“中欧标准时间”),因此无法将您的欧洲/阿姆斯特丹映射到已知定义。

    最后,在堆栈溢出时,至少您的 TRANSP、DTEND 和 URL 属性确实出现在同一行。我假设这只是提交问题时的格式问题 (???)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2013-07-02
      • 2014-09-11
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      相关资源
      最近更新 更多