Как отправить адаптивную карту через Outlook с помощью botFramework NodeJs

Я создал бота, который отправляет адаптивные карточки через команды. Я могу успешно взаимодействовать с картой. Однако я хотел бы расширить функциональность и сделать так, чтобы она могла отправлять открытки и через Outlook. Я выполнил эти шаги и добавил канал в службы ботов Azure. Однако я не знаю, как начать отправку карты, поскольку в документации это не описано. Вот фрагмент того, как я отправляю открытку командам.

// HTTP trigger to send notification. You need to add authentication / authorization for this API. Refer https://aka.ms/teamsfx-notification for more details.
server.post(
  "/api/notificationByTeams",
  restify.plugins.queryParser(),
  restify.plugins.bodyParser(), // Add more parsers if needed
  async (req, res) => {
    let continuationToken = undefined;
    do {
      const pagedData = await notificationApp.notification.getPagedInstallations();
      let adaptiveCardData = req.body;
      const { MerlinUser, MerlinPassword, Receivers, TemplateType } = adaptiveCardData;

      //Here we get all the users receiving the notification
      const usersReceivingCardInformation = await getNotificationMembersInfoByEmail(Receivers)
      const installations = pagedData.data;
      continuationToken = pagedData.continuationToken;

      //Here we encrypt the data of the admin user
      adaptiveCardData.MerlinUser = encryptData(MerlinUser);
      adaptiveCardData.MerlinPassword = encryptData(MerlinPassword);
      adaptiveCardData.Originator = process.env.Originator;
      console.info("Llegamos a setear el originator ", adaptiveCardData.Originator);
      adaptiveCardData.UserIds = usersReceivingCardInformation.map(x => x.id);

      for (const target of installations) {
       
        if (target.type === "Person" && usersReceivingCardInformation.some(x => x.id === target.conversationReference.user.id)) {
          let selectedTemplate = selectTemplate(TemplateType);
          await target.sendAdaptiveCard(
            AdaptiveCards.declare(selectedTemplate).render({
              ...adaptiveCardData
            })
          );
        }
      }
    } while (continuationToken);

    res.json({});
  }
);

Я добавил каналы Outlook в свою службу ботов в Azure.

🤔 А знаете ли вы, что...
Node.js позволяет создавать веб-приложения в реальном времени с помощью библиотеки Socket.io.


1
62
1

Ответ:

Решено

Я хотел бы расширить функциональность и сделать так, чтобы она могла отправлять открытки и через Outlook.

Используя Microsoft Graph API, мы можем отправлять адаптивную карту по электронной почте через Outlook.

Здесь я добавил канал Outlook в свою службу ботов Azure.

  • Создайте регистрацию приложения и перейдите к разрешению API <Добавить разрешение.

  • Нажмите на график Microsoft и выберите разрешения приложения, затем найдите Mail.send, чтобы предоставить разрешение для вашего приложения.

  • Создайте структуру JSON для адаптивной карточки, как показано ниже.
{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "text": "Hello!",
            "size": "large"
        },
        {
            "type": "TextBlock",
            "text": "This is an adaptive card sent via email."
        },
        {
            "type": "Image",
            "url": "https://adaptivecards.io/content/cats/1.png"
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "Learn More",
            "url": "https://adaptivecards.io"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.2"
}

  • Я отправил этот документ MS для аутентификации и отправки электронного письма с прикреплением адаптивной карты с помощью Microsoft Graph API.
const msal = require('@azure/msal-node');
const { Client } = require('@microsoft/microsoft-graph-client');
require('isomorphic-fetch');

// MSAL configuration
const msalConfig = {
    auth: {
        clientId: 'YOUR_CLIENT_ID',
        authority: 'https://login.microsoftonline.com/YOUR_TENANT_ID',
        clientSecret: 'YOUR_CLIENT_SECRET'
    }
};

const cca = new msal.ConfidentialClientApplication(msalConfig);

async function getToken() {
    const clientCredentialRequest = {
        scopes: ['https://graph.microsoft.com/.default'],
    };
    const response = await cca.acquireTokenByClientCredential(clientCredentialRequest);
    return response.accessToken;
}

async function sendAdaptiveCardEmail() {
    const accessToken = await getToken();

    const client = Client.init({
        authProvider: (done) => {
            done(null, accessToken);
        }
    });

    const adaptiveCardJson = require('./adaptiveCard.json');

    const email = {
        message: {
            subject: 'Adaptive Card Email',
            body: {
                contentType: 'HTML',
                content: 'Please see the adaptive card below.'
            },
            toRecipients: [
                {
                    emailAddress: {
                        address: '[email protected]'
                    }
                }
            ],
            attachments: [
                {
                    '@odata.type': '#microsoft.graph.fileAttachment',
                    name: 'adaptiveCard.json',
                    contentType: 'application/json',
                    contentBytes: Buffer.from(JSON.stringify(adaptiveCardJson)).toString('base64')
                }
            ]
        }
    };

    await client.api('/me/sendMail')
        .post({ message: email.message, saveToSentItems: 'true' });

    console.info('Email sent successfully.');
}

sendAdaptiveCardEmail().catch(console.error);