IBM (Lotus) Notes 无法识别 iCal (.ics) 文件

iCal (.ics) file not recognized by IBM (Lotus) Notes

我正在从 PHP 应用程序生成 ICS 文件并将它们作为附件通过电子邮件发送(通过 SendGrid api)。

ICS 文件在 Gmail 网络邮件和 iPhone 中运行良好。但是,IBM Notes 不会将它们识别为会议邀请。 Notes 会显示附件,但不会将其视为活动邀请。

这是我的 ICS 文件:

BEGIN:VCALENDAR
PRODID:-//My Company//v1.1//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20160127T140000Z
DTEND:20160127T143000Z
DTSTAMP:20160114T213657Z
ORGANIZER;CN=Demo Two:
 mailto:demo2@example.com
UID:e93838a737b3f9ae75056968b22281b2
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=CHAIR;RSVP=FALSE
 ;CN=Demo Two:mailto:demo2@example.com
CREATED:20160114T213657Z
DESCRIPTION:another scheduled
LAST-MODIFIED:20160114T213657Z
LOCATION:See email
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:another scheduled
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

我正在尝试将同一个 ICS 文件发送给多个收件人,因此我没有为收件人添加 ATTENDEE 行,只为主席添加了 ATTENDEE 行。

我找不到任何关于 Notes 在其 ICS 文件中需要什么的详细信息...

知道出了什么问题吗?

这可能是以下两个问题之一:

首先,您至少应该为您要向其发送邀请的用户指定一名与会者。

如果这不起作用,Lotus Notes 可能无法识别您电子邮件的 MIME 结构,在这种情况下,您可能希望在问题中包含整个 MIME 消息。

我通过比较邮件 body 和 Google 邮件邀请(在 Notes 中有效)诊断了我的部分问题。通过 SendGrid web api 附加一个 icalendar ics 文件时有几个明显的问题。

邮件需要包括几个部分:一个body、一个内联text/calendar object,以及一个附加的.ics 文件。

Outlook 和 Google 用户附件。我认为 Notes 使用内联数据,因为它似乎忽略了 .ics 附件。

我发现了这个相关的 Whosebug 问题: How to add headers in sendgrid?

因此,我采用了在 SwiftMailer 中使用适当的消息和附件构建消息的方法 headers。到目前为止它似乎工作正常,但我会在 Notes 中测试时确认。

编辑:我已经确认内联 icalendar 邀请确实有效,而且这个邀请现在出现在 Notes 中。

邮件的每个部分都需要有自己的 MIME 类型。这是消息 body:

Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<p>Hello,</p>
<p>This is a friendly reminder ...

这是 icalendar 邀请(请注意,您无法读取 iCalendar 数据,因为它是 base64 编码的:

Content-Type: text/calendar; charset=UTF-8; method=PUBLISH; name=invite.ics
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=invite.ics

QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vU3RyaWRlLlRyYWluaW5nLy92
MS4xLy9FTg0KVkVSU0lPTjoyLjANCkNBTFNDQUxFOkdSRUdPUklBTg0KTUVU...

我通过在 SwiftMailer 中添加附件得到了这个输出:

$attachment = Swift_Attachment::newInstance($ical, 'invite.ics', 'text/calendar');
$attachment->setDisposition('inline');
$attachment->setContentType('text/calendar; charset=UTF-8; method=PUBLISH');
$message->attach ( $attachment );

在上面的代码片段中,$ical 是一个 correctly-formatted iCalendar 字符串。

抱歉,这已经很长了,但是很难找到有关如何正确执行此操作的信息。