我已经提供了邮件的所有范围,并试图从 graph explorer 中获得同意。
但是我无法找到我在 azure active directory 上提供的范围。
ExternalItem.Read.All 应用 阅读所有外部项目 是的 授予默认目录
邮件.阅读 委派 阅读用户邮件 不 授予默认目录
邮件.阅读 应用 读取所有邮箱中的邮件 是的 授予默认目录
邮件.阅读.共享 委派 读取用户和共享邮件 不 授予默认目录
Mail.ReadBasic 委派 读取用户基本邮件 不 授予默认目录
Mail.ReadBasic 应用 读取所有邮箱中的基本邮件 是的 授予默认目录
Mail.ReadBasic.All 应用 读取所有邮箱中的基本邮件 是的 授予默认目录
Mail.ReadBasic.Shared 委派 读取用户和共享的基本邮件 不 授予默认目录
邮件.读写 委派 对用户邮件的读写权限 不 授予默认目录
邮件.读写.共享 委派 读写用户和共享邮件 不 授予默认目录
邮件.发送 委派 以用户身份发送邮件 不 授予默认目录
邮件.发送.共享 委派 代发邮件 不 授予默认目录
User.Read 委派 登录并阅读用户资料 不 授予默认目录
我期待从 graph api sdk 获得令牌,它可以读取邮件并保存附件 在我的本地文件夹中并将邮件消息移动到备份文件夹。
这是我的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Graph;
using Microsoft.Identity.Client;
namespace FeeServices.BatchEmailProcessor
{
public class GraphAPIMailReaderLL
{
private string outlookMail = null;
private string processedFolder = null;
private string clientId = null;
private string clientSecret = null;
private string tenantId = null;
public GraphAPIMailReaderLL(string clientId, string clientSecret, string tenantId, string mail) {
InitializeGraphClient(clientId, clientSecret, tenantId, mail);
}
public void InitializeGraphClient(string _clientId,string _clientSecret,string _tenantId,string mail)
{
outlookMail = mail;
clientId = _clientId;
clientSecret = _clientSecret;
tenantId = _tenantId;
}
private async Task CreateOrCheckBackUpMailFolder(string mail, Microsoft.Graph.GraphServiceClient graphClient)
{
IUserMailFoldersCollectionPage allMailFolders = await graphClient.Users[mail].MailFolders.Request().GetAsync();
//processedFolder = allMailFolders.Where(x => x.DisplayName == "ProcessedFolder").Select(x => x.Id).FirstOrDefault();
//if (processedFolder == null)
//{
// var requestBody = new MailFolder
// {
// DisplayName = "ProcessedFolder",
// IsHidden = false,
// };
// var result = await graphClient.Me.MailFolders.Request().AddResponseAsync(requestBody);
// allMailFolders = await graphClient.Users[mail].MailFolders.Request().GetAsync();
// processedFolder = allMailFolders.Where(x => x.DisplayName == "ProcessedFolder").Select(x => x.Id).FirstOrDefault();
//}
}
private async Task<IUserMessagesCollectionPage> GetMessages(string subject, Microsoft.Graph.GraphServiceClient graphClient)
{
return await graphClient.Users[outlookMail].Messages
.Request().Filter($"Subject eq '{subject}'").Expand("attachments").GetAsync();
}
public async Task<List<string>> SaveAttachmentToFile(string subject, string fileExtension, string filepath)
{
List<string> filenames = new List<string>();
var app = ConfidentialClientApplicationBuilder.Create(clientId)
.WithTenantId(tenantId)
.WithClientSecret(clientSecret)
.Build();
var scopes = new string[] { "https://graph.microsoft.com/.default"};
var authResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();
var graphClient = new GraphServiceClient(new TokenCredentialAuthProvider(authResult.AccessToken));
//var user = await graphClient.Users[outlookMail].Request().GetAsync();
//IGraphServiceUsersCollectionPage users = await graphClient.Users[outlookMail].Request().GetAsync();
//Console.WriteLine($"Found {user} users in the tenant");
await CreateOrCheckBackUpMailFolder(outlookMail, graphClient);
//IUserMessagesCollectionPage messages =await GetMessages(subject, graphClient);
//dynamic request= null;
//string filename = null;
//foreach (Message message in messages)
//{
// foreach (Attachment attachment in message.Attachments)
// {
// if (attachment.Name.ToLower().EndsWith(fileExtension.ToLower()) || attachment.Name.ToLower().EndsWith(".xlsx"))
// {
// filename = string.Format(filepath, DateTime.Now.ToString("yyMMdd-hhmmss"));
// request = graphClient.Me.Messages[message.Id].Attachments[attachment.Id].Request()
// .GetHttpRequestMessage();
// request.RequestUri = new Uri(request.RequestUri.OriginalString + "/$value");
// var response = await graphClient.HttpProvider.SendAsync(request);
// var body = await response.Content.ReadAsByteArrayAsync();
// System.IO.File.WriteAllBytes(filename, body);
// filenames.Add(filename);
// }
// }
// await Delete(message.Id, graphClient);
//}
return filenames;
}
private async Task Delete(string messageId, Microsoft.Graph.GraphServiceClient graphClient)
{
Message movedMsg = await graphClient.Users[outlookMail].Messages[messageId].Move(processedFolder).Request().PostAsync();
}
}
class TokenCredentialAuthProvider : IAuthenticationProvider
{
private readonly string _accessToken;
public TokenCredentialAuthProvider(string accessToken)
{
_accessToken = accessToken;
}
public Task AuthenticateRequestAsync(HttpRequestMessage request)
{
request.Headers.Authorization = new
System.Net.Http.Headers.AuthenticationHeaderValue("Bearer",
_accessToken);
return Task.FromResult(0);
}
} }