【问题标题】:Detecting calendar-event mail items in Office365 REST Mail API在 Office365 REST Mail API 中检测日历事件邮件项目
【发布时间】:2014-10-20 19:50:47
【问题描述】:

我正在通过 REST 请求和 ADAL 库从我们的 Exchange Online 服务器成功检索用户电子邮件。我们一直在检索和处理由 Outlook、GMail/Google-Calendar、iPad、iPhone 和 Android 设备生成的日历事件电子邮件及其相关的日历事件。

我们一直在 ClassName 属性中查找“meeting.request”或“meeting.cancelled”,但这些值在一周前被删除并且没有返回。我们现在一直在寻找非 Null MeetingMessageType 属性(MeetingRequest 或 MeetingCancelled),但截至今天,这些属性也已被删除。这是非常有价值的互操作数据,但我不知道下一步该往哪里看。

如何将检索到的来自用户邮箱或共享邮箱的 json Message 对象与(Exchange...)关联的日历事件相关联?我们可以使用消息项目处理会议创建、邀请、接受等,然后将其清除;然而,查询日历以获取新的和更新的事件要密集得多,因为我们当然不能在处理它们时将日历事件从日历中清除!

我可以在日历中查询相关的消息 ID 吗?我无法想象每条消息都可以这样做。

谢谢!

编辑:@Venkat 谢谢。邮件项目比新兴的日历事件标准更易于处理。作为一名 Exchange 开发人员,我不得不问 - 您是否真的需要一个示例来说明如何将邮件绑定事件作为邮件项目而不是日历事件项目更好地处理?好的,这很酷,这是一个:

我们正在做的一件事是 cc/bcc-ing 邮件/mtg-requests 到特定邮箱进行处理(或使用客户端和服务器规则来完成相同的事情)。然后,我们可以轮询单个邮箱、共享邮箱和/或邮箱集合是否自动响应......以及是否移动到特定日历,是否重定向到特定用户,以及在路由期间更改标题信息是否进行进一步的类别分类,甚至是否替换收件人/与会者等等。要对 REST 日历请求做同样的事情,我们将失去所有服务器规则自动化、所有客户端规则自动化、程序自动响应等等标头操作(数据插入/提取)等。我们只是尝试将事件推送到云应用程序,对于某些用户集合,使用重定向到特定守护进程帐户的共享邮箱,这些守护进程帐户为我们的特定用户子集保存日历/客户。

与其他所有人一样,我们正在尝试与云应用集成。因此,我们需要邮件和日历项目的程序解析、数据操作和推送。因此,一方面,我们拥有服务器邮件处理规则、客户端/用户邮件规则、邮件头修改(简单的项目数据修改)、邮件自动回复控制和盲收件人的巨大优势。日历事件没有得到任何这些东西。其次,我们拥有比日历分类(几乎不存在)更强大的邮件文件夹分类。第三件事是,日历事件邮件项目是用户特定的,并且比共享日历事件具有更少的持久价值。最后,如果我们以任何方式处理邮件项目——为什么不至少为事件设置一个 eventId 呢?为什么要取出所有互操作信息?拥有 eventId 完全消除了对返回多个项目的日历端点进行查询的需要,并且不添加针对邮件端点的附加查询。

Google 包含一个附加的 ics。即使您从 API 邮件项中删除事件项附件,我也不明白为什么必须删除 eventId。通过邮件处理日历事件并不是什么新鲜事,但我们必须在两个对象之间进行数据绑定才能做到这一点。就是这样。

我的 Exchange Server 仍然知道邮件项目何时是日历事件。如果我通过 REST 询问它,它就不会再告诉我了。因此,作为一种粗暴的解决方法,我可以设置一个邮件规则,为所有“会议请求”类型的传入消息添加一个“api_calendarEvent”类别。然后,在对邮件项进行 REST 调用后,我可以解析类别以手动重新填充类属性。但是为什么要从邮件项中完全删除附件、类名、MeetingMessageType 和 EventId?即使我制定了服务器规则将某些邮箱中的某些邮件项目重新分类为日历事件,并且能够知道何时轮询日历以获取事件详细信息——我是否总是知道要轮询哪个日历以找到该事件?我们只需要保留 EventId 和/或 ClassName 即可避免跨多个日历进行盲目轮询。然后,我们还将再次大规模自动化日历处理,目前已从 API 中删除。

谢谢!

【问题讨论】:

  • 嗨Valleyspirit,您能否根据邀请和会议响应邮件进一步解释一下您所做的处理?您是否为每个用户保留任何状态?您说查询日历以获取新的和更新的事件要密集得多。你能详细说明一下吗?了解此信息将帮助我推荐使用 Office 365 REST API 的正确方法。谢谢。
  • @VenkatAyyadevara-MSFT -- 我已经为你编辑了我的问题。谢谢。
  • 嗨 Valleyspirit,我回复了,但还有一个问题。如果您能够通过独立于 Me/Messages 集合的 Me/MeetingMessages 集合获取所有会议邀请和响应消息,那会满足您的场景吗?还是会议相关消息与所有其他消息一起出现在 Me/Folders/Inbox/Messages 源中对您的方案很重要?如果我的问题不清楚或者您需要更多上下文,请告诉我。谢谢。

标签: exchange-server office365


【解决方案1】:

感谢您对我的评论的详细回复!您的方案是我们希望支持的。作为架构清理的一部分,我们从消息中删除了事件 ID 和会议消息类型,因为它包含在每条消息中。对于日历邀请和回复,我们计划重新添加 2 个属性: 1. 相关事件的导航链接,如果您有日历权限,您可以单击该事件并对其执行操作。 2. 日历响应类型,例如会议已接受、会议已拒绝等,因此您知道收到的页面类型。

我们目前正在进行设计,但没有确切的时间表可以分享。但是,一旦有了这个 API,我们就会更新我们的文档。

[更新] 我们现在将日历事件邀请和响应返回为 EventMessage,它是 Message 的子类。该实体包括一个名为 MeetingMessageType 的属性和一个指向用户日历上相应事件的导航链接。请参阅下面的示例:

{
  @odata.context: "https://outlook.office365.com/api/v1.0/$metadata#Users('<snipped>')/Messages/$entity",
  @odata.type: "#Microsoft.OutlookServices.EventMessage",
  @odata.id: "https://outlook.office365.com/api/v1.0/Users('<snipped>')/Messages('<snipped>')",
  @odata.etag: "<snipped>",
  Id: "<snipped>",
  ChangeKey: "<snipped>",
  Categories: [ ],
  DateTimeCreated: "2015-04-08T14:37:55Z",
  DateTimeLastModified: "2015-04-08T14:37:55Z",
  Subject: "<snipped>",
  BodyPreview: "",
  Body: {
    ContentType: "HTML",
    Content: "<snipped>"
  },
  Importance: "Normal",
  HasAttachments: false,
  ParentFolderId: "<snipped>",
  From: {
    EmailAddress: {
      Address: "<snipped>",
      Name: "<snipped>"
    }
  },
  Sender: {
    EmailAddress: {
      Address: "<snipped>",
      Name: "<snipped>"
    }
  },
  ToRecipients: [{
    EmailAddress: {
      Address: "<snipped>",
      Name: "<snipped>"
    }
  }],
  CcRecipients: [ ],
  BccRecipients: [ ],
  ReplyTo: [ ],       
  ConversationId: "<snipped>",
  DateTimeReceived: "2015-04-08T14:37:55Z",
  DateTimeSent: "2015-04-08T14:37:48Z",
  IsDeliveryReceiptRequested: null,
  IsReadReceiptRequested: false,
  IsDraft: false,
  IsRead: false,
  WebLink: "<snipped>",
  MeetingMessageType: "MeetingRequest",
  Event@odata.navigationLink: "https://outlook.office365.com/api/v1.0/Users('<snipped>')/Events('<snipped>')"
}

如果我们提出的更改符合您的要求,如果您有任何问题或需要更多信息,请告诉我。

谢谢,

文卡特

【讨论】:

  • 谢谢!是的,太棒了。这将为我们几乎所有的项目范围返回功能。我的主要问题是 ipad/iphone/android 平板电脑/android 手机/gmail 日历/MS Outlook 的所有日历电子邮件,无论是创建/更新/删除,都可以使用以下消息属性进行处理:ClassName、EventId 和 MeetingMessageType。当所有这三个都被删除时,我们的项目就进入了休眠状态。您将重新放入的任何互操作数据都将非常棒。我每天都在关注改进文档,请传递这些需求。谢谢!
  • Re: /Me/MeetingMessages 集合:是的,这也是完全合理的,前提是这些消息包含一些类似于日历响应类型和导航链接的数据。谢谢,端点不是太关键,我忘了回复这个。
  • 嗨 valleyspirit,感谢您的反馈!很抱歉延迟回复。我们正在努力以您可以使用的某种形式公开这些信息。敬请期待...
  • 更新信息,支持 EventMessage。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多