iCalendar无法为组织者创建事件。

22
我正在尝试使用iCalendar标准在我的Microsoft Outlook日历中创建事件。我从.NET应用程序向我的Exchange邮箱发送了内容类型为“text/calendar”的电子邮件。它以会议邀请的形式到达Outlook。一切看起来都很好,直到我单击收到的会议请求时,Outlook将其显示为空日历视图,并显示文本:“在日历中找不到会议”。我不明白为什么 - 我想创建一个事件,它却试图查找某些现有的事件?
如果我将完全相同的电子邮件发送给除组织者之外的任何参与者,它将在他们的日历中创建一个事件,一切似乎都没问题。我发现这是由“ORGANIZER”属性引起的。如果将其设置为组织者的电子邮件(我的电子邮件)并向自己发送会议请求,则不会创建事件,并显示“在日历中找不到会议”的信息。
因此,问题是为什么它不为组织者创建事件?组织者必须创建该事件,以便在其他参与者接受或取消会议时得到通知。
以下是iCalendar:
BEGIN:VCALENDAR
PRODID:-//Company//Product 3.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20130225T200000Z
DTEND:20130225T203000Z
DTSTAMP:20130225T143039Z
ORGANIZER;CN="John Doe":mailto:john.doe@domain.com
UID:20130225T143039Z@domain.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN="John Smith"
 ;X-NUM-GUESTS=0:mailto:john.smith@domain.com
CLASS:PUBLIC
CREATED:20130225T143039Z
DESCRIPTION:
LAST-MODIFIED:20130225T143039Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Booking test
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

我遇到了同样的问题,我尝试向组织者(A)发送一个没有“ORGANIZER”的邀请,活动被添加了,然后我再发送另一个“REQUEST”,包括所有的“ATTENDEE”(B和C),这次将“ORGANIZER”设置为A,在这种情况下,B和C可以正确地收到活动,但是对于A,我得到了“抱歉!不允许更改组织者。”的结果,因此组织者无法查看与会者,有什么想法吗? - Asgaroth
我昨天添加了新的答案,请检查一下,看看是否有帮助。 - gregjer
6个回答

23

假设组织者想为2位参会者创建一个会议,他在预订系统中填写表单。预订系统向他自己和两位参会者发送包含iCalendar标准的电子邮件。

这种情况不起作用。

无法在组织者的日历中创建事件(可取消的会议对象)。客户端认为包含iCalendar格式的电子邮件只是会议参与者已在组织者日历中创建的通知。如果此类电子邮件到达组织者的邮箱,则客户端应用程序不会在组织者的日历中创建事件。它假定由组织者自己创建了事件。例如:Outlook 在这种情况下告诉您“在日历中找不到会议”。

如果您向Microsoft支持部门询问此事,他们只会告诉您他们不支持开放标准:http://support.microsoft.com/kb/2269506

解决此问题的有效方法是使用平台服务(Exchange Web ServicesGoogle Calendar API)在组织者的日历中创建事件。忘记 iCalendar 标准。这些服务可以配置为自动向参会者发送通知。因此,如果您正在使用 EWS,则只需传递“SendInvitationsMode.SendToAllAndSaveCopy”即可:

Appointment appointment = new Appointment(service);
appointment.Subject = "Status Meeting";
appointment.Body = "The purpose of this meeting is to discuss status.";
appointment.Start = new DateTime(2014, 3, 1, 9, 0, 0);
appointment.End = appointment.Start.AddHours(2);
appointment.Location = "Conf Room";
appointment.RequiredAttendees.Add("user1@contoso.com");
appointment.RequiredAttendees.Add("user2@contoso.com");
appointment.OptionalAttendees.Add("user3@contoso.com");  
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);

如果使用Google日历API,您可以将“sendNotifications”参数设置为true。

您不需要向每个参与者发送电子邮件。


感谢您的回答,我担心 iCalendar 只是用于交换关于已经存在的事件的信息,因此仅使用 iCalendar 是不够的。正如您所说,如果使用 API 处理 .ics 文件,则不需要直接处理它们。感谢您的回答,我会给您奖励,但我不能选择您的答案,因为这不是我的问题。 - Asgaroth
我在使用ical.net时遇到了问题。我正在使用ical.net在我的.Net应用程序中创建一个日历ics。然而,在我的环境中,日历电子邮件看起来很好,具有接受或拒绝的能力。但是,在客户的环境中,没有出现接受或取消此请求的选项。这仅发生在客户的outlook 2010和outlook 2016上。然而,在我们的环境中,我们在outlook 2010和2016上看到日历电子邮件非常好。任何帮助将不胜感激!谢谢 - kuldeep
嗨@kuldeep,你试过stu的答案吗?(要获得回复,您需要为每个参与者包括以下行:ATTENDEE;CN="The Name";RSVP=TRUE:mailto:the_email@address.com.)https://dev59.com/JmUp5IYBdhLWcg3wvZZV#39535174? - John Jang

20

这是一个有点老旧的问题,但我认为它是由于使用 METHOD:REQUEST 导致的。这标志着ical应该被更新,而不是新项目。相反,请使用 METHOD:PUBLISH。

我可以确认这适用于 DDay.iCal 和 Outlook 日历。


作为会议组织者,在Outlook中我收到了“您尚未发送此会议邀请”的提示,因此我必须从Outlook中发送它。 - bradvido
1
METHOD:PUBLISH 对我很有帮助,即使我是会议组织者。 - Oran Dennison
@Bart,感谢您现在切换到发布后,在打开“.ics”文件后显示“保存按钮”,不再显示“在日历中找不到会议”。 - Chris Marisic
我可以确认,它与“PUBLISH”一起使用,我正在使用ICal.Net。 - Markus Doerig

3
这让我疯了一个星期,所以很高兴看到有人确认了我怀疑的事情。实际上有一个相对简单的解决方案,可以解决这个问题,尽管不太优美。我可以理解为什么不能从外部来源扮演组织者角色,但很讨厌你不能这样做。
发送两个邀请。一个发给自己(或组织者),另一个发给其他所有人。
给自己发邮件时,应该将除你之外的其他人作为ORGANIZER,例如:ORGANIZER:donotreply@outlook.com。
给其他人发邮件时,应将你的电子邮件地址作为组织者。
为了使这种方法有效,你应该设置METHOD:REQUEST。如果将其设置为PUBLISH,则会在更新时得到重复。
这种方法意味着你可以在日历中安排会议,并收到回复(要得到回复,需要为每个参与者包括以下行:ATTENDEE; CN="The Name"; RSVP=TRUE:mailto:the_email@address.com.)。
请注意,两个文件版本的UID是相同的。如果组织者先收到邀请,他们可以在开始收到回复之前接受它,否则人们将回复一个实际上不存在的东西。这并不会阻止他们接受邀请,但可能会对组织者有点困惑。为了帮助这一点,我在电子邮件1和2之间设置了一个轻微的延迟。

你如何为参与者添加多个组织者? - John

0
在最近几个月中,我们的服务也遇到了与您相同的问题: 我们的服务为组织者和参与者创建会议日历, 如果参与者包含组织者,则组织者(作为参与者)可以收到日历电子邮件, 但是他既不能接受/拒绝会议(按钮被禁用),也无法在日历中看到它(没有日历事件)。
最后,我注意到只有在以下情况下才会发生这种情况: 1. mail.From = organizer 2. Attendees.contains(organizer) //不区分大小写。
因此,我简单地将我的代码更改为以下内容,并且对于所有参与者(包括组织者)都可以正常工作:
if (!attendeeEmail.ToLower().Contains(organizer.Address.ToLower()))
{
    message.From = organizer;
}
else
{
    //such as your actual email sender, in our case, our mail sender use another email,
    //say ActualSender,and if leave empty, then our mail sender will fill as:
    message.From = ActualSenderEmail;
}

0
我会假设你的问题是因为Exchange认为活动组织者也是活动创始人。这似乎很公平,否则向其他人发送会议并将他们作为组织者添加到该人的日历将变得轻而易举。
话虽如此,我不知道如何解决这个问题。

0

通过电子邮件发送事件邀请的行为在RFC6047中进行了描述,该文进一步扩展了iCalendar RFC(RFC5545)。

第2节第3节关于安全性,总结了两种欺骗威胁:

欺骗“组织者”和欺骗“与会者”

也就是说

spoof@xyz.example.net不被允许修改或取消由a@example.com组织的会议。

对于您的情况:

  1. 请问你发送邀请时,使用的是与你的Exchange相同的电子邮件地址(指邮件中的发件人:而非组织者:mailto)?如果不是,建议尝试使用Exchange地址发送。
  2. 如果上述方法不行,为了让组织者在其日历中接收到邀请,你可能需要通过编程的方式将其添加到组织者的日程表中。因为很可能CUA(日历用户代理)或Exchange不允许第三方邮件程序在没有最终用户UI使用的情况下添加日程。

感谢您的帮助,邀请中使用的电子邮件地址与Exchange相同,因此问题仍然存在,我们现在正在尝试联系微软支持以获取一些提示。 - gregjer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接