在订阅或取消订阅活动后,我们会以 iCalendar 格式向我们的客户发送日历活动。
iCalendar 内容作为文件附加并嵌入在电子邮件中。通过嵌入,Outlook 2010 用于显示事件并提供将其导入您的日历。Thunderbird / Lightning 完全一样。
我们使用RFC 5546 - 3.2.1中指定的method=PUBLISH。我们不希望客户“接受”或“拒绝”活动,因为预订系统已经确认。这可以通过 method=REQUEST 来完成。
只要我们使用 Exchange 2007,这就会按预期工作。对于 Exchange 2013,我们有奇怪的行为
- 在 Outlook 2010 中:显示电子邮件,显示事件图标,但您无法将事件保存到日历
- 在 OWA 中:未显示电子邮件!
- 通过 IMAP 在 Thunderbird 中:未显示电子邮件。相反,您会收到一封奇怪的电子邮件,主题为“Fehler beim Abrufen der folgenden Nachricht mithilfe des IMAP4-Protokolls: 1393431”。(使用 IMAP4 协议获取以下消息时出错)。
使用 method=REQUEST 执行此操作,即使对于 Outlook,一切似乎都很好。
我简化了我们的设置以找到解决方案。现在我已经不知道了。
iCalendar 事件,基于 RFC 5546 中的最小发布事件
开始:VCALENDAR 方法:请求 PRODID:-//Example/ExampleCalClient//EN 版本:2.0 开始:事件 组织者;CN="a":MAILTO:a@example.com DTSTART:19970701T200000Z DTSTAMP:19970611T190000Z 摘要:ST。PAUL SAINTS -VS- 德卢斯 - 高级公爵 UID:0981234-1234234-23@example.com 状态:已确认 结束:事件 结束:VCALENDAR
基于 swiftmailer 的 PHP 脚本
setSubject('你的主题') ->setFrom(数组('a@example.com' => 'a')) ->setTo(数组('b@example.com' => 'b')) //->attach(Swift_Attachment::fromPath('Minimal.ics')) ; // 包含为内联部分 $part = \Swift_MimePart::newInstance() ->setEncoder(\Swift_Encoding::getBase64Encoding()) ->setContentType('文本/日历;方法=PUBLISH') ->setBody(file_get_contents('Minimal.ics')); $message->attach($part); $transport = Swift_SmtpTransport::newInstance('localhost', 25); // 使用您创建的传输创建邮件程序 $mailer = Swift_Mailer::newInstance($transport); $mailer->发送($message);
生成的电子邮件
返回路径: [...] 消息 ID: 日期:2016 年 6 月 1 日,星期三 16:29:34 +0000 主题:你的主题 来自:一个 至: b MIME 版本:1.0 内容类型:多部分/替代; 边界="_=_swift_v4_1464798574_0bd8d119cc81344afaa03879bf961d51_=_" --_=_swift_v4_1464798574_0bd8d119cc81344afaa03879bf961d51_=_ 内容类型:文本/日历;方法=发布;字符集=utf-8 内容传输编码:base64 QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6UkVRVUVTVA0KUFJPRelEOi0vL0V4YW1wbGUvRXhhbXBs ZUNhbENsaWVudC8vRU4NClZFUlNJT046Mi4wDQpCRUdJTjpWRVZFTlQNCk9SR0FOSVpFUjtDTj0i QWxleGFuZGVyIEJpZ2dhIjpNQUlMVE86QWxleGFuZGVyLkJpZ2dhQHNsdWItZHJlc2Rlbi5kZQ0K RFRTVEFSVDoxOTk3MDcwMVQyMDAwMDBaDQpEVFNUQU1QOjE5OTcwNjExVDE5MDAwMFoNClNVTU1B Ulk6U1QuIFBBVUwgU0FJTlRTIC1WUy0gRFVMVVRILVNVUEVSSU9SIERVS0VTDQpVSUQ6MDk4MTIz NC0xMjM0MjM0LTIzQGV4YW1wbGUuY29tDQpTVEFUVVM6Q09ORklSTUVEDQpFTkQ6VkVWRU5UDQpF TkQ6VkNBTEVOREFSDQo= --_=_swift_v4_1464798574_0bd8d119cc81344afaa03879bf961d51_=_--
行为不会改变,如果
- 活动已附上
- 该事件是引用打印而不是 base64
- 正文用 text/plain 和/或 text/html 填充
- 事件文件的行尾是 dos (\r\n) 或 unix (\n)
Thunderbird / Lightning 和 Googlemail 都按预期工作。
那么,这有什么问题呢?或者这是 Exchange 2013 / Outlook 2010 的已知行为?或者在这种情况下谁是魔鬼?