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

C# iCal客户端支持多个事件请求,c#,icalendar,dday,C#,Icalendar,Dday,当一个用户在我们的网站上注册时,我想给他们发一封电子邮件,让他们能够自动更新他们的日历和他们注册的课程。在大多数情况下,这将是多天/多个事件 作为测试,我使用DDay.ical创建一个多事件请求。然而,Outlook或iPhone mail应用程序似乎都没有注意到ical附件中的第二个事件 我知道iCal标准支持多个事件。这并不意味着所有客户都支持这种场景。其他客户端是否支持多事件ical请求 我不认为我在代码中做了任何错误,但我将发布我的代码片段以确保:

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

作为测试,我使用DDay.ical创建一个多事件请求。然而,Outlook或iPhone mail应用程序似乎都没有注意到ical附件中的第二个事件

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

                    }

                }
//创建事件部分。
iCalendar iCal1=新iCalendar();
iCal1.AddLocalTimeZone();
iCal1.Method=“请求”;
Event evt1=iCal1.Create();
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”;
//添加约会的收件人。
与会者att1=新与会者(“邮件收件人:+”me@MyDomain.com");
att1.RSVP=假;
att1.CommonName=“我是琼斯”;
evt1.与会者.添加(附件1);
Event evt2=iCal1.Create();
evt2.Start=new-iCalDateTime(new-DateTime(2014,8,11,12,30,00,DateTimeKind.Local));
evt2.End=evt1.Start.ADDMINES(30);
evt2.IsAllDay=false;
evt2.Summary=string.Format(“Lesson-{0}”,evt2.Start.ToString(“MM/dd”);
evt2.Location=“AnyTown”;
//添加约会的收件人。
与会者att2=新与会者(“邮件收件人:+”me@MyDomain.com");
att2.RSVP=false;
att2.CommonName=“我是琼斯”;
evt2.与会者.添加(附件2);
iCalendarSerializer serializer1=新的iCalendarSerializer();
字符串t=serializer1.SerializeToString(iCal1);
Byte[]bytes=System.Text.Encoding.ASCII.GetBytes(t);
使用(var ms=new System.IO.MemoryStream(字节))
{
使用(var a=new System.Net.Mail.Attachment(ms,“meeting.ics”,“text/calendar”)//从磁盘加载或使用绑定到字符串字节的MemoryStream
{
a、 ContentDisposition.Inline=true;//标记为Inline
msg.Attachments.Add(a);//将其添加到邮件中
邮件发送(msg);
}
}

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

要处理包含多个事件的Icalendar附件,例如在Outlook中,您需要将附件保存到磁盘,导航到该附件并将其打开。然后它会作为一个单独的日历打开,您需要将事件一个接一个地拖到您的日历中。噩梦。这几乎不值得费心去发展

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