Поддержка клиента iCal для нескольких запросов событий
Когда пользователь регистрируется на нашем веб-сайте, я хотел бы отправить ему электронное письмо, которое позволяет ему автоматически обновлять свой календарь с учетом классов, в которые он записан. В большинстве случаев это будет несколько дней / событий.
В качестве теста я использую DDay.ical для создания запроса на несколько событий. Однако, похоже, что ни Outlook, ни почтовое приложение iPhone не замечают второе событие во вложении.
Я знаю, что в стандарте iCal поддерживается несколько событий. Как это не означает, что все клиенты поддерживают эти сценарии. Поддерживают ли другие клиенты несколько событий?
Я не думаю, что я делаю что-то не так в коде, но я опубликую свой фрагмент кода, чтобы быть уверенным:
// Create event part.
iCalendar iCal1 = new iCalendar();
iCal1.AddLocalTimeZone();
iCal1.Method = "REQUEST";
Event evt1 = iCal1.Create<Event>();
evt1.Start = new iCalDateTime(new DateTime(2014, 8, 4, 12, 30, 00, DateTimeKind.Local));
evt1.End = evt1.Start.AddMinutes(30);
evt1.IsAllDay = false;
evt1.Summary = string.Format("Lesson - {0}", evt1.Start.ToString("MM/dd"));
evt1.Location = "Anytown";
// Add recipients for appointment.
Attendee att1 = new Attendee("mailto:" + "me@MyDomain.com");
att1.RSVP = false;
att1.CommonName = "Me Jones";
evt1.Attendees.Add(att1);
Event evt2 = iCal1.Create<Event>();
evt2.Start = new iCalDateTime(new DateTime(2014, 8, 11, 12, 30, 00, DateTimeKind.Local));
evt2.End = evt1.Start.AddMinutes(30);
evt2.IsAllDay = false;
evt2.Summary = string.Format("Lesson - {0}", evt2.Start.ToString("MM/dd"));
evt2.Location = "AnyTown";
// Add recipients for appointment.
Attendee att2 = new Attendee("mailto:" + "me@MyDomain.com");
att2.RSVP = false;
att2.CommonName = "Me Jones";
evt2.Attendees.Add(att2);
iCalendarSerializer serializer1 = new iCalendarSerializer();
string t = serializer1.SerializeToString(iCal1);
Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(t);
using (var ms = new System.IO.MemoryStream(bytes))
{
using (var a = new System.Net.Mail.Attachment(ms, "meeting.ics", "text/calendar")) //Either load from disk or use a MemoryStream bound to the bytes of a String
{
a.ContentDisposition.Inline = true; //Mark as inline
msg.Attachments.Add(a); //Add it to the message
Mailer.Send(msg);
}
}
1 ответ
К сожалению, вы полностью зависите от реализации Icalendar в различных почтовых клиентах, и они обычно очень защищают календари своих пользователей. Как правило, все они поддерживают многокамерные Icalendars, но приглашения, которые "идут прямо" в календарь пользователя, должны отправляться по одному событию за раз. Я не знаю каких-либо исключений из этого.
Чтобы обработать вложение Icalendar, содержащее более одного события, например в Outlook, необходимо сохранить вложение на диск, перейти к нему и открыть его. Затем он открывается как отдельный календарь, и вам нужно перетаскивать события одно за другим в свой календарь. Кошмарный сон. Это редко будет стоить усилий для разработки.
Другой вариант, конечно, это разместить Icalendar на своем веб-сайте и заставить своих пользователей подписаться, введя URL-адрес календаря в своем клиенте. Преимущество в том, что изменения распространяются автоматически, но почтовые клиенты по-прежнему будут обрабатывать события как внешние (автоматических напоминаний нет, в Outlook по умолчанию они отображаются на отдельной панели, Gmail, по крайней мере, отображает события из разных календарей в одной и той же сетке).)