我正在创建ASP.NET MVC5应用程序。一个功能是发送带有活动邀请的电子邮件。在Gmail客户端中,此类生成的电子邮件可正但是在outlook.com中,即使电子邮件具有正确的按钮 - 接受/暂定/拒绝 - 点击它们也不会将其同步到日历本身。
我从这里获得了一些灵感:
StackOverflow Q1
StackOverflow Q2
StackOverflow Q3
这是我目前的实施:
我正在使用DDay.ical库来创建事件:
IICalendar iCal = new iCalendar();
iCal.Version = "2.0";
iCal.Method = "REQUEST";
iCal.ProductID = "my@product.com";
Event evt = iCal.Create<Event>();
evt.UID = Guid.NewGuid().ToString();
evt.Class = "PUBLIC";
evt.Created = new iCalDateTime(DateTime.Now);
evt.DTStamp = new iCalDateTime(DateTime.Now);
evt.Start = new iCalDateTime(DateTime.Now.AddHours(2));
evt.End = new iCalDateTime(DateTime.Now.AddHours(4));
evt.Location = "Party room";
evt.Description = "Awesome party";
evt.Summary = "Lets get wasted";
evt.Priority = 5;
evt.Transparency = TransparencyType.Transparent;
string res = new iCalendarSerializer().SerializeToString(iCal);
return res;
我将此活动打包成电子邮件作为替代视图:
MailMessage email = new MailMessage();
email.To.Add(addressesToJoined);
email.Subject = Party;
email.Body = "";
if (!String.IsNullOrEmpty(calendarEvent))
{
System.Net.Mime.ContentType calendarType = new System.Net.Mime.ContentType("text/calendar");
calendarType.Parameters.Add("method", "REQUEST");
AlternateView ICSview = AlternateView.CreateAlternateViewFromString(calendarEvent, calendarType);
email.AlternateViews.Add(ICSview);
}
这是.ics本身:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REQUEST
PRODID:my@product.com
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20151115T152442
DESCRIPTION:Awesome party
DTEND:20151115T192442
DTSTAMP:20151115T142442Z
DTSTART:20151115T172442
LOCATION:Party room
PRIORITY:5
SEQUENCE:0
SUMMARY:Lets get wasted
TRANSP:Transparent
UID:1735cdca-cb36-4e6b-a1ec-4fb4149f798a
END:VEVENT
END:VCALENDAR
当此电子邮件发送到Gmail客户端时,我可以正确地看到邀请,并选择将事件添加到日历中,这可以正常工作。
但是在outlook.com中,即使电子邮件本身被正确识别为邀请,我也可以看到接受/暂定/拒绝按钮,但它不能按预期工作。当我点击例如接受选项时,会创建新的回复电子邮件,当我将其发送出去时,我希望,该事件将在我的日历中设置,但是没有事件同步。
有人可以在outlook.com中查看为什么事件未在日历中同步? 此外,outlook.com是否有可能只在日历中设置活动而不发送回复电子邮件? - 系统自动生成邀请,无需回复。
由于
答案 0 :(得分:1)
最后我找到了一个解决方案 - 在.ics中缺少VEVENT部分的ORGANIZER参数。 Gmail可以处理,Outlook.com不能。所以诀窍是在设置DDay.iCal.Event对象时添加以下行:
evt.Organizer = new Organizer("organizer@mail.com");
所有其他内容都保持不变,因此在Gmail和Outlook.com中同时适用的.ics的最终外观是这样的:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REQUEST
PRODID:my@product.com
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20151115T152442
DESCRIPTION:Awesome party
DTEND:20151115T192442
DTSTAMP:20151115T142442Z
DTSTART:20151115T172442
LOCATION:Party room
ORGANIZER:mailto:organizer@email.com
PRIORITY:5
SEQUENCE:0
SUMMARY:Lets get wasted
TRANSP:Transparent
UID:1735cdca-cb36-4e6b-a1ec-4fb4149f798a
END:VEVENT
END:VCALENDAR
现在工作正常。