iCalendar不会为组织者创建活动

时间:2013-02-26 08:08:37

标签: c# .net outlook 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

6 个答案:

答案 0 :(得分:18)

假设组织者想要为2位与会者创建一个会议。他在预订系统中填写了一份表格。 预订系统向他自己和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 Calendar API中将“ sendNotifications ”参数设置为true。

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

答案 1 :(得分:17)

这是一个老问题,但我认为它是由使用造成的     方法:REQUEST 这标志着应该更新ical,而不是它是一个新项目。相反,使用     方法:PUBLISH

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

答案 2 :(得分:3)

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

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

对于你自己应该拥有除了你以外的其他东西,如ORGANSISER,例如组织者:donotreply@outlook.com

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

要使用此方法,您应该设置METHOD:REQUEST。如果将其设置为PUBLISH,则会在更新时获得重复项。

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

section 2section 3关于安全性,总结了两个欺骗性威胁:

  

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

  

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

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

答案 5 :(得分:0)

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

最后,我注意到只有在以下情况下才会发生这种情况: 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;
}
相关问题