uptime-kuma/server/notification-providers/smtp.js

89 lines
3.1 KiB
JavaScript
Raw Normal View History

2021-09-07 14:42:46 +00:00
const nodemailer = require("nodemailer");
const NotificationProvider = require("./notification-provider");
2021-10-12 21:24:34 +00:00
const { DOWN, UP } = require("../../src/util");
2021-09-07 14:42:46 +00:00
class SMTP extends NotificationProvider {
name = "smtp";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const config = {
host: notification.smtpHost,
port: notification.smtpPort,
secure: notification.smtpSecure,
};
// Should fix the issue in https://github.com/louislam/uptime-kuma/issues/26#issuecomment-896373904
if (notification.smtpUsername || notification.smtpPassword) {
config.auth = {
user: notification.smtpUsername,
pass: notification.smtpPassword,
};
}
// Lets start with default subject and empty string for custom one
2021-10-09 18:32:45 +00:00
let subject = msg;
let customSubject = "";
2021-10-09 18:32:45 +00:00
// Our subject cannot end with whitespace it's often raise spam score
// Once I got "Cannot read property 'trim' of undefined", better be safe than sorry
if (notification.customSubject) {
customSubject = notification.customSubject.trim()
}
2021-10-09 18:32:45 +00:00
// If custom subject is not empty, change subject for notification
if (customSubject !== "") {
2021-10-12 21:24:34 +00:00
// Replace "MACROS" with coresponding variable
let replaceName = new RegExp("{{NAME}}", "g");
let replaceHostname = new RegExp("{{HOSTNAME}}", "g");
let replaceStatus = new RegExp("{{STATUS}}", "g");
2021-10-12 21:24:34 +00:00
// Lets start with dummy values to simplify code
let monitorName = "Test"
let monitorHostname = "example.com"
let serviceStatus = "⚠️ Test";
if (monitorJSON !== null) {
2021-10-12 21:24:34 +00:00
monitorName = monitorJSON["name"];
monitorHostname = monitorJSON["hostname"];
}
2021-10-12 21:24:34 +00:00
if (heartbeatJSON !== null) {
serviceStatus = heartbeatJSON["status"] == DOWN ? "🔴 Down" : "✅ Up";
}
2021-10-12 21:24:34 +00:00
// Break replace to one by line for better readability
customSubject = customSubject.replace(replaceStatus, serviceStatus);
customSubject = customSubject.replace(replaceName, monitorName);
customSubject = customSubject.replace(replaceHostname, monitorHostname);
subject = customSubject
2021-10-09 18:32:45 +00:00
}
2021-09-07 14:42:46 +00:00
let transporter = nodemailer.createTransport(config);
let bodyTextContent = msg;
if (heartbeatJSON) {
bodyTextContent = `${msg}\nTime (UTC): ${heartbeatJSON["time"]}`;
}
// send mail with defined transport object
await transporter.sendMail({
from: notification.smtpFrom,
cc: notification.smtpCC,
bcc: notification.smtpBCC,
2021-09-07 14:42:46 +00:00
to: notification.smtpTo,
2021-10-09 18:32:45 +00:00
subject: subject,
2021-09-07 14:42:46 +00:00
text: bodyTextContent,
tls: {
rejectUnauthorized: notification.smtpIgnoreTLSError || false,
},
2021-09-07 14:42:46 +00:00
});
return "Sent Successfully.";
}
}
module.exports = SMTP;