我正在使用一个可帮助我在laravel上生成ics文件的库。我必须对其进行一些修改,以便在Outlook(日期和时区问题)上都可以使用。这是生成代码:
class Ics implements Generator
{
public function generate(Link $link): string
{
$url = [
'BEGIN:VCALENDAR',
'PRODID:-//Google Inc//Google Calendar 70.9054//EN',
'VERSION:2.0',
'CALSCALE:GREGORIAN',
'METHOD:REQUEST',
'X-WR-TIMEZONE:Europe/Paris',
'BEGIN:VEVENT',
];
$dateTimeFormat = "Ymd\THis\Z";
$url[] = 'DTSTART:'.gmdate($dateTimeFormat,strtotime($link->from->format('Y-m-d H:i')));
$url[] = 'DTEND:'.gmdate($dateTimeFormat,strtotime($link->to->format('Y-m-d H:i')));
$url[] = 'DTSTAMP:'.date('Ymd\THis');
if ($link->organizer) {
$url[] = 'ORGANIZER;CN=' . $this->escapeString($link->organizer) . ':mailto:' . $this->escapeString($link->organizer);
$url[] = 'ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE;CN=' . $this->escapeString($link->organizer) . ';X-NUM-GUESTS=0:mailto:' . $this->escapeString($link->organizer);
}
$url[] = 'UID:'.$this->generateEventUid($link);
if ($link->attendee) {
foreach ($link->attendee as $attendee) {
$url[] = 'ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=' . $this->escapeString($attendee) . ';X-NUM-GUESTS=0:mailto:' . $this->escapeString($attendee);
}
}
if ($link->description) {
$url[] = 'DESCRIPTION:'.$this->escapeString($link->description);
}
if ($link->address) {
$url[] = 'LOCATION:'.$this->escapeString($link->address);
}
$url[] = 'SEQUENCE:0';
$url[] = 'STATUS:CONFIRMED';
$url[] = 'SUMMARY:'.$link->title;
$url[] = 'TRANSP:OPAQUE';
$url[] = 'END:VEVENT';
$url[] = 'END:VCALENDAR';
$redirectLink = implode('%0d%0a', $url);
return 'data:text/calendar;charset=utf8,'.$redirectLink;
}
}
当我创建活动时,会向所有与会者(组织者除外)发送一封邮件,邮件中的ics文件均为attech技术。使用Gmail和Outlook,它会显示一个小的确认框,当我使用Outlook进行确认时,它甚至还会向组织者发送确认邮件(不是使用Gmail,但我正在使用它)。
问题在于该事件被添加到参与者的日历中,而不是组织者的日历中。我在'14上找到了一篇关于SO的帖子,说我应该将METHOD
从REQUEST
更改为PUBLISH
,但这会使Outlook无法识别ics文件。
有人有想法吗?非常感谢。