显示用户的电子邮件
你构建了一款 JavaScript 应用,并使用 Microsoft 身份验证库将应用连接到 Microsoft 365。 现在可以检索用户的电子邮件并在应用中显示它们了。
确定应用需要哪些权限
Microsoft Graph 公开的所有数据都受到保护,并且应用必须获得相应权限才能访问这些数据。 所需的权限取决于应用需要访问的信息类型。 例如,若要访问用户的日历,应用必须具有 Calendars.Read 权限。 若要访问用户的电子邮件,应用需要 Mail.Read 权限。 Microsoft Graph API 引用中提供了每个操作所需的权限的确切列表。
如果应用加载不同类型的数据,则用户必须向其授予访问此信息所需的多个权限。 你的应用应仅请求实际所需的权限。
假设你的应用有两个页面。 一页显示用户的电子邮件,另一页显示用户的日历。 当用户首次登录到应用时,应用仅请求访问用户的基本配置文件信息。 当他们转到显示电子邮件的页面时,你的应用会请求读取其电子邮件的权限。 如果用户从不访问应用中显示其日历的页面,则应用将无法访问用户的日历数据。
此模式称为动态许可,建议连接到 Microsoft 365 的应用采用此方法请求权限。 使用动态许可,用户可以控制与其使用的应用共享的数据,从而最大程度地降低安全风险。
指定必要的权限
在调用 Microsoft Graph 之前,请确保 Microsoft 身份验证库包含 Microsoft Graph 所需的权限列表。 Microsoft 身份验证库会自动检查以前检索到的访问令牌是否具有必要的范围。 如果没有,它会自动尝试为你检索新的访问令牌。 首次使用应用时,Microsoft 身份验证库会显示一个弹出窗口,要求你通过访问此信息来同意应用。
如果在全局变量中跟踪 Microsoft 身份验证库范围,请在执行调用之前检查范围列表中是否包含必要的权限。 由于需要在每次调用之前确保必要的范围,因此可以将其封装在帮助函数中。
function ensureScope (scope) {
if (!msalRequest.scopes.some((s) => s.toLowerCase() === scope.toLowerCase())) {
msalRequest.scopes.push(scope);
}
}
调用 Microsoft Graph 检索数据时,请通过调用帮助函数来确保包含必要的权限。
async function getEmails() {
ensureScope('mail.read');
// ...
}
检索来自 Microsoft Graph 的用户电子邮件
若要从 Microsoft Graph 获取用户的电子邮件,请调用 /me/messages
终结点。 它会返回来自已登录用户邮箱的电子邮件列表。 若要获取用户的电子邮件,必须向应用授予 Mail.Read
权限。 可以使用 Microsoft Graph SDK 调用 Microsoft Graph。 若要使用它,请指定要执行的终结点和请求类型。
按以下步骤执行 GET 请求,可检索电子邮件:
graphClient.api('/me/messages').get();
Microsoft Graph 终结点按任意顺序返回数据。 若要确保获取最新消息,请按接收日期降序进行排序。
graphClient
.api('/me/messages')
.orderby('receivedDateTime desc')
.get();
如前所述,从 Microsoft Graph 检索数据时,应始终仅检索所需的数据。 最大程度地减少 Microsoft Graph 通过网络检索和传输到应用的数据量,有助于显著提高应用的性能。
可以通过以下两种方式限制从 Microsoft 365 检索的数据量:
- 选择要获取的项数。
- 选择要包含的特定信息。
若要指定要检索的属性,请使用 select
方法扩展Microsoft Graph 请求,并传递要返回的属性的逗号分隔列表。 例如,若要获取仅包含其主题和接收日期/时间的电子邮件列表,请使用以下命令:
graphClient
.api('/me/messages')
.select('subject,receivedDateTime')
.orderby('receivedDateTime desc')
.get();
提示
可以在 Microsoft Graph API 参考中找到每个终结点上可用属性的完整列表。
用于限制从 Microsoft 365 返回的数据量的另一个操作是指定要获取的项数。 若要指定要获取的项数,请使用 top
方法扩展 Microsoft Graph 请求。 例如,若要检索上次收到的 10 封电子邮件,请使用以下命令:
graphClient
.api('/me/messages')
.select('subject,receivedDateTime')
.orderby('receivedDateTime desc')
.top(10)
.get();
后续步骤
让我们将学到的所有知识用于实践并扩展应用场景,以显示当前用户最近收到的 10 封电子邮件。