从其他用户身份发送 Outlook 邮件
Exchange Online 提供的邮箱权限允许用户从其他用户身份、通讯组列表、组、资源或共享邮箱发送邮件。 Microsoft Graph 也支持此功能,但是最终结果各不相同,具体取决于在 Exchange Online 中授予的准确权限以及用于发送邮件的 API。
权限
两种类型的权限适用于从另一个用户发送消息:
- Microsoft Graph 权限
- 邮箱权限
Microsoft Graph 权限
若要从其他用户身份发送邮件,使用用户令牌的应用程序需使用 the Mail.Send.Shared 权限。
注意
使用应用程序令牌而不是用户令牌且已拥有管理员授予的 Mail.Send 权限的应用程序可以组织中的任何用户身份发送邮件,只需通过用户的邮箱正常发送邮件即可。
邮箱权限
以下两种权限会影响从其他用户身份发送邮件的最终结果:代表发送和代理发送。 使用 Mail.Send.Shared 权限登录应用程序的用户必须至少拥有这两种权限之一,这些权限已授予从其中发送邮件的邮箱、组或通讯组列表。
注意
目前无法使用 Microsoft Graph 来查询经过身份验证的用户对哪些邮箱具有权限。
代表发送
具有此权限后,电子邮件的收件人在其电子邮件客户端中指示应用程序的用户代表其他用户发送邮件。
这在 Microsoft Graph 中公开,因为 sender
(用户实际发送消息) ,并 from
(用户、组等,该消息似乎来自) 属性。
{
"id": "AAMkAGE1...",
"subject": "Send mail test",
"sender": {
"emailAddress": {
"name": "Adele Vance",
"address": "AdeleV@contoso.com"
}
},
"from": {
"emailAddress": {
"name": "Pradeep Gupta",
"address": "PradeepG@contoso.com"
}
}
}
用户可以使用 Outlook 将其自己邮箱的这种权限授予其他用户。 管理员可以在 Microsoft 365 管理中心为任何邮箱、组或通讯组列表授予此权限。
代理发送
使用此权限时,不会显示邮件是以其他用户身份发送的指示。
sender
和 from
属性具有相同的值。
用户无法为其邮箱授予此权限。 管理员可以在 Microsoft 365 管理中心授予此权限。
通过 Microsoft Graph 发送
可以通过直接发送或创建草稿然后再发送这两种方式,从其他用户身份发送邮件。
如要从其他用户身份发送,请设置要从其中向用户电子邮件地址发送的邮件上的 from
属性。 无需设置 sender
属性 - Microsoft Graph 根据授予已登录用户的邮箱权限对其进行适当设置。
例如,若要从 sales@contoso.com
组发送邮件,请按如下所示配置邮件。
{
"subject": "January sales report",
"toRecipients": [
{
"emailAddress": {
"address": "MeganB@contoso.com"
}
}
],
"from": {
"emailAddress": {
"address": "sales@contoso.com"
}
}
}
已发送邮件行为
邮件发送完毕后,可将其保存至发送用户的“已发送邮件”文件夹、发件人用户的“已发送邮件”文件夹或两者。 也可以完全不保存。
注意
如果邮件是从没有邮箱的地址(例如通讯组列表)发送,则发件人用户没有“已发送邮件”。
- 如果应用程序通过使用
/me
终结点(或/users/{user-id}
,其中user-id
对应于已登录的用户)发送,邮件则会默认保存至发送用户的“已发送邮件”文件夹。 - 如果应用程序通过使用
/users/{user-id}
(其中user-id
对应于已登录的用户)发送,邮件则会默认保存至发件人用户的“已发送邮件”文件夹。重要
若要以此方式发送,除了代表发送或代理发送权限之外,发送用户还必须具有完全访问邮箱权限。
以下其他外部因素可能会改变默认行为:
- 管理员将发件人用户的邮箱更新为始终将从代理发送的邮件副本保存至其“已发送邮件”。
- 通过在 send mail 请求中将
saveToSentItems
属性设为false
,可以防止邮件被保存至“已发送邮件”文件夹。 但是,如果管理员已配置“始终保存副本”设置,则邮件将被保存至发件人用户的“已发送邮件”文件夹。
示例
示例 1:通过 /me 终结点成功发送
在此示例中,Adele Vance 已为 Allan Deyoung 的邮箱授予代表发送权限。
请求
POST /me/sendmail
Content-Type: application/json
{
"message": {
"subject": "Expense reports",
"body": {
"contentType": "text",
"content": "Have you submitted your expense reports yet?"
},
"toRecipients": [
{
"emailAddress": {
"address": "MeganB@contoso.com"
}
}
],
"from": {
"emailAddress": {
"address": "AllanD@contoso.com"
}
}
}
}
响应
HTTP/1.1 202 Accepted
示例 2:在无权限的情况下,尝试发送失败
在此示例中,Adele Vance 尝试从 Patti Fernandez 身份发送电子邮件,但他并没有被授予代表发送或代理发送权限。 响应中包含 ErrorSendAsDenied
错误。
请求
POST /me/sendmail
Content-Type: application/json
{
"message": {
"subject": "Support ticket",
"body": {
"contentType": "text",
"content": "I noticed you opened a support ticket yesterday..."
},
"toRecipients": [
{
"emailAddress": {
"address": "MeganB@contoso.com"
}
}
],
"from": {
"emailAddress": {
"address": "PattiF@contoso.com"
}
}
}
}
响应
HTTP/1.1 403 Forbidden
Content-Type: application/json
{
"error": {
"code": "ErrorSendAsDenied",
"message": "The user account which was used to submit this request does not have the right to send mail on behalf of the specified sending account. Cannot submit message.",
"innerError": {
"request-id": "24e7991e-01ae-4cc2-8e06-532a96fd8948",
"date": "2019-01-16T18:53:25"
}
}
}
后续步骤
- 为什么与 Outlook 邮件集成
- 在 Microsoft Graph v1.0 中 使用邮件 API 及其 用例