diff --git a/package-lock.json b/package-lock.json index bd3142f6..53bf9c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "botserver", - "version": "2.0.91", + "version": "2.0.113", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2457,6 +2457,47 @@ } } }, + "@sendgrid/client": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.4.2.tgz", + "integrity": "sha512-bu8lLbRD+OV7YsYNemEy8DRoxs8/8u325EXNlQ3VaqhcpbM0eSvdL5e5Wa7VZpbczcNCJmf/sr/uqFmwcO5S+A==", + "requires": { + "@sendgrid/helpers": "^7.4.2", + "axios": "^0.21.1" + }, + "dependencies": { + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" + } + } + }, + "@sendgrid/helpers": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.4.2.tgz", + "integrity": "sha512-b/IyBwT4zrOfXA0ISvWZsnhYz+5uAO20n68J8n/6qe5P1E2p0L7kWNTN5LYu0S7snJPUlbEa6FpfrSKzEcP9JA==", + "requires": { + "deepmerge": "^4.2.2" + } + }, + "@sendgrid/mail": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.4.2.tgz", + "integrity": "sha512-hvIOnm8c3zVyDnJcyBuAeujmpKX56N3D/LpiZrFuLHjAz4iEHrmL2sJ3iU9O6hxcb07gd1CES+z9Fg7FBT26uQ==", + "requires": { + "@sendgrid/client": "^7.4.2", + "@sendgrid/helpers": "^7.4.2" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -7037,6 +7078,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", diff --git a/package.json b/package.json index 5cec0961..42995cfd 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "@semantic-release/changelog": "5.0.1", "@semantic-release/exec": "5.0.0", "@semantic-release/git": "9.0.0", + "@sendgrid/mail": "^7.4.2", "@types/validator": "13.1.0", "adal-node": "0.2.1", "any-shell-escape": "0.1.1", diff --git a/packages/basic.gblib/services/SystemKeywords.ts b/packages/basic.gblib/services/SystemKeywords.ts index 54f41eff..fdc5553d 100644 --- a/packages/basic.gblib/services/SystemKeywords.ts +++ b/packages/basic.gblib/services/SystemKeywords.ts @@ -40,6 +40,7 @@ import { SecService } from '../../security.gbapp/services/SecService'; const request = require('request-promise-native'); const MicrosoftGraph = require('@microsoft/microsoft-graph-client'); const path = require('path'); +const sgMail = require('@sendgrid/mail'); /** * @fileoverview General Bots server core. @@ -610,12 +611,39 @@ export class SystemKeywords { * Sends an e-mail. * * @example + * + * SEND MAIL "email@domain.com", "Subject", "Message text." + * */ public async sendEmail(to, subject, body) { + // tslint:disable-next-line:no-console + GBLog.info(`[E-mail]: to:${to}, subject: ${subject}, body: ${body}.`); + const emailToken = process.env.EMAIL_API_KEY; + + return new Promise((resolve, reject) => { + sgMail.setApiKey(emailToken); + const msg = { + to: to, + from: process.env.EMAIL_FROM, + subject: subject, + text: body, + html: body + }; + sgMail.send(msg, false, (err, res) => { + if (err) { + reject(err) + } + else { + resolve(res); + } + }); + }); } +} + /** * Calls any REST API by using GET HTTP method. * @@ -623,14 +651,14 @@ export class SystemKeywords { * */ public async getByHttp(url: string) { - const options = { - uri: url - }; + const options = { + uri: url + }; - let result = await request.get(options); - GBLog.info(`[GET]: ${url} : ${result}`); - return JSON.parse(result); - } + let result = await request.get(options); + GBLog.info(`[GET]: ${url} : ${result}`); + return JSON.parse(result); +} /** * Calls any REST API by using POST HTTP method. @@ -642,18 +670,18 @@ export class SystemKeywords { * */ public async postByHttp(url: string, data) { - const options = { - uri: url, - json: true, - body: data - }; + const options = { + uri: url, + json: true, + body: data + }; - let result = await request.post(options); - GBLog.info(`[POST]: ${url} (${data}): ${result}`); - return JSON.parse(result); - } + let result = await request.post(options); + GBLog.info(`[POST]: ${url} (${data}): ${result}`); + return JSON.parse(result); +} public async numberOnly(text: string) { - return text.replace(/\D/gi, ''); - } + return text.replace(/\D/gi, ''); +} }