2013-02-26 117 views
11

我试图通过使用iCalendar标准在我的Microsoft Outlook日历中创建一个事件。我从.NET应用程序向我的Exchange邮箱发送了一封内容类型为“text/calendar”的电子邮件。 它作为会议请求到达Outlook。一切看起来不错,直到我单击收到的会议请求时,Outlook将其显示为一个空的日历视图,其文本为:“在日历”中找不到会议。 我不明白为什么 - 我想创建一个事件,它试图找到一些现有的?iCalendar不为组织者创建事件

如果我把一模一样的电子邮件给任何人,除了主办会议的参与者,它会在他们的日历事件,一切似乎是确定。 我发现它是由“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:[email protected] 
UID:[email protected] 
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN="John Smith" 
;X-NUM-GUESTS=0:mailto:[email protected] 
CLASS:PUBLIC 
CREATED:20130225T143039Z 
DESCRIPTION: 
LAST-MODIFIED:20130225T143039Z 
LOCATION: 
SEQUENCE:0 
STATUS:CONFIRMED 
SUMMARY:Booking test 
TRANSP:OPAQUE 
END:VEVENT 
END:VCALENDAR 
+0

我遇到同样的问题,我尝试向组织者发送邀请(A)没有“组织者”,事件被添加,然后我发送了另一个“请求”,包括所有“参加者”(B&C),并且这次将“组织者”设置为A,在这种情况下,B&C将事件正确地进行,但对于AI会得到“对不起!组织者是不允许的。“因此组织者无法查看与会者,有什么想法? – Asgaroth 2013-07-14 20:54:24

+0

昨天我添加了新的答案,请检查一下,看看是否有帮助 – gregjer 2013-07-17 07:40:01

回答

14

比方说,组织者希望创建一个满足为2名与会者。他在预订系统中填写表单。 预订系统向他自己和2位与会者发送包含iCalendar标准的电子邮件。

此方案不起作用。

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

如果你问一下微软的支持,他们只是告诉你,他们不支持开放标准:http://support.microsoft.com/kb/2269506

合作解决这个问题是使用平台服务(Exchange Web ServicesGoogle Calendar API)创建的一个事件组织者的日历。忘记iCalendar标准。 这些服务可以配置为自动向与会者发送通知。 因此,它是足以通过“SendInvitationsMode.SendToAllAndSaveCopy”如果你使用EWS:

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("[email protected]"); 
appointment.RequiredAttendees.Add("[email protected]"); 
appointment.OptionalAttendees.Add("[email protected]"); 
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy); 

或将“sendNotifications”参数设置为true在谷歌日历API的情况下。

您不需要发送电子邮件给每个特定的与会者。

+0

感谢您的回答,我担心iCalendar只会交换关于已经存在的事件的信息,所以iCalendar不起作用,正如您所说的,如果使用API​​直接处理.ics文件不是必要的,谢谢您的答案,我会给你赏金,但我不能选择你的答案,因为它不是我的问题。 – Asgaroth 2013-07-17 13:34:20

+0

我正面临ical.net的问题。使用ical.net在我的.Net应用程序中创建一个日历ics。但是,在我的环境中,日历邮件看起来很好,具有接受或拒绝的能力。然而,在客户环境中,没有选择接受或取消该请求。这只在客户使用Outlook 2010和Outlook 2016时才会发生。然而,在我们的环境中,我们看到Outlook 2010和2016的日历电子邮件都很好。任何帮助将不胜感激!谢谢 – k2ibegin 2017-07-31 12:04:43

0

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

一切都表示,不知道怎么去解决这个问题。

0

事件邀请的行为通过电子邮件被发送在rfc6047这进一步扩展了的iCalendar RFC(RFC5545)进行说明。

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

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

恶搞@ XYZ .example.net不允许修改或取消由[email protected]组织的会议。

到您的情况: 1.你发送同一个电子邮件地址作为交换的邀请(谈论的邮件不是Organizer:mailtoFrom:如果没有它可能是值得尝试通过发送它?交换地址 2.上述内容不适用,为了满足组织者在其日历中收到邀请的需要,您可能需要将其以编程方式添加到组织者的日程中,因为它很可能是CUA(日历用户代理)或交易所不允许第三方邮件到议程中添加事件,而最终用户UI的使用。

+0

感谢您的帮助,邀请函中使用的电子邮件地址与交换相同,因此问题仍然存在,我们现在尝试MS支持以获取一些提示。 – gregjer 2013-02-27 11:57:38

12

这是一个老问题,但我认为这是由于使用 方法:请求 这标志着应更新,而不是它是一个新的项目。相反,使用 方法:发布

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

+0

作为会议组织者,我在Outlook中得到“您还没有发送此会议​​邀请”,我必须从Outlook发送它。 – bradvido 2014-06-05 17:43:36

+1

方法:即使我是会议组织者,PUBLISH也为我修好了。 – 2014-08-14 21:50:30

+0

@Bart感谢切换到现在发布显示打开'.ics'文件后的“保存按钮”,不再显示“在日历中找不到会议” – 2014-08-15 18:30:45

0

在最近几个月里,我们的服务也满足同样的问题,因为你: 我们的服务创造的组织者和与会者会议日历, 如果与会者包括组织者,组织者(作为atteendee)可以得到一个日历电子邮件, 但不允许接收/拒绝会议(该按钮被禁用),也不允许在日历中看到它(没有日历事件)。

最后,我注意到,仅当以下的条件下会出现这种情况: 1. mail.From =组织者 2. Ateendees.contains(组织者)//不区分大小写的。

所以,我简单地改变我的代码follwing,并为所有与会者正常工作(包括组织者):

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

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

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

的一个对自己应该有别的东西比你等下为ORGANSISER,例如主办单位:[email protected]

一来每个人应该有你的电子邮件跌组织者。

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

这种方式意味着您在日记中获得会议,并且您也会收到回复(要获得回复,您需要为每位与会者添加以下行: ATTENDEE; CN =“The Name”; RSVP = TRUE:mailto: [email protected]。)

请注意,UID对于这两个版本的文件都是相同的。如果组织者首先获得邀请,以便他们在开始获得回复之前接受它,则会有所帮助,否则人们将回复那些尚未有效的事情。这不会阻止他们接受邀请,但对于组织者来说可能有点混乱。为了解决这个问题,我在电子邮件1和2之间放了一段时间。