106 lines
3.5 KiB
JavaScript
106 lines
3.5 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const tslib_1 = require("tslib");
|
|
//https://www.nodemailer.com/
|
|
const nodemailer_1 = tslib_1.__importDefault(require("nodemailer"));
|
|
const assert_1 = require("oak-domain/lib/utils/assert");
|
|
const lodash_1 = require("oak-domain/lib/utils/lodash");
|
|
class Nodemailer {
|
|
name = 'nodemailer';
|
|
async getConfig(context, systemId) {
|
|
let system;
|
|
if (systemId) {
|
|
[system] = await context.select('system', {
|
|
data: {
|
|
id: 1,
|
|
config: 1,
|
|
},
|
|
filter: {
|
|
id: systemId,
|
|
}
|
|
}, {
|
|
dontCollect: true,
|
|
});
|
|
}
|
|
else {
|
|
system = context.getApplication().system;
|
|
}
|
|
const { config: systemConfig } = system;
|
|
const emailConfig = (0, lodash_1.get)(systemConfig, 'Emails.0', {});
|
|
const { host, port, password, account } = emailConfig;
|
|
(0, assert_1.assert)(host, 'host未配置');
|
|
(0, assert_1.assert)(port, 'port未配置');
|
|
(0, assert_1.assert)(account, 'account未配置');
|
|
(0, assert_1.assert)(password, 'password未配置');
|
|
return {
|
|
config: emailConfig,
|
|
};
|
|
}
|
|
async sendEmail(options, context) {
|
|
const { subject, from, text, html, to, attachments } = options;
|
|
const { config, } = await this.getConfig(context);
|
|
const transport = Object.assign(config, options);
|
|
const _from = from || (config.name ? `"${config.name}" <${config.account}>` : config.account);
|
|
const transporter = nodemailer_1.default.createTransport({
|
|
host: transport.host,
|
|
port: transport.port,
|
|
secure: transport.secure,
|
|
auth: {
|
|
user: transport.account,
|
|
pass: transport.password,
|
|
},
|
|
});
|
|
async function verifyTransporter() {
|
|
return new Promise((resolve, reject) => {
|
|
transporter.verify((error, success) => {
|
|
if (error) {
|
|
reject(error);
|
|
}
|
|
else {
|
|
resolve(success);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
try {
|
|
await verifyTransporter();
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log('Server is ready to take our messages');
|
|
}
|
|
let mailOptions = {
|
|
from: _from,
|
|
to,
|
|
subject,
|
|
text,
|
|
html,
|
|
attachments: attachments
|
|
};
|
|
try {
|
|
let info = await transporter.sendMail(mailOptions);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log('info', info);
|
|
console.log('Message sent: %s', info.messageId);
|
|
}
|
|
return {
|
|
success: true,
|
|
};
|
|
}
|
|
catch (err) {
|
|
console.log('sendMailError', err);
|
|
return {
|
|
success: false,
|
|
error: err?.message,
|
|
};
|
|
}
|
|
}
|
|
catch (error) {
|
|
console.error('verifyError', error);
|
|
return {
|
|
success: false,
|
|
error: error?.message,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
exports.default = Nodemailer;
|