在 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 平台,在登陆之后可以看到下面界面

本文用的例子都是使用国际版的 Office 365 版本,而不会使用国内的版本,因为国内的版本少了很多功能

点击添加应用,随意给一个应用的命名,我这里给了一个 LasecouDofalerJornowserewel 应用

需要记下程序的 ID 在应用会用到

添加权限,要发送邮件,需要添加 "User.Read", "Mail.Read", "Mail.Send","Files.Read" 权限

点击添加权限

点击添加应用程序权限

关于权限这一步,请先照着点,详细请看Office 365 开发入门指南

还有这个步骤最重要的,点击下方的保存,有小伙伴就告诉我按照我的教程无法成功,过了很长的时间才发现是没有保存

创建 UWP 程序

打开 VisualStudio 创建一个 UWP 项目,尽可能选择新版本,只有在自己跑通了之后才使用小的版本,防止因为版本问题在尝试开发的时候做到放弃

我创建了一个 BalreMahouVoomawbatu 项目,最低版本是 17134 也就是现在最新的

安装 nuget 包

右击项目,点击管理 Nuget 包

先点击安装 Microsoft.Graph 的 1.11 版本

然后勾选包含预发行版,找到 Microsoft.Identity.Client 的 2.2 版本

添加访问权限

打开 UWP 的 MainPage.xaml.cs 文件,添加 Load 事件

在 Load 事件的函数添加自己的代码,首先使用 DelegateAuthenticationProvider 拿到访问的权限,在 Microsoft.Graph 的所有访问都需要先获得 OAuth 的权限

在文件的最上面添加引用

using Microsoft.Graph;

然后在 MainPage_Loaded 添加下面代码

            var provider = new DelegateAuthenticationProvider(AuthenticateRequestAsyncDelegate);

创建方法 AuthenticateRequestAsyncDelegate 请看下面

        private Task AuthenticateRequestAsyncDelegate(HttpRequestMessage request)
{ }

现在的代码还是无法运行通过的,需要在 AuthenticateRequestAsyncDelegate 添加访问的 Token 拿到权限

还记得刚才记下来的程序 ID 现在就需要用到他了

请看下面代码

        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"}; }

通过 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 = "lindexi_gd@outlook.com"}
}
}
}, SaveToSentItems: true /*保存到发送邮件夹*/).Request().PostAsync();

特别是 EmailAddress 请修改为你自己的邮箱,因为已经设置 SaveToSentItems 即使发送给我也可以在自己的已经发送邮件夹找到这个邮件

现在尝试运行一下这个 UWP 程序,在运行之前需要右击部署一下

运行之后需要等待很久才可以看到这个界面,在国内的网络不是很好,所以可能会看到这个界面

如果看到下面这个界面,请多次重试

或者给 IE 可以用的代理,默认的 UWP 程序会使用 IE 的代理

如果看到这个页面,证明可以访问

因为所有的代码都没有涉及到界面,登陆之后等待一会,就可以打开自己的 Outlook 邮箱看到刚才发送的邮件

看到这里就可以知道,现在UWP发送邮件有三个方法,本文是其中一个,其他方法请看win10 UWP 发邮件

参考

Microsoft Graph 桌面应用程序 - 陈希章 - 博客园

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/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

win10 uwp 使用 Microsoft.Graph 发送邮件的更多相关文章

  1. Microsoft Graph 桌面应用程序

    作者:陈希章 发表于 2017年3月22日 桌面应用程序,在我这篇文章的语境中,我是特指在Windows桌面上面直接运行的.NET应用程序,包括Console Application,WPF Appl ...

  2. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  3. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  4. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  5. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  6. win10 uwp 毛玻璃

    毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...

  7. win10 UWP 序列化

    将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. .NET Framewor ...

  8. 【广告】win10 uwp 水印图床 含代码

    本文主要是广告我的软件. 图床可以加速大家写博客上传图片的时间,通过简化我们的操作来得到加速. 在写博客的时候,我们发现,我们需要上传一张图片,需要先打开图片,然后选择本地图片,然后上传. 但是我经常 ...

  9. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

随机推荐

  1. TCP keepalive的机理及使用

    TCP 是面向连接的 , 在实际应用中通常都需要检测对端是否还处于连接中.如果已断开连接,主要分为以下几种情况: 1.连接的对端正常关闭,即使用 closesocket 关闭连接. 2.连接的对端非正 ...

  2. 用SpannableString来设置一个textview的各种样式

    通常情况下,textview 设置文本的样式很单一,为了满足某种需求可以使用SpannableString来设置文本字体大小.颜色.超链接等属性. xml就一个TextView所以就不在给出了,直接看 ...

  3. Redis、MPP、kafka 、MongDB简介

    Redis :间值数据库,适合缓存用户Session会话与经常需要查的数据1.Redis集群,为什么在项目中使用集群  1.持久化,持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要左右 ...

  4. 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列

    题目描述 YJC最近在学习字符串的有关知识.今天,他遇到了这么一个概念:最长公共回文子序列.一个序列S,如果S是回文的且分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  5. hdu 3536【并查集】

    hdu 3536 题意: 有N个珠子,第i个珠子初始放在第i个城市.有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市.  Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  7. Libevent:3创建event_base

    在使用Libevent函数之前,需要分配一个或多个event_base结构.每一个event_base都持有一个events的集合,并且可以检测那些events是激活的. 如果设置event_base ...

  8. 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务

    2019年4月4日,阿里云安全应急响应中心监测到Confluence 官方发布安全更新指出,Widget Connector 存在服务端模板注入漏洞,攻击者能利用此漏洞实现目录穿越遍历甚至远程命令执行 ...

  9. React Native-组件的引用

    之前文章中,我们使用了许多React Native组件,也定义了一些组件.但是我们都没有定义组件的标识,我们都是通过回调方法处理组件对应的事件,这种情况能满足绝大多数需求,有些情况我们需要对组件进行操 ...

  10. 3DSMAX安装失败怎样卸载重新安装3DSMAX,解决3DSMAX安装失败的方法总结

    技术帖:3DSMAX没有按照正确方式卸载,导致3DSMAX安装失败.楼主也查过网上关于如何解决3DSMAX安装失败的一些文章,是说删除几个3DSMAX文件和3DSMAX软件注册表就可以解决3DSMAX ...