天天看點

win10 uwp 使用 Microsoft.Graph 發送郵件

在 2018 年 10 月 13 号參加了 ​​張隊長​​​ 的 ​​Office 365 訓練營​​ 學習如何開發 Office 365 插件和 OAuth 2.0 開發,于是我就使用 UWP 嘗試使用 Microsoft.Graph 經過了一天的測試終于成功使用發送郵件

本文告訴大家如何在 UWP 調用 Microsoft.Graph 發送郵件

在仔細閱讀了​​Microsoft Graph 桌面應用程式 - 陳希章​​的文章之後,按照文章的方法嘗試了很久終于成功發送了郵件

可以使用 Microsoft.Graph 調用 Office 365 的幾乎所有功能,但是我隻有成功使用郵件的功能,暫時就先告訴大家如何在 UWP 使用 Microsoft.Graph 發送郵件

之後的其他功能等我跑通了,再告訴大家

因為 Microsoft.Graph 開發速度是很快的,本文安裝的 Nuget 都會告訴大家指定的版本,防止因為微軟的版本修改而讓大家無法按照本文提供的方式

注冊應用

首先登陸 ​​Microsoft Applications​​ 平台,在登陸之後可以看到下面界面

win10 uwp 使用 Microsoft.Graph 發送郵件

本文用的例子都是使用國際版的 Office 365 版本,而不會使用國内的版本,因為國内的版本少了很多功能

點選添加應用,随意給一個應用的命名,我這裡給了一個 LasecouDofalerJornowserewel 應用

win10 uwp 使用 Microsoft.Graph 發送郵件

需要記下程式的 ID 在應用會用到

win10 uwp 使用 Microsoft.Graph 發送郵件

添權重限,要發送郵件,需要添加 ​

​"User.Read", "Mail.Read", "Mail.Send","Files.Read"​

​ 權限

win10 uwp 使用 Microsoft.Graph 發送郵件

點選添權重限

win10 uwp 使用 Microsoft.Graph 發送郵件

點選添加應用程式權限

win10 uwp 使用 Microsoft.Graph 發送郵件

關于權限這一步,請先照着點,詳細請看​​Office 365 開發入門指南​​

還有這個步驟最重要的,點選下方的儲存,有小夥伴就告訴我按照我的教程無法成功,過了很長的時間才發現是沒有儲存

建立 UWP 程式

打開 VisualStudio 建立一個 UWP 項目,盡可能選擇新版本,隻有在自己跑通了之後才使用小的版本,防止因為版本問題在嘗試開發的時候做到放棄

我建立了一個 BalreMahouVoomawbatu 項目,最低版本是 17134 也就是現在最新的

win10 uwp 使用 Microsoft.Graph 發送郵件
win10 uwp 使用 Microsoft.Graph 發送郵件

安裝 nuget 包

右擊項目,點選管理 Nuget 包

先點選安裝 Microsoft.Graph 的 1.11 版本

win10 uwp 使用 Microsoft.Graph 發送郵件

然後勾選包含預發行版,找到 Microsoft.Identity.Client 的 2.2 版本

win10 uwp 使用 Microsoft.Graph 發送郵件

添加通路權限

打開 UWP 的 MainPage.xaml.cs 檔案,添加 Load 事件

win10 uwp 使用 Microsoft.Graph 發送郵件

在 Load 事件的函數添加自己的代碼,首先使用 DelegateAuthenticationProvider 拿到通路的權限,在 Microsoft.Graph 的所有通路都需要先獲得 OAuth 的權限

在檔案的最上面添加引用

using Microsoft.Graph;      

然後在 MainPage_Loaded 添加下面代碼

var provider = new DelegateAuthenticationProvider(AuthenticateRequestAsyncDelegate);      

建立方法 AuthenticateRequestAsyncDelegate 請看下面

private Task AuthenticateRequestAsyncDelegate(HttpRequestMessage request)
        {
            
        }      

現在的代碼還是無法運作通過的,需要在 AuthenticateRequestAsyncDelegate 添加通路的 Token 拿到權限

還記得剛才記下來的程式 ID 現在就需要用到他了

win10 uwp 使用 Microsoft.Graph 發送郵件

請看下面代碼

private Task AuthenticateRequestAsyncDelegate(HttpRequestMessage request)
        {

            string clientID = "2f56798a-66f7-4330-9bc4-d3a8a0898642"; //這個ID是我建立的一個臨時App的ID,請替換為自己的
            string[] scopes = {"User.Read", "Mail.Read", "Mail.Send", "Files.Read"};

        }      
win10 uwp 使用 Microsoft.Graph 發送郵件

通過 clientID 建立 ​

​Microsoft.Identity.Client.PublicClientApplication​

​ 請看代碼

string clientID = "2f56798a-66f7-4330-9bc4-d3a8a0898642"; //這個ID是我建立的一個臨時App的ID,請替換為自己的
            string[] scopes = {"User.Read", "Mail.Read", "Mail.Send", "Files.Read"};

            var clientApplication = new PublicClientApplication(clientID);      

使用 clientApplication 獲得權限

var authenticationResult = await clientApplication.AcquireTokenAsync(scopes);      

運作到這一步就會請求使用者的權限

從擷取到的權限給傳入的參數

request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);      

詳細關于 OAuth 擷取權限的請看張隊長的部落格,這裡的部落格很多,請看文章的最後

現在可以看到的 AuthenticateRequestAsyncDelegate 代碼是這樣

private async Task AuthenticateRequestAsyncDelegate(HttpRequestMessage request)
        {

            string clientID = "2f56798a-66f7-4330-9bc4-d3a8a0898642"; //這個ID是我建立的一個臨時App的ID,請替換為自己的
            string[] scopes = { "User.Read", "Mail.Read", "Mail.Send", "Files.Read" };

            var clientApplication = new PublicClientApplication(clientID);

            var authenticationResult = await clientApplication.AcquireTokenAsync(scopes);

            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
        }      

注意需要替換這裡的 clientID 為你自己的 clientID 當然代碼可以按照我的使用,因為用我的 ID 也是沒問題

發送郵件

在擷取到權限之後,很容易就可以調用 Microsoft.Graph 發送郵件,請看代碼

建立 GraphServiceClient 之後調用 SendMail 就可以,郵件裡面的内容請自己修改

await client.Me.SendMail(new Message()
            {
                Subject = "調用Microsoft Graph發出的郵件",
                Body = new ItemBody()
                {
                    ContentType = BodyType.Text,
                    Content = "這是一封調用了Microsoft Graph服務發出的郵件,範例參考 https://github.com/chenxizhang/office365dev"
                },
                ToRecipients = new[]
                {
                    new Recipient()
                    {
                        EmailAddress = new EmailAddress() {Address = "[email protected]"}
                    }
                }
            }, SaveToSentItems: true /*儲存到發送郵件夾*/).Request().PostAsync();      
win10 uwp 使用 Microsoft.Graph 發送郵件

特别是 EmailAddress 請修改為你自己的郵箱,因為已經設定 SaveToSentItems 即使發送給我也可以在自己的已經發送郵件夾找到這個郵件

現在嘗試運作一下這個 UWP 程式,在運作之前需要右擊部署一下

運作之後需要等待很久才可以看到這個界面,在國内的網絡不是很好,是以可能會看到這個界面

win10 uwp 使用 Microsoft.Graph 發送郵件

如果看到下面這個界面,請多次重試

win10 uwp 使用 Microsoft.Graph 發送郵件

或者給 IE 可以用的代理,預設的 UWP 程式會使用 IE 的代理

如果看到這個頁面,證明可以通路

win10 uwp 使用 Microsoft.Graph 發送郵件

因為所有的代碼都沒有涉及到界面,登陸之後等待一會,就可以打開自己的 Outlook 郵箱看到剛才發送的郵件

win10 uwp 使用 Microsoft.Graph 發送郵件
win10 uwp 使用 Microsoft.Graph 發送郵件

看到這裡就可以知道,現在UWP發送郵件有三個方法,本文是其中一個,其他方法請看win10 UWP 發郵件

參考

ASP.NET Core Identity 實戰(1)——Identity 初次體驗 - .Net Core 微服務 - .Net Core 開源微服務 套件 工具包 CSharpKit

ASP.NET Core Identity Hands On(2)——注冊、登入、Claim - .Net Core 微服務 - .Net Core 開源微服務 套件 工具包 CSharpKit

OAuth2授權 - .Net Core 微服務 - .Net Core 開源微服務 套件 工具包 CSharpKit

教你實踐ASP.NET Core Authorization - .Net Core 微服務 - .Net Core 開源微服務 套件 工具包 CSharpKit

ASP.NET Core 之 Identity 入門(一) - .Net Core 微服務 - .Net Core 開源微服務 套件 工具包 CSharpKit

ASP.NET Core 之 Identity 入門(二) - .Net Core 微服務 - .Net Core 開源微服務 套件 工具包 CSharpKit

我搭建了自己的部落格 https://lindexi.gitee.io/ 歡迎大家通路,裡面有很多新的部落格。