检测Office365 REST Mail API中的日历事件邮件项

时间:2014-10-20 19:50:48

标签: exchange-server office365

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

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

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

我可以查询关联消息ID的日历吗?我无法想象每一条消息都可以做到这一点。

谢谢!

编辑:@Venkat谢谢。邮件项目比紧急日历事件标准更具可处理性。作为Exchange开发人员,我不得不问 - 你真的需要一个例子,说明我如何更好地处理邮件绑定事件作为邮件项而不是日历事件项?好吧,这很酷,这里有一个:

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

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

Google包含附件。即使您从API邮件项中删除了事件项附件,我也不明白为什么必须删除eventId。通过邮件处理日历事件并不是什么新鲜事,但我们必须在这两个对象之间建立数据绑定。就是这样。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

我们目前正在进行设计工作,但我们没有准确的时间表来分享。但是,只要我们有这个API,我们就会更新我们的文档。

[更新]我们现在将日历事件邀请和响应作为MessageMes​​sage返回,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>')"
}

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

谢谢,

Venkat

相关问题