oak-general-business/es/utils/email/node-mailer.js

102 lines
3.2 KiB
JavaScript

//https://www.nodemailer.com/
import nodemailer from 'nodemailer';
import { assert } from 'oak-domain/lib/utils/assert';
import { get } from 'oak-domain/lib/utils/lodash';
export default 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 = get(systemConfig, 'Emails.0', {});
const { host, port, password, account } = emailConfig;
assert(host, 'host未配置');
assert(port, 'port未配置');
assert(account, 'account未配置');
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.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,
};
}
}
}