让代码更简单

C#使用Microsoft Graph API发送邮件之获取授权

重要:本文最后更新于2020-06-28 19:29:01,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

前面写了PHP使用Microsoft Graph API发送邮件的教程,但批量发送邮件这种耗时操作使用PHP语言来做还是有点不大合适,因此有了本系列教程C#使用Microsoft Graph API发送邮件。本系列教程将结合wordpress用户系统使用Microsoft Graph API群发邮件,先来看看第一篇获得Microsoft Graph授权。

前期准备

visual studio 2019(低版本无法使用MSAL)

创建一个Microsoft Graph应用,地址:https://portal.azure.com/。如果有不清楚的地方请看之前的文章Microsoft Graph开放接口学习——获得授权token

应用配置如下权限,不然无法使用发送邮件功能。

C#使用Microsoft Graph API发送邮件之获取授权

C#使用Microsoft Graph API发送邮件之获取授权

应用类型不要选WEB,选桌面应用程序。

回调地址写:https://login.microsoftonline.com/common/oauth2/nativeclient

编写程序

安装MSAL.NET

使用vs2019创建一个Windows桌面应用程序,再点击菜单栏的工具——NuGet包管理器——程序包管理器控制台,在打开的控制台中输入如下命令安装Microsoft Graph SDK包。

复制
Install-Package Microsoft.Identity.Client -IncludePrerelease

MSAL (Microsoft.Identity.Client) 是一个库,用于用户登录和请求令牌,此类令牌用于访问受 Microsoft 标识平台保护的 API。

初始化MSAL

添加引用

复制
using Microsoft.Identity.Client;

声明全局变量

复制
public static IPublicClientApplication PublicClientApp;

在主窗体初始化事件中写下如下代码:

复制
PublicClientApp= PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithAuthority(AzureCloudInstance.AzurePublic, Tenant)
.Build();

其中Tenant是静态值,我们这里值是common。ClientId是我们创建的应用id。为了方便,可以将这些变量单独声明一下。

复制
 string graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";
private static string ClientId = "exxxxxxxxxxxxxx";
private static string Tenant = "common";
private static string[] scopes = { "user.read", "mail.read", "mail.send" };//权限

获取授权

复制
AuthenticationResult authResult = null;
var app = PublicClientApp;
ResultText.Text = string.Empty;
TokenInfoText.Text = string.Empty;

var accounts = await app.GetAccountsAsync();
var firstAccount = accounts.FirstOrDefault();

try
{
authResult = await app.AcquireTokenSilent(scopes, firstAccount)
.ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
// A MsalUiRequiredException happened on AcquireTokenSilent. 
// This indicates you need to call AcquireTokenInteractive to acquire a token
System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

try
{
authResult = await app.AcquireTokenInteractive(scopes)
.WithAccount(accounts.FirstOrDefault())
.WithParentActivityOrWindow(this)
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync();
}
catch (MsalException msalex)
{
ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
}
}
catch (Exception ex)
{
ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
return;
}

if (authResult != null)
{
ResultText.Text = await GetHttpContentWithToken(graphAPIEndpoint, authResult.AccessToken);
DisplayBasicTokenInfo(authResult);

}

涉及到的其它方法如下:

复制
/// <summary>
/// Perform an HTTP GET request to a URL using an HTTP Authorization header
/// </summary>
/// <param name="url">The URL</param>
/// <param name="token">The token</param>
/// <returns>String containing the results of the GET operation</returns>
public async Task<string> GetHttpContentWithToken(string url, string token)
{
var httpClient = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage response;
try
{
var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
//Add the token in Authorization header
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
response = await httpClient.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
return content;
}
catch (Exception ex)
{
return ex.ToString();
}
}

/// <summary>
/// Display basic information contained in the token
/// </summary>
private void DisplayBasicTokenInfo(AuthenticationResult authResult)
{
TokenInfoText.Text = "";
if (authResult != null)
{
TokenInfoText.Text += $"Username: {authResult.Account.Username}" + Environment.NewLine;
TokenInfoText.Text += $"Token: {authResult.AccessToken}" + Environment.NewLine;
TokenInfoText.Text += $"Token Expires: {authResult.ExpiresOn.ToLocalTime()}" + Environment.NewLine;
}
}

点击按钮后会要求用户登录账号,并授权。

C#使用Microsoft Graph API发送邮件之获取授权

C#使用Microsoft Graph API发送邮件之获取授权

授权完成后会返回用户授权令牌给程序。

C#使用Microsoft Graph API发送邮件之获取授权

C#使用Microsoft Graph API发送邮件之获取授权

使用这个令牌我们就可以开始接下来的发送邮件操作了。

感觉很棒!可以赞赏支持我哟~

1 打赏

评论 (4)

登录后评论
nice,这么快就搞定了!
还早,刚开始。为了搞这个我专门去开了宽带....
你好,你这个已经调试好了吗?我安装你的代码报await 错误?
给别人试用过的
QQ咨询 邮件咨询 狗哥推荐