如何通过Microsoft Graph Client让Microsoft Teams Bot以其他用户身份发送邮件
机器人LUIS无法识别时自动发邮件请求协助的实现方案
需求说明
你当前的场景是嵌入了LUIS的机器人,当无法识别用户问题时,触发确认流程后发邮件给相关人员,需要所有通知邮件都从统一公共邮箱发出,而非不同交互用户的邮箱。
解决步骤
- 首先配置Azure AD应用权限:
- 打开Azure Portal中你机器人对应的Azure AD应用注册页
- 进入「API权限」板块,添加Microsoft Graph的应用权限
Mail.Send,配置完成后点击「授予租户管理员同意」 - 记录你要用作统一发件的公共邮箱地址/邮箱对象ID,这个邮箱必须属于当前Azure AD租户
- 代码调整:
你当前HelpDialog中用ClientSecretCredential初始化的Graph客户端本身就是应用级身份,不需要调用用户SSO流程生成的graphClient实例,只要把发送邮件接口路径中的<ObjectId-Mailbox>替换为刚才记录的公共邮箱地址/对象ID即可,所有邮件都会自动以这个公共邮箱作为发件人。
可以补充在邮件内容中插入用户的实际问题、用户标识等信息,方便处理人员快速定位问题,参考修改后的代码片段:async sendEmail(stepContext) { if(stepContext.result) { const credential = new ClientSecretCredential(process.env.MicrosoftTenantID, process.env.MicrosoftAppId, process.env.MicrosoftAppPassword); const graphScope = 'https://graph.microsoft.com/.default'; const authProvider = new TokenCredentialAuthenticationProvider(credential, { scopes: [graphScope] }); const graphClient = Client.initWithMiddleware({ debugLogging: true, authProvider, }); // 获取用户的原始问题 const userQuestion = stepContext.context.activity.text; // 获取用户标识,Teams场景下可以取用户AAD ID const userId = stepContext.context.activity.from.id; const mail = { subject: "机器人未知问题求助", toRecipients: [ { emailAddress: { address: "receiver@outlook.com", }, }], body: { content: `<p>您好,</p> <p>用户 ${userId} 向机器人提问时触发了未知意图,用户的问题内容为:</p> <p><strong>${userQuestion}</strong></p> <p>请相关人员协助处理该问题。</p> <p>谢谢</p>`, contentType: "html", }, }; // 替换为公共邮箱的地址或者对象ID await graphClient.api('https://graph.microsoft.com/v1.0/users/公共邮箱地址@你的租户域名.com/sendMail') .post(mail) .then((res) => { console.log("邮件发送成功", res); await stepContext.context.sendActivity("已帮您提交求助请求,相关人员会尽快处理。"); }) .catch((err) => { console.log("邮件发送失败", err); await stepContext.context.sendActivity("求助提交失败,请稍后重试。"); }); return await stepContext.endDialog(stepContext.options); } else { return await stepContext.endDialog(stepContext.options); } }
注意事项
- 不要使用用户SSO流程生成的
graphClient发求助邮件,那个是用户委派身份,发件人会是当前交互用户,不符合你统一发件的需求,直接用应用凭证初始化的客户端即可 Mail.Send应用权限必须授予管理员同意才会生效,否则调用接口会返回权限不足错误
内容的提问来源于stack exchange,提问作者AJ31
相关产品推荐
相关产品推荐

