为什么我的icalendar邀请函不会被outlook嗅探器处理?

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

  • Outlook已正确配置,并且处理Gmail邀请没有问题
  • 邮件将作为Content-Type:multipart / mixed发送,附件为text / calendar。
  • DTEND遵循DTSTART!
  • 邀请函包括组织者和与会者。

我的邀请和Gmails之间最明显的区别是没有DKIM签名,但其他人没有这个就取得了成功。 更一般地说,有没有人发现任何关于嗅探器的操作,记录或故障排除的微软文档?

这是我的.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没有帮助。

我的文件通过了这个问题中提到的三个iCalendarvalidation器

我的上帝互联网正在堵塞那些无法将他们的邀请带入Outlook的人。 在这里 , 这里和这里 。

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

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

要在.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:\n\n\n
\nHTML Description o f flying to Sligo\n
\n
  • HTML has certain advantages
\n
\n\n LAST-MODIFIED:20140619T080132Z LOCATION: SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Fly to Sligo TRANSP:OPAQUE UID:20140619T080132Z END:VEVENT END:VCALENDAR

非常感谢gmail,毫不费力地构建一个工作示例,以及非凡的“show original”选项。 如上所述,谷歌以某种方式设法正确处理更复杂的消息,但你需要成为谷歌程序员来解决这个问题。

这很可能与您的邮件MIME结构有关。 您可能必须将icalendar流放入multipart / alternative(请参阅http://tools.ietf.org/html/rfc6047#section-4.2 ),或者更糟糕的是,包含multipart / alternative的multipart / mixed以容纳所有客户端。