58 lines
1.5 KiB
TypeScript
Executable File
58 lines
1.5 KiB
TypeScript
Executable File
"use strict";
|
|
|
|
import { createTransport } from 'nodemailer';
|
|
import { timestamp } from "./timestamp";
|
|
|
|
const transporter = createTransport({
|
|
host: 'email.ketrenos.com',
|
|
pool: true,
|
|
port: 25
|
|
});
|
|
|
|
function sendMail(to: string, subject: string, message: string, cc?: string): Promise<boolean> {
|
|
let envelope: any = {
|
|
subject: subject,
|
|
from: 'Ketr.Ketran <james_ketran@ketrenos.com>',
|
|
to: to || '',
|
|
cc: cc || ''
|
|
};
|
|
|
|
/* If there isn't a To: but there is a Cc:, promote Cc: to To: */
|
|
if (!envelope.to && envelope.cc) {
|
|
envelope.to = envelope.cc;
|
|
delete envelope.cc;
|
|
}
|
|
|
|
envelope.text = message
|
|
envelope.html = message.replace(/\n/g, "<br>\n");
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
let attempts = 10;
|
|
|
|
function attemptSend(envelope: any) {
|
|
/* Rate limit to ten per second */
|
|
transporter.sendMail(envelope, function (error, _info) {
|
|
if (error) {
|
|
if (attempts) {
|
|
attempts--;
|
|
console.warn(timestamp() + " Unable to send mail. Trying again in 100ms (" + attempts + " attempts remain): ", error);
|
|
setTimeout(() => attemptSend(envelope), 100);
|
|
} else {
|
|
console.error(timestamp() + " Error sending email: ", error)
|
|
reject(error);
|
|
}
|
|
} else {
|
|
console.log(timestamp() + " Mail sent to: " + envelope.to);
|
|
resolve(true);
|
|
}
|
|
});
|
|
}
|
|
|
|
attemptSend(envelope);
|
|
});
|
|
}
|
|
|
|
export {
|
|
sendMail
|
|
};
|