Чтение электронных писем пользователей с использованием MS Graph API C # - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь использовать MS Graph API для чтения электронных писем из определенного почтового ящика.

var client = await GetClient(); //getting a client with client id, secret
var users = await client.Users.Request()
                 .Filter("startswith(displayName,'roger')")
                 .GetAsync(); //getting the users matching a criteria

var user = users.First(); //get the first user

//log the user name, this works fine
log.LogInformation("Found user " +  user.DisplayName);

//this is null
var messages = user.MailFolders?.FirstOrDefault();

Я получаю все правильные данные от пользователя, которого я здесь выбираю, но свойство mailFolders пользователя равно null.

Почему это так?

Мы хотим сканировать электронные письма в определенном почтовом ящике и обрабатывать эти электронные письма и вложения.и я подумал, что это может быть правильным способом сделать это.Но я застрял на вышесказанном, и документация по MS Graph и особенно API .NET такова.

Это вопрос авторитетности, могу ли я как-то увеличить привилегию регистрации нашего приложения AD, чтобы получить этопривилегия?

Или здесь что-то еще происходит?

1 Ответ

0 голосов
/ 25 марта 2019

Клиент Graph - это просто оболочка для REST API, и он не выполняет отложенную загрузку объектов.

Объект User поступает из AAD, в то время как MailFolders поступает из Exchange, и каждый является своей конечной точкой.

Как вы заметили, ваш Users запрос работает правильно. Чтобы получить MailFolders пользователя, вам нужно взять Id или UserPrincipalName из User и использовать его для создания отдельного запроса для MailFolders. Вам также нужно будет сделать еще один запрос для получения сообщений:

// Get all users with a displayName of roger*
var users = await graphClient
    .Users
    .Request()
    .Filter("startswith(displayName,'roger')")
    .GetAsync();

// Get the first user's mail folders
var mailFolders = await graphClient
    .Users[users[0].Id] // first user's id
    .MailFolders
    .Request()
    .GetAsync();

// Get messages from the first mail folder
var messages = await graphClient
    .Users[users[0].Id] // first user'd id
    .MailFolders[mailFolders[0].Id] // first mail folder's id
    .Messages
    .Request()
    .GetAsync();

Если вас интересуют только «хорошо известные» почтовые папки, вы можете упростить этот запрос, используя общеизвестное имя . Например, вы можете запросить inbox следующим образом:

// Get message from the user's inbox
var inboxMessages = await graphClient
    .Users[users[0].Id] // first user'd id
    .MailFolders["inbox"]
    .Messages
    .Request()
    .GetAsync();

Учитывая, что вы используете только значения id, вы можете оптимизировать это, запросив только свойство id:

// Get all users with a displayName of roger*
var users = await graphClient
    .Users
    .Request()
    .Select("id") // only get the id
    .Filter("startswith(displayName,'roger')")
    .GetAsync();

// Get the first user's mail folders
var mailFolders = await graphClient
    .Users[users[0].Id] // first user's id
    .MailFolders
    .Request()
    .Select("id") // only get the id
    .GetAsync();
...