Как отправить электронное письмо от бота Microsoft Teams, используя клиент Microsoft Graph от имени другого пользователя?

#node.js #botframework #microsoft-exchange

Вопрос:

У меня есть ЛУИС, встроенный в моего бота. Если пользователь не может ответить или не может понять вопросы пользователя, я хочу, чтобы бот отправил электронное письмо с просьбой о помощи от заинтересованного лица.

Это то, что я пробовал до сих пор

 const { ComponentDialog, WaterfallDialog, ConfirmPrompt } = require('botbuilder-dialogs');
const { ActivityTypes } = require("botbuilder");

const path = require('path');
require('dotenv').config({
   path: path.resolve('.env'),
});

const { ClientSecretCredential } = require("@azure/identity");

const { Client } = require("@microsoft/microsoft-graph-client");

const { TokenCredentialAuthenticationProvider } = require("@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials");

let appInsights = require('applicationinsights');
appInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATIONKEY).start();

const CONFIRM_PROMPT = 'ConfirmPrompt';
const HELP_DIALOG = 'WaterfallDialog'

class HelpDialog extends ComponentDialog {

    constructor(id) {
        super(id);

        this.addDialog(
            new WaterfallDialog(HELP_DIALOG ,[
                this.getHelp.bind(this),
                this.sendEmail.bind(this)
            ]))
            .addDialog(new ConfirmPrompt(CONFIRM_PROMPT));

        this.initialDialogId = HELP_DIALOG;

    }

    async getHelp(stepContext) {
        await stepContext.context.sendActivity({ type: ActivityTypes.Typing });
        return await stepContext.prompt(CONFIRM_PROMPT, "I'm not sure what you are asking for, would you like me to get extra help?", ['Yes', 'No']);
    }

    async sendEmail(stepContext) {

        if(stepContext.result) {

            // Create TokenCredential
            const credential = new ClientSecretCredential(process.env.MicrosoftTenantID, process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);

            // Set scope for TokenCredential
            const graphScope = 'https://graph.microsoft.com/.default';
            const authProvider = new TokenCredentialAuthenticationProvider(credential, { scopes: [graphScope] });

            // Create client for TokenCredential
            const graphClient = Client.initWithMiddleware({
                debugLogging: true,
                authProvider,
            });

            // Construct email object
            const mail = {
                subject: "Unknown Bot Questions",
                toRecipients: [
                {
                    emailAddress: {
                        address: "receiver@outlook.com",
                    },
                }],
                body: {
                    content: `<p>Hello,</p><p>I am having trouble querying the following questions to the Bot.</p><p>I need some assistance for the above queries.</p><p>Thanks</p>`,
                    contentType: "html",
                },
            };
            //Send Email
            await graphClient.api('https://graph.microsoft.com/v1.0/users/<ObjectId-Mailbox>/sendMail')
            .post(mail)
            .then((res) => {
                console.log(res);
            })
            .catch((res) => {
                console.log(res);
            });

            return await stepContext.endDialog(stepContext.options);
        }
        else
        {
            return await stepContext.endDialog(stepContext.options);
        }
    }

}

module.exports.HelpDialog = HelpDialog;
 

У меня есть настройка аутентификации с использованием TeamsBotSsoPrompt и microsoft-graph-client в другом диалоговом окне и с использованием экземпляра graphClient в диалоговом окне, из которого я хочу отправить электронное письмо.
Но я хочу, чтобы электронное письмо отправлялось с общего адреса электронной почты, а не получателем, получающим электронное письмо от нескольких пользователей.

Комментарии:

1. Этот вопрос на самом деле не связан с самими командами, даже если вы задаете его при создании командного бота. Это в основном вопрос об узле/обмене — предлагаю вам пометить как таковой.

2. разрешает ли ваша организация подключения, не связанные с ssl?

3. YMMV, но я склонен использовать microsoft-graph-клиент, когда дело доходит до отправки электронных писем в ботах моих команд. С ним очень легко работать.

4. @Стивджонсон, Это звучит здорово. Позвольте мне попробовать microsoft-graph-клиент.

5. @SteveJohnson Я обновил вопрос, чтобы использовать microsoft-graph-клиент. Теперь, что еще мне нужно сделать?

Ответ №1:

Чтобы отправить электронное письмо с общего адреса электронной почты, вам сначала нужно будет создать учетную запись приложения в Azure AD.

На вкладке Разрешения API выберите Microsoft Graph, затем Разрешения приложений, а затем добавьте разрешение Mail.Send.

Запишите идентификатор клиента вашей учетной записи приложения, а затем создайте секрет клиента, щелкнув Сертификаты и секреты, создайте секрет, а затем запишите его.

Я не уверен, как вы храните и извлекаете идентификатор клиента, секреты, ключи и т.д., Но в моей среде я использую файл env, а также установил пакет @azure/identity, так что мой выглядит примерно так.

  const path = require('path');
   require('dotenv').config({
   path: path.resolve('.env'),
 });

 const {
   ClientSecretCredential
 } = require("@azure/identity");

 const {
   Client
 } = require("@microsoft/microsoft-graph-client");

 const {
   TokenCredentialAuthenticationProvider
 } = require("@microsoft/microsoft-graph- 
   client/authProviders/azureTokenCredentials");

 // Create TokenCredential
 const credential = new 
   ClientSecretCredential(process.env.MicrosoftTenantID, process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);

 // Set scope for TokenCredential
 const graphScope = 'https://graph.microsoft.com/.default';
 const authProvider = new TokenCredentialAuthenticationProvider(credential, 
   {
    scopes: [graphScope]
    });

 // Create client for TokenCredential
 const graphClient = Client.initWithMiddleware({
    debugLogging: true,
    authProvider,
 });
 

Установив это на месте, я извлек идентификатор объекта пользователя/почтового ящика, из которого я хочу отправить электронное письмо, и сделал вызов graph, чтобы отправить электронное письмо.

 await graphClient.api('https://graph.microsoft.com/v1.0/users/4ae760e0-8040-4cf1-a630-941c1240f7b0/sendMail')
.post(mail)
.then((res) => {
   console.log(res);
                    })
.catch((res) => {
   console.log(res);
});
 

Я думаю, что есть множество лучших способов достичь этого, но это работает для меня.

Комментарии:

1. Я получаю MODULE_NOT_FOUND ошибку для следующей строки const { TokenCredentialAuthenticationProvider } = require("@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials");

2. Я пытался передвигаться node_modules и искать библиотеку, но не смог ее найти

3. Какая версия клиента microsoft-graph у вас есть в пакете.json?

4. Версия 2.2.1 . Я попытался обновить версию, но она не обновляется.

5. Разве это не позволяет вам обновлять с помощью npm i @microsoft/microsoft-graph-client@3.0.0