Отправляйте события iCal с методом =PUBLISH в Exchange 2013, Outlook 2010, OWA
Мы отправляем события календаря в формате iCalendar нашим клиентам после подписки или отмены подписки на событие.
Содержимое iCalendar вложено в файл и встроено в сообщение электронной почты. Благодаря встраиванию Outlook 2010 раньше показывал событие и предлагал импортировать его в свой календарь. Thunderbird / Lightning работает точно так же.
Мы используем метод =PUBLISH, как указано в RFC 5546 - 3.2.1. Мы не хотим, чтобы клиенты "принимали" или "отклоняли" событие, поскольку это уже подтверждено системой бронирования. Это можно сделать с помощью метода =REQUEST.
Это работало как задумано, пока мы использовали Exchange 2007. С Exchange 2013 у нас странное поведение
- в Outlook 2010: отображается электронная почта, отображается значок события, но вы не можете сохранить событие в своем календаре
- в OWA: электронная почта не отображается!
- в Thunderbird через IMAP: электронная почта не отображается. Вместо этого вы получаете странное электронное письмо с темой "Fehler beim Abrufen der folgenden Nachricht mithilfe des IMAP4-Protokolls: 1393431". (Ошибка при получении следующего сообщения по протоколу IMAP4).
Делая это с методом =REQUEST, кажется, все хорошо, даже для Outlook.
Я сократил нашу настройку, чтобы найти решение. Теперь я понятия не имею.
Событие iCalendar, основанное на минимальном опубликованном событии в RFC 5546
НАЧАТЬ:VCALENDAR МЕТОД: ЗАПРОС PRODID:-// Пример /ExampleCalClient//EN VERSION:2,0 НАЧАТЬ: VEVENT ОРГАНИЗАТОР;CN="а":MAILTO:a@example.com DTSTART:19970701T200000Z DTSTAMP:19970611T190000Z РЕЗЮМЕ: СТ. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES UID:0981234-1234234-23@example.com СТАТУС: Подтверждена END: VEVENT END:VCALENDAR
PHP скрипт на основе swiftmailer
setSubject ('Ваша тема') ->setFrom(array('a@example.com' => 'a')) ->setTo(массив ('b@example.com' => 'b')) //->attach(Swift_Attachment::fromPath('Minimal.ics')); // включить как встроенную часть $part = \Swift_MimePart::newInstance() ->setEncoder(\Swift_Encoding::getBase64Encoding()) ->setContentType('text/calendar; method=PUBLISH') ->setBody(file_get_contents('Minimal.ics')); $ Сообщение-> присоединять ($ часть); $transport = Swift_SmtpTransport::newInstance('localhost', 25); // Создание почтовой программы с использованием созданного вами транспорта $mailer = Swift_Mailer::newInstance($transport); $ Mailer-> отправить ($ сообщение);
Полученное письмо
Обратный путь: [...] Идентификатор сообщения: Дата: Ср, 01 Июн 2016 16:29:34 +0000 Тема: Ваша тема От: a до: b MIME-версия: 1.0 Тип контента: составная часть / альтернатива; border ="_=_swift_v4_1464798574_0bd8d119cc81344afaa03879bf961d51_=_" --_=_swift_v4_1464798574_0bd8d119cc81344afaa03879bf961d51_=_ Content-Type: text/calendar; Метод = ПУБЛИКОВАТЬ; кодировка = UTF-8 Content-Transfer-Encoding: base64 QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6UkVRVUVTVA0KUFJPRElEOi0vL0V4YW1wbGUvRXhhbXBs ZUNhbENsaWVudC8vRU4NClZFUlNJT046Mi4wDQpCRUdJTjpWRVZFTlQNCk9SR0FOSVpFUjtDTj0i QWxleGFuZGVyIEJpZ2dhIjpNQUlMVE86QWxleGFuZGVyLkJpZ2dhQHNsdWItZHJlc2Rlbi5kZQ0K RFRTVEFSVDoxOTk3MDcwMVQyMDAwMDBaDQpEVFNUQU1QOjE5OTcwNjExVDE5MDAwMFoNClNVTU1B Ulk6U1QuIFBBVUwgU0FJTlRTIC1WUy0gRFVMVVRILVNVUEVSSU9SIERVS0VTDQpVSUQ6MDk4MTIz NC0xMjM0MjM0LTIzQGV4YW1wbGUuY29tDQpTVEFUVVM6Q09ORklSTUVEDQpFTkQ6VkVWRU5UDQpF TkQ6VkNBTEVOREFSDQo= --_=_swift_v4_1464798574_0bd8d119cc81344afaa03879bf961d51_=_--
Поведение не меняется, если
- событие прилагается
- событие цитируется для печати вместо base64
- тело заполнено текстом / простым текстом и / или текстом / HTML
- конец строки файла события - это dos (\r\n) или unix (\ n)
Thunderbird / Lightning и Googlemail работают как положено.
Итак, что с этим не так? Или это известное поведение Exchange 2013 / Outlook 2010? Или кто дьявол в этом случае?