支持多个事件请求的iCal客户端

本文关键字:iCal 客户端 请求 事件 支持 | 更新日期: 2023-09-27 18:14:47

当用户在我们的网站注册时,我想给他们发一封电子邮件,允许他们自动更新他们注册的课程的日历。在大多数情况下,这将是多个天/事件。

作为测试,我使用的是DDay。用于创建多事件请求。但是,Outlook和iPhone邮件应用程序似乎都没有注意到ical附件中的第二个事件。

我知道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);
                    }
                }

支持多个事件请求的iCal客户端

不幸的是,您完全依赖于各种电子邮件客户端的Icalendar实现,而这些客户端通常非常保护其用户的日历。它们通常都支持多事件Icalendars,但是"直接进入"用户日历的邀请必须一次发送一个事件。我不知道有什么例外。

要处理包含多个事件的Icalendar附件,例如在Outlook中,您需要将附件保存到磁盘,导航到它并打开它。然后它作为一个单独的日历打开,您需要将事件一个接一个地拖到您的日历中。噩梦。这将很少值得开发的麻烦。

另一个选择当然是在你的网站上托管Icalendar,让你的用户通过在他们的客户端输入日历URL来订阅。这样做的好处是更改会自动传播,但电子邮件客户端仍然会将事件视为外部事件(没有自动提醒,在outlook中默认是将它们显示在单独的窗格中,Gmail至少会在同一网格中显示来自不同日历的事件)