我正在尝试用 PHP 创建一个 .ics 文件,并将其邮寄给用户。该解决方案在 Gmail 中运行良好(我收到了一份精美的邀请,其中所有信息都出现在正确的位置),但 Outlook 似乎根本无法识别它。我收到一封没有附件的空电子邮件,据我所知,没有任何事件添加到任何日历中。
我怀疑问题出在标头中的某个地方,但我对邮件协议的经验很少,无法查明问题所在。我一整天都在摆弄这个问题,请帮忙:(
更新:出于某种奇怪的原因,我确实收到了邀请,它在 iPhone 上显示为附件,与我的 Exchange 帐户同步。失败的是桌面 Outlook。为什么?
这是最精彩的代码。
$message =
"BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP: $timestamp
DTSTART: $datestart
DTEND: $dateend
UID: $uniqueid
LOCATION: $address
DESCRIPTION: $description
URL;VALUE=URI: $uri
SUMMARY: $summary
END:VEVENT
END:VCALENDAR";
// Mail parameters
$newline = "\r\n";
$headers = "From: InnovationskontorEtt Dashboard <[email protected]>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/calendar; charset=utf-8; name=inbjudan.ics; method=REQUEST".$newline;
$headers .= "Content-Disposition: inline; filename=inbjudan.ics".$newline;
$headers .= "Content-Transfer-Encoding: 7bit";
$subject = $summary;
$to = '[email protected]';
/*mail send*/
if(mail($to, $subject, $message, $headers)) : ?>
<div class="alert alert-warning">
Evenemanget skickades till din kalender.
</div>
<?php else : ?>
<div class="alert alert-danger">
Det gick inte att skicka evenemanget till din kalender.
</div>
<?php endif; ?>
一般来说,最佳实践是至少发送多部分/替代方案,以便对文本/日历格式一无所知的客户端可以向用户显示可读的消息。有关示例,请参阅 https://www.rfc-editor.org/rfc/rfc6047#section-4.2。
然后,要使邀请成为实际邀请,它需要至少有一个 ORGANIZER 和一个 ATTENDEE 属性。请参阅 https://www.rfc-editor.org/rfc/rfc5546#section-3.2.2 了解强制属性列表。这应该可以解决您的问题。
最后,向我们显示发送的实际 MIME 消息比显示代码更有用,至少在检测与 Outlook 的互操作问题方面是这样。
我遇到了同样的问题,同一个文件在 Gmail 中运行良好,但对于 Microsft Outlook,我必须将以下示例添加到
ORGANIZER
标签中:
ORGANIZER;CN=Organizer Name;[email protected]**:mailto:[email protected]**