Microsoft Graph可以过滤掉垃圾邮件吗?

时间:2017-10-09 16:18:43

标签: microsoft-graph

我在Microsoft Graph Explorer中使用var Base64: String; Strm: TIdMemoryBufferStream; Binary: AnsiString; begin Base64 := ...; // encoded data SetLength(Binary, (Length(Base64) div 4) * 3); Strm := TIdMemoryBufferStream.Create(PAnsiChar(Binary), Length(Binary)); try TIdDecoderMIME.DecodeStream(Base64, Strm); SetLength(Binary, Strm.Size); SetCodePage(PRawByteString(@Binary)^, 28591, False); finally Strm.Free; end; // use Binary as needed... end; 来返回未读电子邮件的列表。我的目标是在我的网站上有一个简单的HUD,向任何登录用户显示他们在Outlook中等待他们的未读消息的数量。

问题是除了我的合法未读电子邮件之外,还会返回我的垃圾邮件文件夹中的所有未读电子邮件。我想过滤掉垃圾邮件,但图表并没有为我提供一种系统地为所有用户完成此操作的方法。

所有电子邮件都有https://graph.microsoft.com/v1.0/me/messages?$filter=isRead eq false,图表说我的垃圾邮件文件夹中的电子邮件有parentFolderID。这意味着我可以过滤掉自己的垃圾邮件,但这对我的其他用户没有帮助,因为他们每个用户的垃圾邮件都会有一个唯一的"parentFolderId": "AQMkAGFjOGFkNWM2LTcxMjQtND..."

我可以为自己创建一个规则,将垃圾邮件标记为已读,但我不能指望我的用户做这样的事情。

有关如何为所有用户过滤垃圾邮件的任何想法?

3 个答案:

答案 0 :(得分:1)

我认为对图谱API的单一查询不会解决这个问题,但您可以通过一些逻辑进行多次调用来解决这个问题。

  1. 列出所有mailFolders

    https://graph.microsoft.com/v1.0/me/mailFolders

  2. 找到“垃圾邮件”文件夹

  3. var json = `
    {
        "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('48d31887-5fad-4d73-a9f5-3c356e68a038')/mailFolders",
        "value": [
            {
                "id": "AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OAAuAAAAAAAiQ8W967B7TKBjgx9rVEURAQAiIsqMbYjsT5e-T7KzowPTAAAAAAEkAAA=",
                "displayName": "Junk Email",
                "parentFolderId": "AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OAAuAAAAAAAiQ8W967B7TKBjgx9rVEURAQAiIsqMbYjsT5e-T7KzowPTAAAAAAEIAAA=",
                "childFolderCount": 0,
                "unreadItemCount": 0,
                "totalItemCount": 0
            }
        ]
    }`
    
    var obj = JSON.parse(json)
    
    for(var folder in obj.value)
    {
      if (obj.value[folder].displayName == 'Junk Email')
      {
        document.write(obj.value[folder].id)
        break
      }
    }

    1. 按照您的描述过滤掉该文件夹中的邮件,每个用户都是唯一的。

答案 1 :(得分:1)

为了从我的收件箱中获取未读邮件的数量,我最终使用了:

https://graph.microsoft.com/v1.0/me/mailFolders?$filter=displayName eq 'Inbox'

返回:

{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('ed313cf6-f369-45c6-94b2-48bbb3589788')/mailFolders", "value": [ { "id": "AAMkAGFjOGFkNWM2LTcxMjQtNDQ4My1iNjBlLTVhZmNiNTA3ZTcwNQAuAAAAAAAcAJPfHQ_aQputXsbIt-bZAQC5oqQhrW6CRI4cZpo9l5YaAA7BDDZpAAA=", "displayName": "Inbox", "parentFolderId": "AAMkAGFjOGFkNWM2LTcxMjQtNDQ4My1iNjBlLTVhZmNiNTA3ZTcwNQAuAAAAAAAcAJPfHQ_aQputXsbIt-bZAQC5oqQhrW6CRI4cZpo9l5YaAA7BDDZmAAA=", "childFolderCount": 14, "unreadItemCount": 1, "totalItemCount": 25 } ] }

我之后的数据位于"unreadItemCount"。感谢Shawn Tabrizi用/me/mailFolders为我设置了正确的路径。

请注意,您目前无法通过parentFolderId过滤/me/messages,因此如果您想从/me/messages获取任何邮件内容,则需要运行Shawn Tabrizi建议的自定义过滤代码。

{ "error": { "code": "ErrorInvalidProperty", "message": "The property 'ParentFolderId' does not support filtering.", "innerError": { "request-id": "526bafdd-d8ac-47f2-be1f-656b3b93da35", "date": "2017-10-11T15:45:33" } } }

答案 2 :(得分:0)

您可以运行两个单独的查询来获取收件箱文件夹中的所有新电子邮件及其内容数据。

  1. 首先运行:
  2. https://graph.microsoft.com/v1.0/me/mailFolders?$filter=displayName eq 'Inbox'

    仅获取有关收件箱文件夹的详细信息。

    $filter=displayName eq 'Inbox'过滤displayName等于(eq)'收件箱'

    的文件夹

    返回:

    `{
        "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('9285d2c9-f210-45e1-b78e-d74ba3d5e186')/mailFolders",
        "value": [
            {
                "id": "AAMkADRlM2I0YmM5LWI2MTUtNDgzZC04N2M0LWJmMWU1MTFjMDBiYwAuAAAAAAB1tij3RiDhRab9QpP_GQhpAQCTj9cyjezTSYJYfMfg3p5fAAAAAAEMAAA=",
                "displayName": "Inbox",
                "parentFolderId": "AAMkADRlM2I0YmM5LWI2MTUtNDgzZC04N2M0LWJmMWU1MTFjMDBiYwAuAAAAAAB1tij3RiDhRab9QpP_GQhpAQCTj9cyjezTSYJYfMfg3p5fAAAAAAEIAAA=",
                "childFolderCount": 0,
                "unreadItemCount": 1,
                "totalItemCount": 0
            }
        ]
    }`
    
    1. 要获取内容数据,您需要id值才能构成第二个查询的一部分。
    2. &$count=true添加到结尾以获取收件箱中未读电子邮件的数量:

      第二次查询:

      https://graph.microsoft.com/v1.0/me/mailFolders/{ Inbox id goes here }/messages?$filter=isRead eq false&$count=true

      这会从收件箱文件夹中过滤未读(isRead eq false),并返回类似:

      的内容
      `{
          "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('9285d2c9-f210-45e1-b78e-d74ba3d5e186')/mailFolders('AAMkADRlM2I0YmM5LWI2MTUtNDgzZC04N2M0LWJmMWU1MTFjMDBiYwAuAAAAAAB1tij3RiDhRab9QpP_GQhpAQCTj9cyjezTSYJYfMfg3p5fAAAAAAEMAAA%3D')/messages",
      "@odata.count": 1,
          "value": [
              {
                  "@odata.etag": "W/\"CQAAABYAAACTj9cyjezTSYJYfMfg3p5fAACWjeF5\"",
                  "receivedDateTime": "2018-01-29T11:32:40Z",
                  "sentDateTime": "2018-01-29T11:32:37Z",
                  "subject": "New Mail",
                  "bodyPreview": "New email body for email preview",
                  "isRead": false,
                  "isDraft": false,
                  -- More properties are returned. Shortened response for brevity --
      

      `

      电子邮件内容数据通过value加入。

      通过odata.count访问Inbox文件夹中未读电子邮件的数量。

      请参阅Microsof Graph - List messages in a specified folder in the mailbox