2

在订阅或取消订阅活动后,我们会以 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 的已知行为?或者在这种情况下谁是魔鬼?

4

0 回答 0