使用Microsoft Graph使用C#获取本地邮件

时间:2019-01-15 09:32:14

标签: c# microsoft-graph

我正在尝试使用GraphServiceClient来接收我的邮件。我从Microsoft在线帐户获取令牌,然后使用该令牌获取我的电子邮件。但是因为我的邮件在本地,所以无法访问,因为它会引发以下错误“代码”:“ ResourceNotFound”,“ message”:“找不到资源”。因此,如何更改我的代码,以使用通过GraphServiceClient(如果可能)从网上获取的相同令牌到本地邮件。

public async Task<ActionResult> Inbox()
{
            string token = await GetAccessToken();
            if (string.IsNullOrEmpty(token))
            {
                // If there's no token in the session, redirect to Home
                return Redirect("/");
            }

            GraphServiceClient client = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    (requestMessage) =>
                    {
                        requestMessage.Headers.Authorization =
                            new AuthenticationHeaderValue("Bearer", token);

                        return Task.FromResult(0);
                    }));

                    var mailResults = await 
                     client.Me.MailFolders.Inbox.Messages.Request()
                                    .OrderBy("receivedDateTime DESC")
                                    .Select("subject,receivedDateTime,from")
                                    .Top(10)
                                    .GetAsync();

    return View(mailResults.CurrentPage);

}


public async Task<string> GetAccessToken()
        {
            string accessToken = null;

            // Load the app config from web.config
            string appId = ConfigurationManager.AppSettings["ida:AppId"];
            string appPassword = ConfigurationManager.AppSettings["ida:AppPassword"];
            string redirectUri = ConfigurationManager.AppSettings["ida:RedirectUri"];
            string[] scopes = ConfigurationManager.AppSettings["ida:AppScopes"]
                .Replace(' ', ',').Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            // Get the current user's ID
            string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;

            if (!string.IsNullOrEmpty(userId))
            {
                // Get the user's token cache
                SessionTokenCache tokenCache = new SessionTokenCache(userId, HttpContext);

                ConfidentialClientApplication cca = new ConfidentialClientApplication(
                    appId, redirectUri, new ClientCredential(appPassword), tokenCache.GetMsalCacheInstance(), null);

                // Call AcquireTokenSilentAsync, which will return the cached
                // access token if it has not expired. If it has expired, it will
                // handle using the refresh token to get a new one.
                IEnumerable<IAccount> accounts = await cca.GetAccountsAsync();
                IAccount fisrtAccount = accounts.FirstOrDefault();
                AuthenticationResult result = await cca.AcquireTokenSilentAsync(scopes, fisrtAccount);

                accessToken = result.AccessToken;
            }

            return accessToken;
}

1 个答案:

答案 0 :(得分:1)

默认情况下,您无法使用Microsoft Graph访问任何本地信息。唯一的例外是Exchange 2016中的预览功能,该功能使您可以透明地访问日历,邮件和联系人项目。

此功能具有a number of infrastructure pre-requisites,因此,建议您首先与基础架构团队联系以进行验证。一旦具备这些先决条件,就不必从应用程序的角度更改任何代码来访问内容。 请记住,这是预览功能,因此不支持生产工作负载。