为什么 Outlook 嗅探器不处理我的日历邀请?

bbs*_*nbb 5 c# icalendar outlook-2010

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

  • Outlook 配置正确,处理 Gmail 邀请没有问题
  • 消息以内容类型:多部分/混合发送,附件为文本/日历。
  • DTEND 跟随 DTSTART!
  • 邀请函包括组织者和与会者。

我的邀请和 Gmail 的最明显的区别是没有 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
Run Code Online (Sandbox Code Playgroud)

此处指定的属性X-MS-OLK-FORCEINSPECTOROPEN没有帮助。

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

天哪,互联网上挤满了无法将邀请发送到 Outlook 的人。 这里这里,还有这里

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

bbs*_*nbb 6

好吧,我已经破解了。对我有用的解决方案是这里两个建议的组合。文本/日历部分必须是消息的唯一部分,并且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);
Run Code Online (Sandbox Code Playgroud)

好的一点是,在没有正文、附件或其他替代视图的情况下,.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
Run Code Online (Sandbox Code Playgroud)

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