UNPKG

@underpostnet/underpost

Version:
103 lines (91 loc) 3 kB
import nodemailer from 'nodemailer'; import { loggerFactory } from '../server/logger.js'; import { EmailRender } from './EmailRender.js'; const logger = loggerFactory(import.meta); const MailerProvider = { instance: {}, load: async function ( options = { id: '', meta: 'mailer', sender: { email: '', name: '', }, transport: { host: '', // smtp host port: 587, secure: false, // true for 465, false for other ports auth: { user: '', // generated ethereal user pass: '', // generated ethereal password }, }, host: '', path: '', templates: { userVerifyEmail: 'DefaultVerifyEmail', userRecoverEmail: 'DefaultRecoverEmail', }, }, ) { try { options.transport.tls = { rejectUnauthorized: false, }; const { id } = options; // Generate test SMTP service account from ethereal.email // Only needed if you don't have a real mail account for testing // let testAccount = await nodemailer.createTestAccount(); // create reusable transporter object using the default SMTP transport const transporter = nodemailer.createTransport(options.transport); // console.log('load logger', { url: options.meta }); this.instance[id] = { ...options, transporter, templates: await EmailRender.getTemplates(options), }; return this.instance[id]; } catch (error) { logger.error(error, error.stack); return undefined; } }, send: async function ( options = { id: '', sendOptions: { from: '"Fred Foo 👻" <foo@example.com>', // sender address to: 'bar@example.com, baz@example.com', // list of receivers subject: 'Hello ✔', // Subject line text: 'Hello world?', // plain text body html: '<b>Hello world?</b>', // html body attachments: [ { filename: 'logo.png', path: `./logo.png`, cid: 'logo', // <img src='cid:logo'> }, ], }, }, ) { try { const { id, sendOptions } = options; if (!sendOptions.from) sendOptions.from = `${this.instance[id].sender.name} <${this.instance[id].sender.email}>`; // send mail with defined transport object const info = await this.instance[id].transporter.sendMail(sendOptions); // console.log('Message sent: %s', info.messageId); // logger.info('Message sent', info); // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com> // Preview only available when sending through an Ethereal account // console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info)); // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou... return info; } catch (error) { logger.error(error, error.stack); return undefined; } }, }; export { MailerProvider };