1

我正在创建 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 中是否有可能只在日历中设置事件,而不发送回复电子邮件?- 邀请是系统自动生成的,无需响应。

谢谢

4

1 回答 1

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

现在它工作正常。

于 2015-11-15T18:22:08.543 回答