Files
dwatcher/src/lib/mail.ts
2020-09-20 10:58:20 +02:00

116 lines
3.3 KiB
TypeScript

import {moment} from "duniter/app/lib/common-libs/moment";
import {Conf} from "./types/conf";
import {ConfMail} from './types/conf'
import * as nodemailer from 'nodemailer'
import * as os from 'os'
// TODO: in confMail
const QUEUE_PERIOD = 5000
const queue: EmailContent[] = []
let conf: ConfMail|undefined
export function initConfMail(confMail: ConfMail) {
conf = confMail
;(async () => {
while (true) {
await consumeQueue()
await new Promise((res) => setTimeout(res, QUEUE_PERIOD))
}
})()
}
export async function queueEmail(subject: string, html: string, cc?: string) {
queue.push({ subject, body: html, cc })
}
async function consumeQueue() {
while (queue.length) {
const mail = queue.shift()
if (mail) {
await sendEmail(mail.subject, mail.body, mail.cc)
}
}
}
async function sendEmail(subject: string, html: string, cc?: string) {
if (!conf) {
console.error(`Mail is not properly configured.`)
return
}
console.log(`[mail] Subject: ${subject}`)
console.log(`[mail] Body: ${html}`)
if (!conf.enabled) {
console.warn(`Mail is disabled.`)
return
}
let transporter = nodemailer.createTransport({
host: conf.host,
port: conf.port,
secure: false, // true for 465, false for other ports
auth: {
user: conf.username, // generated ethereal user
pass: conf.apikey // generated ethereal password
},
authMethod: conf.auth,
requireTLS: true,
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: conf.from,
to: conf.to,
cc: (conf.cc ? [conf.cc] : []).concat(cc ? [cc] : []).join(','),
subject,
html
})
}
export const mail = {
onEstablished: (target: string, message = `Connection established for ${target}`, getHtml: () => string = () => `
<p>
Connection from [${os.hostname}] to ${target} established on ${moment().format('DD-MM-YYYY HH:mm:ss')}.
</p>
`) => {
return async (cc?: string) => {
await queueEmail(`[dw] [${os.hostname}] ${message}`, getHtml(), cc)
}
},
onDisconnect: (target: string, message = `Connection closed for ${target}`, getErrorMessage: () => string = () => '', getHtml: (waitingDelay: number, recallDelay: number) => string = (waitingDelay: number, recallDelay: number) => `
<p>
Connection from [${os.hostname}] to ${target} was lost on ${moment().format('dd-MM-YYYY HH:mm:ss')}.
</p>
<p>
Waiting ${(waitingDelay / 1000).toFixed(0)} seconds before trying to reconnect (${(recallDelay / 1000).toFixed(0)} seconds for recall).
</p>
${getErrorMessage()}
`) => {
return async (waitingDelay: number, recallDelay: number, cc?: string) => {
console.log('Waiting %s seconds...', (waitingDelay / 1000).toFixed(0))
await queueEmail(`[dw] [${os.hostname}] ${message}`, getHtml(waitingDelay, recallDelay), cc)
}
},
onRestartSuccess: (target: string, message = `Connection recovered for ${target}`, getHtml: () => string = () => `
<p>
Connection from [${os.hostname}] to ${target} was recovered on ${moment().format('dd-MM-YYYY HH:mm:ss')}.
</p>
`) => {
return async (cc?: string) => {
console.log(`${message}`)
await queueEmail(`[dw] [${os.hostname}] ${message}`, getHtml(), cc)
}
},
}
interface EmailContent {
subject: string
body: string
cc?: string
}