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

115 lines
4.2 KiB
JavaScript
Raw Normal View History

2021-09-07 07:42:46 -07:00
const nodemailer = require("nodemailer");
const NotificationProvider = require("./notification-provider");
const { DOWN } = require("../../src/util");
2021-09-07 07:42:46 -07:00
class SMTP extends NotificationProvider {
name = "smtp";
/**
* @inheritdoc
*/
2021-09-07 07:42:46 -07:00
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const config = {
host: notification.smtpHost,
port: notification.smtpPort,
secure: notification.smtpSecure,
tls: {
rejectUnauthorized: !notification.smtpIgnoreTLSError || false,
2022-01-05 22:34:45 -08:00
}
};
// Fix #1129
if (notification.smtpDkimDomain) {
config.dkim = {
2021-12-18 21:30:53 -08:00
domainName: notification.smtpDkimDomain,
keySelector: notification.smtpDkimKeySelector,
privateKey: notification.smtpDkimPrivateKey,
hashAlgo: notification.smtpDkimHashAlgo,
headerFieldNames: notification.smtpDkimheaderFieldNames,
skipFields: notification.smtpDkimskipFields,
2022-01-05 22:34:45 -08:00
};
}
2021-09-07 07:42:46 -07:00
// 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 11:32:45 -07:00
let subject = msg;
// Change the subject if:
// - The msg ends with "Testing" or
// - Actual Up/Down Notification
if ((monitorJSON && heartbeatJSON) || msg.endsWith("Testing")) {
let customSubject = "";
// 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-12 14:24:34 -07:00
// If custom subject is not empty, change subject for notification
if (customSubject !== "") {
// Replace "MACROS" with corresponding variable
let replaceName = new RegExp("{{NAME}}", "g");
let replaceHostnameOrURL = new RegExp("{{HOSTNAME_OR_URL}}", "g");
let replaceStatus = new RegExp("{{STATUS}}", "g");
// Lets start with dummy values to simplify code
let monitorName = "Test";
let monitorHostnameOrURL = "testing.hostname";
let serviceStatus = "⚠️ Test";
2021-10-12 14:24:34 -07:00
if (monitorJSON !== null) {
monitorName = monitorJSON["name"];
✨ feat: json-query monitor added (#3253) * ✨ feat: json-query monitor added Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: import warning error Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: br tag and remove comment Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: supporting compare string with other types Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: switch to a better lib for json query Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: better description on json query and using `v-html` in jsonQueryDescription element to fix `a` tags Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: result variable in error message Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: typos in json query description Co-authored-by: Frank Elsinga <[email protected]> * 📝 docs: `HTTP(s) Json Query` added to monitor list in `README.md` Signed-off-by: Muhammed Hussein Karimi <[email protected]> * 🐛 fix: needed white space in `README.md` Co-authored-by: Frank Elsinga <[email protected]> * Nostr dm notifications (#3051) * Add nostr DM notification provider * require crypto for node 18 compatibility * remove whitespace Co-authored-by: Frank Elsinga <[email protected]> * move closer to where it is used * simplify success or failure logic * don't clobber the non-alert msg * Update server/notification-providers/nostr.js Co-authored-by: Frank Elsinga <[email protected]> * polyfills required for node <= 18 * resolve linter warnings * missing comma --------- Co-authored-by: Frank Elsinga <[email protected]> * Drop nostr * Rebuild package-lock.json * Lint --------- Signed-off-by: Muhammed Hussein Karimi <[email protected]> Co-authored-by: Frank Elsinga <[email protected]> Co-authored-by: zappityzap <128872140+[email protected]> Co-authored-by: Louis Lam <[email protected]>
2023-07-13 08:37:26 -07:00
if (monitorJSON["type"] === "http" || monitorJSON["type"] === "keyword" || monitorJSON["type"] === "json-query") {
monitorHostnameOrURL = monitorJSON["url"];
} else {
monitorHostnameOrURL = monitorJSON["hostname"];
}
}
if (heartbeatJSON !== null) {
serviceStatus = (heartbeatJSON["status"] === DOWN) ? "🔴 Down" : "✅ Up";
}
// Break replace to one by line for better readability
customSubject = customSubject.replace(replaceStatus, serviceStatus);
customSubject = customSubject.replace(replaceName, monitorName);
customSubject = customSubject.replace(replaceHostnameOrURL, monitorHostnameOrURL);
subject = customSubject;
}
2021-10-09 11:32:45 -07:00
}
2021-09-07 07:42:46 -07:00
let transporter = nodemailer.createTransport(config);
let bodyTextContent = msg;
if (heartbeatJSON) {
bodyTextContent = `${msg}\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`;
2021-09-07 07:42:46 -07:00
}
// send mail with defined transport object
await transporter.sendMail({
from: notification.smtpFrom,
cc: notification.smtpCC,
bcc: notification.smtpBCC,
2021-09-07 07:42:46 -07:00
to: notification.smtpTo,
2021-10-09 11:32:45 -07:00
subject: subject,
2021-09-07 07:42:46 -07:00
text: bodyTextContent,
});
return "Sent Successfully.";
}
}
module.exports = SMTP;