为什么我的 PHP 生成的 .ICS 文件在文本编辑器中打开?
Why does my PHP-generated .ICS file open in a text editor?
我正在使用 PHP 生成 .ICS 文件并将其保存到服务器,然后将其作为附件附加到电子邮件并发送给用户。
生成 .ICS 文件的代码(缺少一些上下文,因为它是一个更大对象的一部分,但它的要点):
public function ics() {
$ical = "BEGIN:VCALENDAR\n" .
"VERSION:2.0\n" .
"CALSCALE:GREGORIAN\n" .
"PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n" .
"BEGIN:VEVENT\n" .
"UID:" . md5(uniqid(mt_rand(), true)) . "\n" .
"DTSTAMP:" . gmdate('Ymd') . 'T' . gmdate('His') . "\n" .
"DTSTART:" . CrRequest::dateToCal(strtotime($this->cdate . " " . $this->start_time)) . "\n" .
"DTEND:" . CrRequest::dateToCal(strtotime($this->cdate . " " . $this->end_time)) . "\n" .
"SUMMARY:" . $this->location . "\n" .
"END:VEVENT\n" .
"END:VCALENDAR\n";
$name = 'i' . $this->id . 'send.ics';
file_put_contents(self::$icslocation . $name, $ical);
return $name;
}
以及正在生成的文本示例:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
SUMMARY:<summary>
LOCATION:<location>
DTSTART:20170824T070000
DTEND:20170824T104500
DESCRIPTION:
END:VEVENT
END:VCALENDAR
我收到的投诉是 .ICS 文件在纯文本编辑器中打开。我的直觉反应是说我对此无能为力——用户需要配置他们的系统才能在正确的应用程序中打开 .ICS 文件。但是,am 我在创建文件时遗漏了什么?这是 必须 在用户端处理的不幸问题之一,还是我可以在这里做一些额外的事情来指示他们的系统在电子邮件应用程序中打开它?
这取决于用户浏览器对文件类型的设置,是的,正如 Rob 所建议的,文件类型将由 mime 类型决定,因此仅创建一个包含 ics 数据的文本文件是不够的。它必须具有 'text/calendar' 的 MIME 类型,并且用户的浏览器必须设置为打开他们使用的任何日历应用程序。
我正在使用 PHP 生成 .ICS 文件并将其保存到服务器,然后将其作为附件附加到电子邮件并发送给用户。
生成 .ICS 文件的代码(缺少一些上下文,因为它是一个更大对象的一部分,但它的要点):
public function ics() {
$ical = "BEGIN:VCALENDAR\n" .
"VERSION:2.0\n" .
"CALSCALE:GREGORIAN\n" .
"PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n" .
"BEGIN:VEVENT\n" .
"UID:" . md5(uniqid(mt_rand(), true)) . "\n" .
"DTSTAMP:" . gmdate('Ymd') . 'T' . gmdate('His') . "\n" .
"DTSTART:" . CrRequest::dateToCal(strtotime($this->cdate . " " . $this->start_time)) . "\n" .
"DTEND:" . CrRequest::dateToCal(strtotime($this->cdate . " " . $this->end_time)) . "\n" .
"SUMMARY:" . $this->location . "\n" .
"END:VEVENT\n" .
"END:VCALENDAR\n";
$name = 'i' . $this->id . 'send.ics';
file_put_contents(self::$icslocation . $name, $ical);
return $name;
}
以及正在生成的文本示例:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
SUMMARY:<summary>
LOCATION:<location>
DTSTART:20170824T070000
DTEND:20170824T104500
DESCRIPTION:
END:VEVENT
END:VCALENDAR
我收到的投诉是 .ICS 文件在纯文本编辑器中打开。我的直觉反应是说我对此无能为力——用户需要配置他们的系统才能在正确的应用程序中打开 .ICS 文件。但是,am 我在创建文件时遗漏了什么?这是 必须 在用户端处理的不幸问题之一,还是我可以在这里做一些额外的事情来指示他们的系统在电子邮件应用程序中打开它?
这取决于用户浏览器对文件类型的设置,是的,正如 Rob 所建议的,文件类型将由 mime 类型决定,因此仅创建一个包含 ics 数据的文本文件是不够的。它必须具有 'text/calendar' 的 MIME 类型,并且用户的浏览器必须设置为打开他们使用的任何日历应用程序。