swaf/dist/Mail.js

122 lines
16 KiB
JavaScript

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import nodemailer from "nodemailer";
import config from "config";
import nunjucks from 'nunjucks';
import * as util from "util";
import { WrappingError } from "./Utils";
import mjml2html from "mjml";
import * as querystring from "querystring";
import Logger from "./Logger";
export function mailRoute(template) {
return `/mail/${template}`;
}
export default class Mail {
constructor(template, data = {}) {
this.options = {};
this.template = template;
this.data = data;
this.options.subject = this.template.getSubject(data);
this.verifyData();
}
static getTransporter() {
if (!this.transporter)
throw new MailError('Mail system was not prepared.');
return this.transporter;
}
static prepare() {
return __awaiter(this, void 0, void 0, function* () {
const transporter = nodemailer.createTransport({
host: config.get('mail.host'),
port: config.get('mail.port'),
secure: config.get('mail.secure'),
auth: {
user: config.get('mail.username'),
pass: config.get('mail.password'),
},
tls: {
rejectUnauthorized: !config.get('mail.allow_invalid_tls')
}
});
try {
yield util.promisify(transporter.verify)();
this.transporter = transporter;
}
catch (e) {
throw new MailError('Connection to mail service unsuccessful.', e);
}
Logger.info(`Mail ready to be distributed via ${config.get('mail.host')}:${config.get('mail.port')}`);
});
}
static end() {
this.transporter.close();
}
static parse(template, data, textOnly) {
data.text = textOnly;
const nunjucksResult = nunjucks.render(template, data);
if (textOnly)
return nunjucksResult;
const mjmlResult = mjml2html(nunjucksResult, {});
if (mjmlResult.errors.length > 0) {
throw new MailError(`Error while parsing mail template ${template}: ${JSON.stringify(mjmlResult.errors, null, 4)}`);
}
return mjmlResult.html;
}
verifyData() {
for (const forbiddenField of [
'to',
]) {
if (this.data[forbiddenField] !== undefined) {
throw new MailError(`Can't use reserved data.${forbiddenField}.`);
}
}
}
send(...to) {
return __awaiter(this, void 0, void 0, function* () {
const results = [];
for (const destEmail of to) {
// Reset options
this.options.html = this.options.text = undefined;
// Set options
this.options.to = destEmail;
// Set data
this.data.mail_subject = this.options.subject;
this.data.mail_to = this.options.to;
this.data.mail_link = `${config.get('public_url')}${mailRoute(this.template.template)}?${querystring.stringify(this.data)}`;
// Log
Logger.dev('Send mail', this.options);
// Render email
this.options.html = Mail.parse('mails/' + this.template.template + '.mjml.njk', this.data, false);
this.options.text = Mail.parse('mails/' + this.template.template + '.mjml.njk', this.data, true);
// Send email
results.push(yield Mail.getTransporter().sendMail(this.options));
}
return results;
});
}
}
export class MailTemplate {
constructor(template, subject) {
this._template = template;
this.subject = subject;
}
get template() {
return this._template;
}
getSubject(data) {
return 'Watch My Stream - ' + this.subject(data);
}
}
class MailError extends WrappingError {
constructor(message = 'An error occurred while sending mail.', cause) {
super(message, cause);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFpbC5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsiTWFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLFVBQTBDLE1BQU0sWUFBWSxDQUFDO0FBQ3BFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLFNBQVMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxTQUFTLENBQUMsUUFBZ0I7SUFDdEMsT0FBTyxTQUFTLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLElBQUk7SUFzRHJCLFlBQVksUUFBc0IsRUFBRSxPQUE2QixFQUFFO1FBSGxELFlBQU8sR0FBWSxFQUFFLENBQUM7UUFJbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUF6RE8sTUFBTSxDQUFDLGNBQWM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRU0sTUFBTSxDQUFPLE9BQU87O1lBQ3ZCLE1BQU0sV0FB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QyxJQUFTO1FBQ3ZCLE9BQU8sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0o7QUFFRCxNQUFNLFNBQVUsU0FBUSxhQUFhO0lBQ2pDLFlBQVksVUFBa0IsdUNBQXVDLEVBQUUsS0FBYTtRQUNoRixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2RlbWFpbGVyLCB7U2VudE1lc3NhZ2VJbmZvLCBUcmFuc3BvcnRlcn0gZnJvbSBcIm5vZGVtYWlsZXJcIjtcbmltcG9ydCBjb25maWcgZnJvbSBcImNvbmZpZ1wiO1xuaW1wb3J0IHtPcHRpb25zfSBmcm9tIFwibm9kZW1haWxlci9saWIvbWFpbGVyXCI7XG5pbXBvcnQgbnVuanVja3MgZnJvbSAnbnVuanVja3MnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHtXcmFwcGluZ0Vycm9yfSBmcm9tIFwiLi9VdGlsc1wiO1xuaW1wb3J0IG1qbWwyaHRtbCBmcm9tIFwibWptbFwiO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSBcInF1ZXJ5c3RyaW5nXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL0xvZ2dlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFpbFJvdXRlKHRlbXBsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL21haWwvJHt0ZW1wbGF0ZX1gO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyB0cmFuc3BvcnRlcjogVHJhbnNwb3J0ZXI7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUcmFuc3BvcnRlcigpOiBUcmFuc3BvcnRlciB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc3BvcnRlcikgdGhyb3cgbmV3IE1haWxFcnJvcignTWFpbCBzeXN0ZW0gd2FzIG5vdCBwcmVwYXJlZC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBwcmVwYXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0cmFuc3BvcnRlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5nZXQoJ21haWwuaG9zdCcpLFxuICAgICAgICAgICAgcG9ydDogY29uZmlnLmdldCgnbWFpbC5wb3J0JyksXG4gICAgICAgICAgICBzZWN1cmU6IGNvbmZpZy5nZXQoJ21haWwuc2VjdXJlJyksXG4gICAgICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgICAgICAgdXNlcjogY29uZmlnLmdldCgnbWFpbC51c2VybmFtZScpLFxuICAgICAgICAgICAgICAgIHBhc3M6IGNvbmZpZy5nZXQoJ21haWwucGFzc3dvcmQnKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0bHM6IHtcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6ICFjb25maWcuZ2V0KCdtYWlsLmFsbG93X2ludmFsaWRfdGxzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHV0aWwucHJvbWlzaWZ5KHRyYW5zcG9ydGVyLnZlcmlmeSkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ZXIgPSB0cmFuc3BvcnRlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1haWxFcnJvcignQ29ubmVjdGlvbiB0byBtYWlsIHNlcnZpY2UgdW5zdWNjZXNzZnVsLicsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9nZ2VyLmluZm8oYE1haWwgcmVhZHkgdG8gYmUgZGlzdHJpYnV0ZWQgdmlhICR7Y29uZmlnLmdldCgnbWFpbC5ob3N0Jyl9OiR7Y29uZmlnLmdldCgnbWFpbC5wb3J0Jyl9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbmQoKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ZXIuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKHRlbXBsYXRlOiBzdHJpbmcsIGRhdGE6IGFueSwgdGV4dE9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgICAgICBkYXRhLnRleHQgPSB0ZXh0T25seTtcbiAgICAgICAgY29uc3QgbnVuanVja3NSZXN1bHQgPSBudW5qdWNrcy5yZW5kZXIodGVtcGxhdGUsIGRhdGEpO1xuICAgICAgICBpZiAodGV4dE9ubHkpIHJldHVybiBudW5qdWNrc1Jlc3VsdDtcblxuICAgICAgICBjb25zdCBtam1sUmVzdWx0ID0gbWptbDJodG1sKG51bmp1Y2tzUmVzdWx0LCB7fSk7XG5cbiAgICAgICAgaWYgKG1qbWxSZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNYWlsRXJyb3IoYEVycm9yIHdoaWxlIHBhcnNpbmcgbWFpbCB0ZW1wbGF0ZSAke3RlbXBsYXRlfTogJHtKU09OLnN0cmluZ2lmeShtam1sUmVzdWx0LmVycm9ycywgbnVsbCwgNCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWptbFJlc3VsdC5odG1sO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGU6IE1haWxUZW1wbGF0ZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9wdGlvbnMgPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IHsgW3A6IHN0cmluZ106IGFueSB9O1xuXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGU6IE1haWxUZW1wbGF0ZSwgZGF0YTogeyBbcDogc3RyaW5nXTogYW55IH0gPSB7fSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zdWJqZWN0ID0gdGhpcy50ZW1wbGF0ZS5nZXRTdWJqZWN0KGRhdGEpO1xuXG4gICAgICAgIHRoaXMudmVyaWZ5RGF0YSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVyaWZ5RGF0YSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmb3JiaWRkZW5GaWVsZCBvZiBbXG4gICAgICAgICAgICAndG8nLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ZvcmJpZGRlbkZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1haWxFcnJvcihgQ2FuJ3QgdXNlIHJlc2VydmVkIGRhdGEuJHtmb3JiaWRkZW5GaWVsZH0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZCguLi50bzogc3RyaW5nW10pOiBQcm9taXNlPFNlbnRNZXNzYWdlSW5mb1tdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRlc3RFbWFpbCBvZiB0bykge1xuICAgICAgICAgICAgLy8gUmVzZXQgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmh0bWwgPSB0aGlzLm9wdGlvbnMudGV4dCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gU2V0IG9wdGlvbnNcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50byA9IGRlc3RFbWFpbDtcblxuICAgICAgICAgICAgLy8gU2V0IGRhdGFcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tYWlsX3N1YmplY3QgPSB0aGlzLm9wdGlvbnMuc3ViamVjdDtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tYWlsX3RvID0gdGhpcy5vcHRpb25zLnRvO1xuICAgICAgICAgICAgdGhpcy5kYXRhLm1haWxfbGluayA9IGAke2NvbmZpZy5nZXQ8c3RyaW5nPigncHVibGljX3VybCcpfSR7bWFpbFJvdXRlKHRoaXMudGVtcGxhdGUudGVtcGxhdGUpfT8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLmRhdGEpfWA7XG5cbiAgICAgICAgICAgIC8vIExvZ1xuICAgICAgICAgICAgTG9nZ2VyLmRldignU2VuZCBtYWlsJywgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGVtYWlsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbCA9IE1haWwucGFyc2UoJ21haWxzLycgKyB0aGlzLnRlbXBsYXRlLnRlbXBsYXRlICsgJy5tam1sLm5qaycsIHRoaXMuZGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRleHQgPSBNYWlsLnBhcnNlKCdtYWlscy8nICsgdGhpcy50ZW1wbGF0ZS50ZW1wbGF0ZSArICcubWptbC5uamsnLCB0aGlzLmRhdGEsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIGVtYWlsXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goYXdhaXQgTWFpbC5nZXRUcmFuc3BvcnRlcigpLnNlbmRNYWlsKHRoaXMub3B0aW9ucykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFpbFRlbXBsYXRlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZW1wbGF0ZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3ViamVjdDogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGU6IHN0cmluZywgc3ViamVjdDogKGRhdGE6IGFueSkgPT4gc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN1YmplY3QoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdXYXRjaCBNeSBTdHJlYW0gLSAnICsgdGhpcy5zdWJqZWN0KGRhdGEpO1xuICAgIH1cbn1cblxuY2xhc3MgTWFpbEVycm9yIGV4dGVuZHMgV3JhcHBpbmdFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNlbmRpbmcgbWFpbC4nLCBjYXVzZT86IEVycm9yKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgICB9XG59Il19