Почему мои приглашения в календаре не обрабатываются анализатором Outlook?

Приглашения, сгенерированные моим приложением ASP.net, отправленные по электронной почте с вложением.ics в Outlook 2010, не обрабатываются анализатором. Как таковые, они не отображаются в календаре предварительно и недоступны на панели предварительного просмотра. Вложение.ics представляется действительным и может быть открыто в outlook двойным щелчком мыши. Те же приглашения, отправленные в Gmail, обрабатываются без забот. Я исключил ряд принятых решений той же проблемы...

  • Outlook правильно настроен и обрабатывает приглашения Gmail без проблем
  • Сообщение отправляется как Content-Type: multipart/mixed, с вложением в виде текста / календаря.
  • DTEND следует DTSTART!
  • Приглашение включает в себя организатора и участника.

Самая очевидная разница между моими приглашениями и Gmails - это отсутствие подписи 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, указанное здесь, не помогло.

Мой файл проходит три валидатора iCalendar, упомянутые в этом вопросе

Боже мой, интернет забивается людьми, которые не могут получить приглашения в Outlook. Здесь, здесь и здесь.

Похоже, консенсус заключается в том, что вам нужно добавить "; method=REQUEST" после типа содержимого в заголовке части календаря MIME. Проблема в том, что библиотека.net System.Net.Mail не предлагает низкоуровневый доступ для установки этой линии. Охота продолжается.

2 ответа

Решение

Хорошо, я взломал это. Решение, которое сработало для меня, - это сочетание двух предложений здесь. Текстовая / календарная часть должна быть единственной частью сообщения, а метод =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. Этот трюк может быть полезен для всех, кто хочет установить Content-Type простой почты, состоящей из одной части, в.net. Таким образом, полученная почта выглядит следующим образом...

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, за то, что он без труда построил рабочий пример, и за чудесный вариант "показать оригинал". Как уже говорилось выше, Google каким-то образом удается правильно обрабатывать гораздо более сложные сообщения, но для этого нужно быть программистом Google.

Скорее всего, это связано со структурой MIME вашего сообщения. Возможно, вам придется поместить поток icalendar в составную часть / альтернативу (см. http://tools.ietf.org/html/rfc6047) или, что еще хуже, составную часть / смешанную строку, содержащую составную часть / альтернативу, для размещения всех клиентов.,

Другие вопросы по тегам