【问题标题】:iCalendar does not create an event for organizeriCalendar 不会为组织者创建活动
【发布时间】:2013-02-11 14:46:51
【问题描述】:

我正在尝试使用 iCalendar 标准在我的 Microsoft Outlook 日历中创建一个事件。我已经从 .NET 应用程序向我的 Exchange 邮箱发送了一封内容类型为“文本/日历”的电子邮件。 它作为会议请求到达 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

【问题讨论】:

  • 我遇到了同样的问题,我尝试向没有“ORGANIZER”的组织者 (A) 发送邀请,该活动被添加,然后我发送另一个“REQUEST”,包括所有“ATTENDEE” "s (B & C) 并且这次将 "ORGANIZER" 设置为 A,在这种情况下,B & C 得到了正确的事件,但是对于 AI 得到 "Sorry! Change the Organizer is not allowed."结果组织者无法查看与会者,有什么想法吗?
  • 我昨天添加了新答案,请检查一下,看看是否对您有帮助

标签: c# .net outlook icalendar


【解决方案1】:

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

说了这么多,不知道如何解决这个问题。

【讨论】:

    【解决方案2】:

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

    section 2section 3 在安全方面总结了两种欺骗威胁:

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

    那是

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

    你的情况:

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

    【讨论】:

    • 感谢您的帮助,邀请中使用的电子邮件地址与exchange相同,因此问题仍然存在,我们现在正在尝试MS支持以获得一些提示。
    【解决方案3】:

    假设组织者想要为 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。

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

    【讨论】:

    • 感谢您的回答,我担心,iCalendar 仅用于交换有关已存在事件的信息,因此单独使用 iCalendar 不起作用,并且如您所说,如果直接使用 API 处理 .ics 文件没必要,谢谢你的回答,我会给你赏金,但我不能选择你的答案,因为这不是我的问题。
    • 我正面临 ical.net 的问题。使用 ical.net 在我的 .Net 应用程序中创建日历 ics。但是,在我的环境中,日历电子邮件看起来不错,可以接受或拒绝。然而,在客户环境中,没有接受或取消此请求的选项。这只发生在 Outlook 2010 和 Outlook 2016 的客户身上。但是,在我们的环境中,我们在 Outlook 2010 和 2016 上看到日历电子邮件很好。任何帮助将不胜感激!谢谢
    • 嗨@kuldeep,你试过stu的(to get replies you need to include the following line for each attendee: ATTENDEE;CN="The Name";RSVP=TRUE:mailto:the_email@address.com.) stackoverflow.com/a/39535174/3634867的答案吗?
    【解决方案4】:

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

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

    【讨论】:

    • 作为会议组织者,我在 Outlook 中收到“您尚未发送此会议​​邀请”,我必须从 Outlook 发送。
    • METHOD:PUBLISH 为我修复了它,即使我是会议组织者。
    • @Bart 感谢切换到发布现在在打开 .ics 文件后显示“保存按钮”并且不再显示“在日历中找不到会议”
    【解决方案5】:

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

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

    所以,我只需将我的代码更改为 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;
    }
    

    【讨论】:

      【解决方案6】:

      这让我发疯了一个星期,所以很高兴看到其他人证实了我的怀疑。其实有一个比较简单的方案,解决了这个问题,虽然不是很优雅。我可以理解为什么不允许从外部来源担任组织者的角色,但令人讨厌的是你不能。

      发出 2 个邀请。一个给自己(或任何组织者),然后另一个给其他人。

      你自己应该有别的东西,而不是你作为组织者,例如。组织者:donotreply@outlook.com

      作为组织者,其他所有人都应该将您的电子邮件记下来。

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

      这种方法意味着您可以将会议记录在日记中,并且还会收到回复(要获得回复,您需要为每位与会者添加以下行: ATTENDEE;CN="The Name";RSVP=TRUE:mailto:the_email@address.com.)

      请注意,两个版本的文件的 UID 相同。如果组织者首先获得邀请,这样他们就可以在开始收到回复之前接受它,这会有所帮助,否则人们将回复实际上尚不存在的内容。这不会阻止他们接受邀请,但对于组织者来说可能有点混乱。为了解决这个问题,我在电子邮件 1 和 2 之间稍作延迟。

      【讨论】:

      • 如何为与会者添加多个组织者?
      猜你喜欢
      • 2013-08-23
      • 2023-04-03
      • 2018-08-14
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2020-07-09
      相关资源
      最近更新 更多