ICalendar не создает событие для органайзера

Я пытаюсь создать событие в календаре Microsoft Outlook с помощью стандарта iCalendar. Ive отправил электронное письмо с типом контента "text/calendar" в мой почтовый ящик Exchange из приложения .NET. Он поступает в Outlook как запрос на собрание. Все выглядит хорошо, до момента, когда я нажимаю на полученный запрос собрания, Outlook отображает его как пустой вид календаря с текстом: "Встреча не может быть найдена в календаре". Я не понимаю, почему - я хотел создать событие, и он пытается найти некоторые существующие?

Если я отправляю точно такое же письмо кому бы то ни было участнику собрания, кроме организатора, он создает событие в своих календарях, и все выглядит нормально. Ive обнаружил, что это вызвано свойством "ORGANIZER". Если он настроен на отправку электронной почты организаторам (мой адрес электронной почты), и я отправляю запрос на встречу себе, событие не создается с информацией "Встреча не может быть найдена в календаре".

Итак, вопрос в том, почему он не создает событие для органайзера? Организатор должен иметь это событие, созданное для уведомления других участников, если они приняли или отменили собрание.

Вот iCalendar:

BEGIN:VCALENDAR
PRODID:-//Company//Product 3.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20130225T200000Z
DTEND:20130225T203000Z
DTSTAMP:20130225T143039Z
ORGANIZER;CN="John Doe":mailto:[email protected]
UID:[email protected]
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN="John Smith"
 ;X-NUM-GUESTS=0:mailto:[email protected]
CLASS:PUBLIC
CREATED:20130225T143039Z
DESCRIPTION:
LAST-MODIFIED:20130225T143039Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Booking test
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

Ответ 1

Предположим, что организатор хочет создать встречу для 2 участников. Он заполняет форму в системе бронирования. Система бронирования отправляет электронное письмо, содержащее стандарт iCalendar, и двум участникам собрания.

Этот сценарий не работает.

В календаре организатора невозможно создать событие (объект с возможностью отмены). Клиент считает, что электронная почта, содержащая формат iCalendar, - это просто уведомление для участника собрания, уже созданного в календаре организатора. Если такое письмо поступает в почтовый ящик организаторов, клиентское приложение не создает событие в календаре организаторов. Он предполагает, что событие было создано самим организатором. Например: Outlook сообщает вам в этом случае, что "Встреча не найдена в календаре".

Если вы обратитесь к поддержке Microsoft, сообщите, что они не поддерживают открытые стандарты: http://support.microsoft.com/kb/2269506

Рабочим решением этой проблемы является использование сервисов платформы (Веб-службы Exchange или API календаря Google). для создания события в календаре организаторов. Забудьте о стандарте iCalendar. Сервисы могут быть настроены для автоматической отправки уведомлений посетителям. Поэтому достаточно передать "SendInvitationsMode.SendToAllAndSaveCopy", если вы используете EWS:

Appointment appointment = new Appointment(service);
appointment.Subject = "Status Meeting";
appointment.Body = "The purpose of this meeting is to discuss status.";
appointment.Start = new DateTime(2014, 3, 1, 9, 0, 0);
appointment.End = appointment.Start.AddHours(2);
appointment.Location = "Conf Room";
appointment.RequiredAttendees.Add("[email protected]");
appointment.RequiredAttendees.Add("[email protected]");
appointment.OptionalAttendees.Add("[email protected]");  
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);

или установите для параметра "sendNotifications" значение true в случае API календаря Google.

Вам не нужно отправлять электронное письмо каждому конкретному участнику.

Ответ 2

Это немного старая проблема, но я думаю, что она вызвана использованием   МЕТОД: ЗАПРОС Это означает, что iical должен быть обновлен, а не новый элемент. Вместо этого используйте   МЕТОД: ПУБЛИКОВАТЬ

Я могу подтвердить, что это работает с календарями DDay.iCal и Outlook.

Ответ 3

Это заставило меня с ума сойти на неделю, так что приятно видеть кого-то другого, подтверждающего то, что я подозревал. На самом деле существует относительно простое решение, которое решает вопрос, хотя оно не очень элегантно. Я могу понять, почему нельзя было бы нести роль Организатора из внешнего источника, но это раздражает, что вы не можете.

Отправьте 2 приглашения. Один для себя (или кто бы ни был организатором), а затем другой для всех остальных.

Один для себя должен иметь что-то другое, кроме вас, как ORGANSISER, например. ОРГАНИЗАТОР: [email protected]

Для всех остальных должна быть ваша электронная почта как организатор.

Для этого подхода к работе вы должны установить METHOD: REQUEST. Если вы установите его в PUBLISH, вы получите дубликаты обновлений.

Этот подход означает, что вы получаете встречу в своем дневнике, и вы также получаете ответы (чтобы получить ответы, вам необходимо включить следующую строку для каждого участника: ATTENDEE; CN = "Имя"; RSVP = TRUE: mailto: [email protected])

Обратите внимание, что UID одинаковый для обеих версий файла. Это помогает, если ORGANIZER сначала получает приглашение, чтобы они могли принять его, прежде чем они начнут получать ответы, иначе люди будут отвечать на что-то, что на самом деле еще не существует. Это не помешает им принять приглашение, но может быть немного запутанным для ОРГАНИЗАТОРА. Чтобы помочь в этом, я немного задержался между электронной почтой 1 и 2.

Ответ 4

Я бы предположил, что ваша проблема связана с тем, что Exchange предполагает, что организатор события также является инициатором события. Что кажется достаточно справедливым, так как в противном случае это была бы детская игра, чтобы отправлять собрания людям, делающим их организатором, и они автоматически добавляются в календарь человека.

Все, что сказал, не знаю, как обойти эту проблему.

Ответ 5

поведение приглашения на событие, отправленное по электронной почте, описано в rfc6047, которое далее расширяет icalendar RFC (RFC5545).

раздел 2 и раздел 3 о безопасности, суммирует две угрозы спуфинга:

подменяет "Организатор" и подменяет "Attendee"

то есть

[email protected] не разрешено изменять или отменять собрание, организованное по адресу [email protected]

к вашему делу: 1. Вы отправили приглашение с того же адреса электронной почты, что и ваш обмен (говоря о From: в почте, а не в Organizer:mailto?), Если не стоит пытаться отправить его через обменный адрес. 2. если выше не работает, чтобы удовлетворить потребность организатора в приглашении в календаре, вам, вероятно, потребуется добавить его программно в повестку дня организатора, так как, скорее всего, CUA (Пользователь календаря) или Exchange не разрешает сторонняя почтовая программа для добавления событий в повестку дня без использования пользовательского интерфейса конечного пользователя.

Ответ 6

В последние месяцы наш сервис также отвечает той же проблеме, что и вы: наш сервис создает календарь встреч для организатора и участников, если участники содержат организатора, организатора (в качестве аттестата) могут получать электронную почту календаря, но ему не разрешается принимать/отклонять встречу (кнопка отключена) и не видеть ее в календаре (без события календаря).

Наконец, я замечаю, что только при следующих условиях это произойдет: 1. mail.From = организатор 2. Ateendees.contains(организатор)//без учета регистра.

Итак, я просто меняю свой код на follwing, и он отлично подходит для всех участников (включая организатор):

if (!attendeeEmail.ToLower().Contains(organizer.Address.ToLower()))
{
    message.From = organizer;
}
else
{
    //such as your actual email sender, in our case, our mail sender use another email,
    //say ActualSender,and if leave empty, then our mail sender will fill as:
    message.From = ActualSenderEmail;
}