You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Microsoft Graph Client让Microsoft Teams Bot以其他用户身份发送邮件

机器人LUIS无法识别时自动发邮件请求协助的实现方案

需求说明

你当前的场景是嵌入了LUIS的机器人,当无法识别用户问题时,触发确认流程后发邮件给相关人员,需要所有通知邮件都从统一公共邮箱发出,而非不同交互用户的邮箱。

解决步骤

  • 首先配置Azure AD应用权限:
    1. 打开Azure Portal中你机器人对应的Azure AD应用注册页
    2. 进入「API权限」板块,添加Microsoft Graph的应用权限Mail.Send,配置完成后点击「授予租户管理员同意」
    3. 记录你要用作统一发件的公共邮箱地址/邮箱对象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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:54:03