#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