【问题标题】:Why are my icalendar invitations not processed by the outlook sniffer?为什么 Outlook 嗅探器未处理我的日历邀请?
【发布时间】:2014-08-07 05:32:06
【问题描述】:

我的 ASP.net 应用程序生成的邀请,作为带有 .ics 附件的电子邮件发送到 Outlook 2010,没有被嗅探器处理。因此,它们不会在日历中显示为暂定,并且在预览窗格中不可用。 .ics 附件似乎是有效的,可以通过双击在 Outlook 中打开。发送到 Gmail 的相同邀请会得到处理,无需担心。对于同一问题,我已经排除了许多公认的解决方案...

  • Outlook 配置正确,处理 Gmail 邀请没有问题
  • 消息以 Content-Type: multipart/mixed 形式发送,附件为文本/日历。
  • DTEND 跟随 DTSTART !
  • 邀请包括组织者和与会者。

我的邀请和 Gmail 之间最明显的区别是没有 DKIM 签名,但其他人在没有这个的情况下也成功了。更一般地说,有没有人找到任何有关嗅探器的操作、日志记录或故障排除的 Microsoft 文档?

这是我的 .ics 附件。

BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20140617T083644Z
DTEND:20140617T093644Z
DTSTAMP:20140617T083647Z
ORGANIZER;CN=sby@dimo-gestion.fr:mailto:sby@dimo-gestion.fr
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 FALSE;CN=bbsimonbb@gmail.com;X-NUM-GUESTS=0:mailto:bbsimonbb@gmail.com
CREATED:20140617T083647Z
DESCRIPTION:Description of flying to Sligo
LAST-MODIFIED:20140617T083647Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Fly to Sligo
TRANSP:OPAQUE
UID:20140617T083647Z
END:VEVENT
END:VCALENDAR

属性 X-MS-OLK-FORCEINSPECTOROPEN,指定为 here,没有帮助。

我的文件通过了this 问题中提到的三个 iCalendar 验证器

我的天啊,互联网上挤满了无法将邀请加入 Outlook 的人。 Hereherehere

共识似乎是您需要在日历MIME部分的标题中的内容类型之后添加“; method=REQUEST”。麻烦的是,.net System.Net.Mail 库似乎没有提供设置此行的低级别访问权限。狩猎仍在继续。

【问题讨论】:

    标签: c# icalendar outlook-2010


    【解决方案1】:

    这很可能与您的消息 MIME 结构有关。您可能必须将 icalendar 流放在 multipart/alternative 中(请参阅 https://www.rfc-editor.org/rfc/rfc6047#section-4.2 ),或者更糟的是,包含 multipart/alternative 的 multipart/mixed 以适应所有客户端。

    【讨论】:

    • Outlook 喜欢的 Gmail 邀请是多部分/混合的。正如您所建议的,它们将 icalendar 作为附件(MIME 类型应用程序/ics,base64 编码)和多部分/替代。 multipart/alternate 包含三个部分:text/plain、text/html 和 text/calendar。因此,日历信息被发送两次——一次作为备用视图,一次作为 base64 编码附件。我已经尽可能地复制了这个,暂时没有成功。
    • 它是什么样子的?对于无法处理这些内容的电子邮件客户端来说,只有一个文本/日历正文部分不会对用户非常友好。
    【解决方案2】:

    好的,我已经破解了。对我有用的解决方案是两个建议的组合here。文本/日历部分必须是消息的唯一部分,并且 method=REQUEST 必须出现在 Content-Type 标头中。

    要在 .net 中实现这一点,您可以使用 AlternateViews,如下所示...

    MailMessage msg = new MailMessage();
    msg.From = new MailAddress("gonzo@work");
    msg.To.Add("gonzo@home");
    
    System.Net.Mime.ContentType mimeType = new System.Net.Mime.ContentType("text/calendar; method=REQUEST");
    AlternateView icalView = AlternateView.CreateAlternateViewFromString(icalendarString, mimeType);
    icalView.TransferEncoding = TransferEncoding.SevenBit;
    msg.AlternateViews.Add(icalView);
    client.Send(msg);
    

    好的一点是,在没有正文、附件或其他替代视图的情况下,.net 足够聪明,可以只用一个部分构建邮件。使用alternateView 仍然是必要的,因为它是控制Content-type 标头的唯一方法。这个技巧对于想要在 .net 中设置简单单部分邮件的 Content-Type 的任何其他人都可能很有用。然后,生成的邮件看起来像这样......

    MIME-Version: 1.0
    From: gonzo@work
    To: gonzo@home
    Subject: Fly to Sligo
    Content-Type: text/calendar; method=REQUEST
    Content-Transfer-Encoding: 7bit
    
    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//www.notilus.com//Dimo Gestion Notilus//FR
    CALSCALE:GREGORIAN
    METHOD:REQUEST
    X-MS-OLK-FORCEINSPECTOROPEN:TRUE
    BEGIN:VEVENT
    DTSTART:20140619T080132Z
    DTEND:20140619T090132Z
    DTSTAMP:20140619T080132Z
    ORGANIZER;CN=gonzo@work:mailto:gonzo@work
    ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
     FALSE;CN=gonzo@home;X-NUM-GUESTS=0:mailto:gonzo@home
    CREATED:20140619T080132Z
    DESCRIPTION:Description of flying to Sligo
    X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//E
     N">\n<html>\n<body>\n<table border="1"><tr><td>\n<b>HTML</b> Description o
     f flying to Sligo\n</td></tr><tr><td>\n<ul><li>HTML has certain advantages
     </li></ul>\n</td></tr></table>\n</body>\n</html>
    LAST-MODIFIED:20140619T080132Z
    LOCATION:
    SEQUENCE:0
    STATUS:CONFIRMED
    SUMMARY:Fly to Sligo
    TRANSP:OPAQUE
    UID:20140619T080132Z
    END:VEVENT
    END:VCALENDAR
    

    非常感谢 gmail,感谢您毫不费力地构建了一个工作示例,以及出色的“显示原创”选项。如上所述,谷歌以某种方式设法正确处理了更复杂的消息,但您需要成为谷歌程序员才能弄清楚这一点。

    【讨论】:

    • 谢谢,那里有很多无用的信息,但这救了我。
    猜你喜欢
    • 2014-05-04
    • 2020-03-14
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多