iCalendar不会为组织者创建活动

我正在尝试使用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 

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

此方案不起作用。

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

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

此问题的解决方案是使用平台服务( Exchange Web服务或Google 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 Calendar API的情况下将“ sendNotifications ”参数设置为true。

您无需向每位特定与会者发送电子邮件。

这是一个旧问题,但我认为它是由使用METHOD引起的:REQUEST这标志着应该更新ical,而不是它是一个新项目。 相反,使用METHOD:PUBLISH

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

这让我生气了一个星期,所以很高兴看到其他人确认我怀疑的东西。 实际上有一个相对简单的解决方案,它解决了这个问题,虽然它不是很优雅。 我可以理解为什么不允许人们从外部来源担任组织者的角色,但是你不能这样做很烦人。

发出2个邀请。 一个给自己(或组织者是谁),然后与其他人不同。

作为ORGANSISER,你自己应该拥有除了你以外的其他东西,例如ORGANIZER:donotreply@outlook.com

其他人应该将您的电子邮件作为组织者。

要使这种方法起作用,您应该设置METHOD:REQUEST。 如果将其设置为PUBLISH,您将获得有关更新的重复项。

这种方法意味着您可以在日记中获得会议并获得回复(要获得回复,您需要为每位与会者提供以下行:ATTENDEE; CN =“The Name”; RSVP = TRUE:mailto:the_email@address.com 。)

请注意,该文件的两个版本的UID都相同。 如果ORGANIZER首先获得Invite以便他们在开始获得回复之前接受它,那么它会有所帮助,否则人们将会回复有效尚未存在的内容。 这不会阻止他们接受邀请,但对于ORGANIZER来说可能有点混乱。 为了解决这个问题,我在电子邮件1和2之间稍有延迟。

我认为你的问题是因为Exchange假定事件的组织者也是事件的发起者。 这看起来很公平,否则将会议发送给让他们成为组织者的人将会自动添加到人的日历中。

所有这一切,不知道如何解决这个问题。

rfc6047中描述了通过电子邮件发送事件邀请的行为,它进一步扩展了icalendar RFC(RFC5545)。

关于安全性的第2节和第3节总结了两个欺骗性威胁:

欺骗“组织者”,欺骗“参加者”

那是

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

对于您的情况:1。您是否从与您的交换机相同的电子邮件地址发送邀请(谈论From:在邮件中而非Organizer:mailto ?如果不是,可能值得尝试通过交换地址发送.2如果以上不起作用,为了满足组织者在其日程表中收到邀请的需要,您可能需要以编程方式将其添加到组织者的日程中,因为CUA(日历用户代理)或Exchange可能不允许第三方邮件程序在议程中添加事件而无需最终用户UI使用。

在最近几个月,我们的服务也遇到了与您相同的问题:我们的服务为组织者和与会者创建会议日历,如果与会者包含组织者,组织者(作为代理人)可以获得日历电子邮件,但它不允许接收/拒绝会议(按钮被禁用),也不会在日历中看到它(没有日历事件)。

最后,我注意到只有在以下情况下才会发生这种情况:1。mail.From =组织者2. Ateendees.contains(组织者)//不区分大小写。

所以,我只是将我的代码更改为以下内容,并且它适用于所有与会者(包括组织者):

 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; }