在统一列表中使用 Microsoft Graph SDK 获取所有电子邮件 headers?

Getting ALL Email headers with Microsoft Graph SDK in a unified list?

我正在使用 Microsoft Graph 从特定帐户的收件箱中获取信息。该帐户有多个电子邮件别名。但是,即使在我 $select 查询 InternetMessageHeaders 属性 之后,它也不包括电子邮件发送到的别名。

我发现如果我也 select 并使用 singleValueExtendedProperties 扩展查询,我得到了我需要的东西,但现在我缺少一些存在的 header在 InternetMessageHeaders。它还返回一大堆文本,似乎不太容易解析。如果我能以某种方式将这个文本块解析为 key:value 映射,我就可以合并这两个值并结束它,但我不知道这是否可行。我希望 multiValueExtendedProperties 可以实现,但我认为这不是它的预期用途。

我正在使用 Microsoft Graph 的 .NET SDK(目前使用的是 4.0.0),这是我目前收到的所有电子邮件:

public async Task<List<Message>> PollEmails() {
    var completeList = new List<Message>();

    var messagesRequest = await graphClient.
        Users[GraphOptions.AccountId]                                               // Email account ID
            .Messages                                                               // All Emails
            .Request()                                                              // Create request w/ authorization & headers needed
            .Select("internetMessageHeaders,singleValueExtendedProperties")         // Additionally, select the email's headers
            .Expand("singleValueExtendedProperties($filter=id eq 'String 0x007D')") // Without this filter, we cannot tell which email alias was used in the To: field
            .Top(100)                                                               // Get emails in batches of 100 (default is 10)
            .GetAsync();                                                            // Run request and await results

    completeList.AddRange(messagesRequest);

    // Results are paginated, so keep getting all the results until there are no more pages
    while (messagesRequest.NextPageRequest != null) {
        messagesRequest = await messagesRequest.NextPageRequest.GetAsync();
        completeList.AddRange(messagesRequest);
    }

    return completeList;
}

Message.InternetMessageHeaders 有我需要的大部分 header,其余的在 Message.SingleValueExtendedProperties,但没有简单的方法将两者合并为一个列表而不重复 headers.

我可以盲目地遍历 InternetMessageHeaders 并将 $"{Name}: {Value}" 附加到 SingleValueExtendedProperties 值,但我最终会得到重复的 header。我可以在追加之前在字符串中搜索密钥,但这感觉就像一个 hack。

是否有官方方法来使用 Microsoft Graph 的 SDK 获取每一个header

谢谢,

编辑

这是一个比较 headers 的列表,以防有人对我用 headers 以 "ARC-*":

开头的意思感到好奇

这是我从 InternetMessageHeaders 以 JSON 格式返回的示例(来自 API):https://pastebin.com/Bdk35C5q

这是我从 SingleValueExtendedProperties 得到的纯文本:https://pastebin.com/N7c0JLB6


没有回答我问题的相关问题:

- 如何获取通过 singleValueExtendedProperties 使用的别名电子邮件 - 不包括以 ARC-*

开头的 header

Get message using Graph missing some InternetMessageHeaders - 再次通过 singleValueExtendedProperties 获取 header 的“完整”列表 - 同样,不包括以 [=26= 开头的 header ]

https://docs.microsoft.com/en-us/answers/questions/673767/how-to-read-all-internet-message-headers-of-an-ite.html - 问的正是我想问的,但从未得到回应。

原来 Outlook 与每封电子邮件 headers 不一致。所以,在这种情况下,singleValueExtendedProperties 实际上是我所需要的。

正如 Dmitry 指出的那样(感谢您的澄清),我没有意识到我要求的是我需要 MAPI 属性。

以防其他人在我发现的其他问题之前偶然发现这个问题,这是访问 MAPI 属性需要执行的操作:

API:

GET https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/messages/{id}?$expand=singleValueExtendedProperties($filter id eq 'String 0x007D')

SDK:

// Since `$select` only returns the properties you specify and the only way to get this property is with both `$select` and `$expand`, you have to manually select all the properties you want. Thanks, Microsoft.
var selectProperties =
    "id,subject,receivedDateTime,sentDateTime,from,toRecipients,ccRecipients,bccRecipients," +
    "replyTo,internetMessageHeaders,singleValueExtendedProperties,bodyPreview,body,hasAttachments," +
    "sender,categories,parentFolderId,conversationId,conversationIndex,isDeliveryReceiptRequested," +
    "isReadReceiptRequested,isRead,isDraft,webLink,inferenceClassification,flag";

// Get user's emails (Requires permission Mail.Read) - 
var messagesRequest = await graphClient.
    Users[AccountId]                                                            // Replace this with account ID
        .Messages                                                               // All Emails (or specify specific email via ["emailId"]
        .Request()                                                              // Create request w/ authorization & headers needed
        .Select(selectProperties)                                             // Select all the specified properties
        .Expand("singleValueExtendedProperties($filter=id eq 'String 0x007D')") // Select MAPI property Transport Message Headers to get the original `To:` email
        .Top(100)                                                               // Get emails in batches of 100 (default is 10)
        .GetAsync();

有关 MAPI 个属性的完整列表,请参阅 this page. For the specific MAPI property used in this example, see this page

Can you get PR_TRANSPORT_MESSAGE_HEADERS 0x007D from the .Net Microsoft Graph API?