From ec25ebee35bb0abd287e2ce0307ea515321784e7 Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Wed, 11 Jun 2025 14:11:49 +0530 Subject: [PATCH 1/9] Fix: Node Mailer Settings --- server/service/emailService.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/service/emailService.js b/server/service/emailService.js index 035cc6505..ad0cdac3a 100755 --- a/server/service/emailService.js +++ b/server/service/emailService.js @@ -109,7 +109,7 @@ class EmailService { const baseEmailConfig = { host: systemEmailHost, - port: systemEmailPort, + port: Number(systemEmailPort), secure: true, auth: { user: systemEmailUser || systemEmailAddress, @@ -130,10 +130,6 @@ class EmailService { } : baseEmailConfig; - if (!isSmtps) { - delete emailConfig.auth; - } - this.transporter = this.nodemailer.createTransport(emailConfig); const buildHtml = async (template, context) => { From 01ed3d8aaa971b8969bb9b7bfcbf039da5191aac Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Wed, 11 Jun 2025 14:42:51 +0530 Subject: [PATCH 2/9] Feat: New Email Settings --- client/src/Pages/Settings/SettingsEmail.jsx | 43 +++++++++++++++++++++ client/src/locales/en.json | 4 ++ 2 files changed, 47 insertions(+) diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index 88f8f98c1..73ba11610 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -12,6 +12,7 @@ import { useTranslation } from "react-i18next"; import { PasswordEndAdornment } from "../../Components/Inputs/TextInput/Adornments"; import { useSendTestEmail } from "../../Hooks/useSendTestEmail"; import { createToast } from "../../Utils/toastUtils"; +import { Switch } from "@mui/material"; const SettingsEmail = ({ isAdmin, @@ -53,6 +54,10 @@ const SettingsEmail = ({ systemEmailAddress: settingsData?.settings?.systemEmailAddress, systemEmailPassword: password || settingsData?.settings?.systemEmailPassword, systemEmailConnectionHost: settingsData?.settings?.systemEmailConnectionHost, + systemEmailTLSServername: settingsData?.settings?.systemEmailTLSServername, + systemEmailIgnoreTLS: settingsData?.settings?.systemEmailIgnoreTLS, + systemEmailRequireTLS: settingsData?.settings?.systemEmailRequireTLS, + systemEmailRejectUnauthorized: settingsData?.settings?.systemEmailRejectUnauthorized, }; // Basic validation @@ -155,6 +160,44 @@ const SettingsEmail = ({ )} + + + {t("settingsEmailTLSServername")} + + + + + {t("settingsEmailIgnoreTLS")} + + {t("settingsEmailRequireTLS")} + + {t("settingsEmailRejectUnauthorized")} + + {t("settingsEmailConnectionHost")} Date: Wed, 11 Jun 2025 15:11:28 +0530 Subject: [PATCH 3/9] TLS Options Set Up --- client/src/Pages/Settings/index.jsx | 8 ++++++-- client/src/Validation/validation.js | 4 ++++ server/service/emailService.js | 9 ++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx index b0e3c476b..b51fb0110 100644 --- a/client/src/Pages/Settings/index.jsx +++ b/client/src/Pages/Settings/index.jsx @@ -56,17 +56,21 @@ const Settings = () => { // Handlers const handleChange = async (e) => { - const { name, value } = e.target; + const { name, value, checked } = e.target; // Special case for showURL until handled properly in the backend if (name === "showURL") { dispatch(setShowURL(value)); return; } + let newValue; + if (name === "systemEmailIgnoreTLS" || name === "systemEmailRequireTLS" || name === "systemEmailRejectUnauthorized") { + newValue = checked; + } // Build next state early const newSettingsData = { ...settingsData, - settings: { ...settingsData.settings, [name]: value }, + settings: { ...settingsData.settings, [name]: newValue ?? value }, }; // Validate diff --git a/client/src/Validation/validation.js b/client/src/Validation/validation.js index 043e88f50..cb2d4e797 100644 --- a/client/src/Validation/validation.js +++ b/client/src/Validation/validation.js @@ -294,6 +294,10 @@ const settingsValidation = joi.object({ systemEmailPassword: joi.string().allow(""), systemEmailUser: joi.string().allow(""), systemEmailConnectionHost: joi.string().allow(""), + systemEmailTLSServername: joi.string().allow(""), + systemEmailIgnoreTLS: joi.boolean().optional(), + systemEmailRequireTLS: joi.boolean().optional(), + systemEmailRejectUnauthorized: joi.boolean().optional(), }); const dayjsValidator = (value, helpers) => { diff --git a/server/service/emailService.js b/server/service/emailService.js index ad0cdac3a..3b627fb95 100755 --- a/server/service/emailService.js +++ b/server/service/emailService.js @@ -105,6 +105,10 @@ class EmailService { systemEmailAddress, systemEmailPassword, systemEmailConnectionHost, + systemEmailTLSServername, + systemEmailIgnoreTLS, + systemEmailRequireTLS, + systemEmailRejectUnauthorized, } = config; const baseEmailConfig = { @@ -126,7 +130,10 @@ class EmailService { name: systemEmailConnectionHost || "localhost", secure: false, pool: true, - tls: { rejectUnauthorized: false }, + tls: { rejectUnauthorized: systemEmailRejectUnauthorized }, + ignoreTLS: systemEmailIgnoreTLS, + requireTLS: systemEmailRequireTLS, + servername: systemEmailTLSServername, } : baseEmailConfig; From 1794429cbeb801c76c728b515a06487e4509d61b Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Wed, 11 Jun 2025 15:29:25 +0530 Subject: [PATCH 4/9] Formatting Run --- client/src/Pages/Settings/SettingsEmail.jsx | 7 +++---- client/src/Pages/Settings/index.jsx | 6 +++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index 73ba11610..7d6538734 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -57,7 +57,8 @@ const SettingsEmail = ({ systemEmailTLSServername: settingsData?.settings?.systemEmailTLSServername, systemEmailIgnoreTLS: settingsData?.settings?.systemEmailIgnoreTLS, systemEmailRequireTLS: settingsData?.settings?.systemEmailRequireTLS, - systemEmailRejectUnauthorized: settingsData?.settings?.systemEmailRejectUnauthorized, + systemEmailRejectUnauthorized: + settingsData?.settings?.systemEmailRejectUnauthorized, }; // Basic validation @@ -161,9 +162,7 @@ const SettingsEmail = ({ )} - - {t("settingsEmailTLSServername")} - + {t("settingsEmailTLSServername")} { return; } let newValue; - if (name === "systemEmailIgnoreTLS" || name === "systemEmailRequireTLS" || name === "systemEmailRejectUnauthorized") { + if ( + name === "systemEmailIgnoreTLS" || + name === "systemEmailRequireTLS" || + name === "systemEmailRejectUnauthorized" + ) { newValue = checked; } // Build next state early From de3d38d891007deb318580ba1509a0692301cfb7 Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Thu, 12 Jun 2025 00:39:47 +0530 Subject: [PATCH 5/9] Implement remaining email config --- client/src/Pages/Settings/SettingsEmail.jsx | 23 ++++++++++++++++++ client/src/Pages/Settings/index.jsx | 4 ++- client/src/Utils/NetworkService.js | 6 +++++ client/src/Validation/validation.js | 2 ++ client/src/locales/en.json | 2 ++ server/controllers/settingsController.js | 12 +++++++++ server/service/emailService.js | 27 ++++++++------------- server/validation/joi.js | 6 +++++ 8 files changed, 64 insertions(+), 18 deletions(-) diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index 7d6538734..113d5bf44 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -50,6 +50,8 @@ const SettingsEmail = ({ const emailConfig = { systemEmailHost: settingsData?.settings?.systemEmailHost, systemEmailPort: settingsData?.settings?.systemEmailPort, + systemEmailSecure: settingsData?.settings?.systemEmailSecure, + systemEmailPool: settingsData?.settings?.systemEmailPool, systemEmailUser: settingsData?.settings?.systemEmailUser, systemEmailAddress: settingsData?.settings?.systemEmailAddress, systemEmailPassword: password || settingsData?.settings?.systemEmailPassword, @@ -110,6 +112,27 @@ const SettingsEmail = ({ onChange={handleChange} /> + + {t("settingsEmailSecure")} + + {t("settingsEmailPool")} + + {t("settingsEmailUser")} { if ( name === "systemEmailIgnoreTLS" || name === "systemEmailRequireTLS" || - name === "systemEmailRejectUnauthorized" + name === "systemEmailRejectUnauthorized" || + name === "systemEmailSecure" || + name === "systemEmailPool" ) { newValue = checked; } diff --git a/client/src/Utils/NetworkService.js b/client/src/Utils/NetworkService.js index 3d124a3e6..dcb21df92 100644 --- a/client/src/Utils/NetworkService.js +++ b/client/src/Utils/NetworkService.js @@ -1014,6 +1014,12 @@ class NetworkService { systemEmailPort: emailConfig.systemEmailPort, systemEmailAddress: emailConfig.systemEmailAddress, systemEmailPassword: emailConfig.systemEmailPassword, + systemEmailSecure: emailConfig.systemEmailSecure, + systemEmailPool: emailConfig.systemEmailPool, + systemEmailIgnoreTLS: emailConfig.systemEmailIgnoreTLS, + systemEmailRequireTLS: emailConfig.systemEmailRequireTLS, + systemEmailRejectUnauthorized: emailConfig.systemEmailRejectUnauthorized, + systemEmailTLSServername: emailConfig.systemEmailTLSServername, // Only include these if they are present ...(emailConfig.systemEmailConnectionHost && { systemEmailConnectionHost: emailConfig.systemEmailConnectionHost, diff --git a/client/src/Validation/validation.js b/client/src/Validation/validation.js index cb2d4e797..089722a8d 100644 --- a/client/src/Validation/validation.js +++ b/client/src/Validation/validation.js @@ -290,6 +290,8 @@ const settingsValidation = joi.object({ timezone: joi.string().allow("").optional(), systemEmailHost: joi.string().allow(""), systemEmailPort: joi.number().allow(null, ""), + systemEmailSecure: joi.boolean().optional(), + systemEmailPool: joi.boolean().optional(), systemEmailAddress: joi.string().allow(""), systemEmailPassword: joi.string().allow(""), systemEmailUser: joi.string().allow(""), diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 028f9483c..610c56d0e 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -683,6 +683,8 @@ "settingsEmailIgnoreTLS": "Ignore TLS", "settingsEmailRequireTLS": "Require TLS", "settingsEmailRejectUnauthorized": "Reject Unauthorized", + "settingsEmailSecure": "Secure", + "settingsEmailPool": "Pool", "state": "State", "statusBreadCrumbsStatusPages": "Status Pages", "statusBreadCrumbsDetails": "Details", diff --git a/server/controllers/settingsController.js b/server/controllers/settingsController.js index 58e8ce9f4..d1010c093 100755 --- a/server/controllers/settingsController.js +++ b/server/controllers/settingsController.js @@ -74,6 +74,12 @@ class SettingsController { systemEmailPassword, systemEmailUser, systemEmailConnectionHost, + systemEmailSecure, + systemEmailPool, + systemEmailIgnoreTLS, + systemEmailRequireTLS, + systemEmailRejectUnauthorized, + systemEmailTLSServername, } = req.body; const subject = this.stringService.testEmailSubject; @@ -91,6 +97,12 @@ class SettingsController { systemEmailAddress, systemEmailPassword, systemEmailConnectionHost, + systemEmailSecure, + systemEmailPool, + systemEmailIgnoreTLS, + systemEmailRequireTLS, + systemEmailRejectUnauthorized, + systemEmailTLSServername, } ); diff --git a/server/service/emailService.js b/server/service/emailService.js index 3b627fb95..325871fac 100755 --- a/server/service/emailService.js +++ b/server/service/emailService.js @@ -101,6 +101,8 @@ class EmailService { const { systemEmailHost, systemEmailPort, + systemEmailSecure, + systemEmailPool, systemEmailUser, systemEmailAddress, systemEmailPassword, @@ -111,32 +113,23 @@ class EmailService { systemEmailRejectUnauthorized, } = config; - const baseEmailConfig = { + const emailConfig = { host: systemEmailHost, port: Number(systemEmailPort), - secure: true, + secure: systemEmailSecure, auth: { user: systemEmailUser || systemEmailAddress, pass: systemEmailPassword, }, connectionTimeout: 5000, + pool: systemEmailPool, + tls: { rejectUnauthorized: systemEmailRejectUnauthorized }, + ignoreTLS: systemEmailIgnoreTLS, + requireTLS: systemEmailRequireTLS, + servername: systemEmailTLSServername, + name: systemEmailConnectionHost || "localhost", }; - const isSmtps = Number(systemEmailPort) === 465; - - const emailConfig = !isSmtps - ? { - ...baseEmailConfig, - name: systemEmailConnectionHost || "localhost", - secure: false, - pool: true, - tls: { rejectUnauthorized: systemEmailRejectUnauthorized }, - ignoreTLS: systemEmailIgnoreTLS, - requireTLS: systemEmailRequireTLS, - servername: systemEmailTLSServername, - } - : baseEmailConfig; - this.transporter = this.nodemailer.createTransport(emailConfig); const buildHtml = async (template, context) => { diff --git a/server/validation/joi.js b/server/validation/joi.js index 271cd2d21..b7858f92d 100755 --- a/server/validation/joi.js +++ b/server/validation/joi.js @@ -617,10 +617,16 @@ const sendTestEmailBodyValidation = joi.object({ to: joi.string().required(), systemEmailHost: joi.string(), systemEmailPort: joi.number(), + systemEmailSecure: joi.boolean(), + systemEmailPool: joi.boolean(), systemEmailAddress: joi.string(), systemEmailPassword: joi.string(), systemEmailUser: joi.string(), systemEmailConnectionHost: joi.string(), + systemEmailIgnoreTLS: joi.boolean(), + systemEmailRequireTLS: joi.boolean(), + systemEmailRejectUnauthorized: joi.boolean(), + systemEmailTLSServername: joi.string(), }); export { From 38a1d5e7a1660b0cf4cb3d8b51bb1cb92017fcad Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Fri, 13 Jun 2025 12:22:28 +0530 Subject: [PATCH 6/9] Implement PR Comments --- client/src/Pages/Settings/SettingsEmail.jsx | 76 +++++++++++++-------- client/src/Utils/NetworkService.js | 4 -- client/src/Validation/validation.js | 8 +-- client/src/locales/en.json | 10 +-- server/db/models/AppSettings.js | 23 +++++++ server/service/emailService.js | 12 ++-- server/validation/joi.js | 12 +++- 7 files changed, 96 insertions(+), 49 deletions(-) diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index 113d5bf44..50f90c38f 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -26,6 +26,21 @@ const SettingsEmail = ({ const { t } = useTranslation(); const theme = useTheme(); + // Destructure settings with default values + const { + systemEmailHost = "", + systemEmailPort = "", + systemEmailSecure = false, + systemEmailPool = false, + systemEmailUser = "", + systemEmailAddress = "", + systemEmailPassword = "", + systemEmailTLSServername = "", + systemEmailConnectionHost = "localhost", + systemEmailIgnoreTLS = false, + systemEmailRequireTLS = false, + systemEmailRejectUnauthorized = true, + } = settingsData?.settings || {}; // Local state const [password, setPassword] = useState(""); const [hasBeenReset, setHasBeenReset] = useState(false); @@ -48,25 +63,31 @@ const SettingsEmail = ({ const handleSendTestEmail = () => { // Collect current form values const emailConfig = { - systemEmailHost: settingsData?.settings?.systemEmailHost, - systemEmailPort: settingsData?.settings?.systemEmailPort, - systemEmailSecure: settingsData?.settings?.systemEmailSecure, - systemEmailPool: settingsData?.settings?.systemEmailPool, - systemEmailUser: settingsData?.settings?.systemEmailUser, - systemEmailAddress: settingsData?.settings?.systemEmailAddress, - systemEmailPassword: password || settingsData?.settings?.systemEmailPassword, - systemEmailConnectionHost: settingsData?.settings?.systemEmailConnectionHost, - systemEmailTLSServername: settingsData?.settings?.systemEmailTLSServername, - systemEmailIgnoreTLS: settingsData?.settings?.systemEmailIgnoreTLS, - systemEmailRequireTLS: settingsData?.settings?.systemEmailRequireTLS, - systemEmailRejectUnauthorized: - settingsData?.settings?.systemEmailRejectUnauthorized, + systemEmailHost, + systemEmailPort, + systemEmailSecure, + systemEmailPool, + systemEmailUser, + systemEmailAddress, + systemEmailPassword: password || systemEmailPassword, + systemEmailTLSServername, + systemEmailConnectionHost, + systemEmailIgnoreTLS, + systemEmailRequireTLS, + systemEmailRejectUnauthorized, }; // Basic validation - if (!emailConfig.systemEmailHost || !emailConfig.systemEmailPort) { + if ( + !emailConfig.systemEmailHost || + !emailConfig.systemEmailPort || + !emailConfig.systemEmailAddress + ) { createToast({ - body: t("settingsEmailRequiredFields", "Email host and port are required"), + body: t( + "settingsEmailRequiredFields", + "Email address, host and port are required" + ), variant: "error", }); return; @@ -98,7 +119,7 @@ const SettingsEmail = ({ @@ -108,7 +129,7 @@ const SettingsEmail = ({ name="systemEmailPort" placeholder="425" type="number" - value={settingsData?.settings?.systemEmailPort ?? ""} + value={systemEmailPort} onChange={handleChange} /> @@ -123,13 +144,13 @@ const SettingsEmail = ({ {t("settingsEmailSecure")} {t("settingsEmailPool")} @@ -138,7 +159,7 @@ const SettingsEmail = ({ @@ -147,7 +168,7 @@ const SettingsEmail = ({ @@ -189,34 +210,33 @@ const SettingsEmail = ({ {t("settingsEmailIgnoreTLS")} {t("settingsEmailRequireTLS")} {t("settingsEmailRejectUnauthorized")} @@ -225,7 +245,7 @@ const SettingsEmail = ({ diff --git a/client/src/Utils/NetworkService.js b/client/src/Utils/NetworkService.js index dcb21df92..3e0ac6103 100644 --- a/client/src/Utils/NetworkService.js +++ b/client/src/Utils/NetworkService.js @@ -1020,10 +1020,6 @@ class NetworkService { systemEmailRequireTLS: emailConfig.systemEmailRequireTLS, systemEmailRejectUnauthorized: emailConfig.systemEmailRejectUnauthorized, systemEmailTLSServername: emailConfig.systemEmailTLSServername, - // Only include these if they are present - ...(emailConfig.systemEmailConnectionHost && { - systemEmailConnectionHost: emailConfig.systemEmailConnectionHost, - }), ...(emailConfig.systemEmailUser && { systemEmailUser: emailConfig.systemEmailUser, }), diff --git a/client/src/Validation/validation.js b/client/src/Validation/validation.js index 089722a8d..f1811a124 100644 --- a/client/src/Validation/validation.js +++ b/client/src/Validation/validation.js @@ -295,11 +295,11 @@ const settingsValidation = joi.object({ systemEmailAddress: joi.string().allow(""), systemEmailPassword: joi.string().allow(""), systemEmailUser: joi.string().allow(""), - systemEmailConnectionHost: joi.string().allow(""), + systemEmailConnectionHost: joi.string().allow("").optional(), systemEmailTLSServername: joi.string().allow(""), - systemEmailIgnoreTLS: joi.boolean().optional(), - systemEmailRequireTLS: joi.boolean().optional(), - systemEmailRejectUnauthorized: joi.boolean().optional(), + systemEmailIgnoreTLS: joi.boolean(), + systemEmailRequireTLS: joi.boolean(), + systemEmailRejectUnauthorized: joi.boolean(), }); const dayjsValidator = (value, helpers) => { diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 610c56d0e..ca3f9dcd6 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -673,17 +673,17 @@ }, "settingsEmail": "Email", "settingsEmailDescription": "Configure the email settings for your system. This is used to send notifications and alerts.", - "settingsEmailHost": "Email host - Hostname or IP address of the SMTP server", + "settingsEmailHost": "Email host - Hostname or IP address to connect to", "settingsEmailPort": "Email port - Port to connect to", "settingsEmailAddress": "Email address - Used for authentication", "settingsEmailPassword": "Email password - Password for authentication", "settingsEmailUser": "Email user - Username for authentication, overrides email address if specified", "settingsEmailFieldResetLabel": "Password is set. Click Reset to change it.", "settingsEmailTLSServername": "TLS Servername - Optional Hostname for TLS Validation when host is an IP", - "settingsEmailIgnoreTLS": "Ignore TLS", - "settingsEmailRequireTLS": "Require TLS", + "settingsEmailIgnoreTLS": "Ignore TLS - Disable STARTTLS", + "settingsEmailRequireTLS": "Require TLS - Force STARTTLS", "settingsEmailRejectUnauthorized": "Reject Unauthorized", - "settingsEmailSecure": "Secure", + "settingsEmailSecure": "Secure - Use SSL", "settingsEmailPool": "Pool", "state": "State", "statusBreadCrumbsStatusPages": "Status Pages", @@ -714,7 +714,7 @@ "settingsTestEmailFailed": "Failed to send test email", "settingsTestEmailFailedWithReason": "Failed to send test email: {{reason}}", "settingsTestEmailUnknownError": "Unknown error", - "settingsEmailRequiredFields": "Email host and port are required", + "settingsEmailRequiredFields": "Email address, host and port are required", "statusMsg": { "paused": "Monitoring is paused.", "up": "Your site is up.", diff --git a/server/db/models/AppSettings.js b/server/db/models/AppSettings.js index c47de06fa..cd63118e9 100755 --- a/server/db/models/AppSettings.js +++ b/server/db/models/AppSettings.js @@ -32,6 +32,29 @@ const AppSettingsSchema = mongoose.Schema( type: String, default: "localhost", }, + systemEmailTLSServername: { + type: String, + }, + systemEmailSecure: { + type: Boolean, + default: false, + }, + systemEmailPool: { + type: Boolean, + default: false, + }, + systemEmailIgnoreTLS: { + type: Boolean, + default: false, + }, + systemEmailRequireTLS: { + type: Boolean, + default: false, + }, + systemEmailRejectUnauthorized: { + type: Boolean, + default: true, + }, singleton: { type: Boolean, required: true, diff --git a/server/service/emailService.js b/server/service/emailService.js index 325871fac..09123ef93 100755 --- a/server/service/emailService.js +++ b/server/service/emailService.js @@ -121,13 +121,15 @@ class EmailService { user: systemEmailUser || systemEmailAddress, pass: systemEmailPassword, }, + name: systemEmailConnectionHost || "localhost", connectionTimeout: 5000, pool: systemEmailPool, - tls: { rejectUnauthorized: systemEmailRejectUnauthorized }, - ignoreTLS: systemEmailIgnoreTLS, - requireTLS: systemEmailRequireTLS, - servername: systemEmailTLSServername, - name: systemEmailConnectionHost || "localhost", + tls: { + rejectUnauthorized: systemEmailRejectUnauthorized, + ignoreTLS: systemEmailIgnoreTLS, + requireTLS: systemEmailRequireTLS, + servername: systemEmailTLSServername, + }, }; this.transporter = this.nodemailer.createTransport(emailConfig); diff --git a/server/validation/joi.js b/server/validation/joi.js index b7858f92d..f9a7d7322 100755 --- a/server/validation/joi.js +++ b/server/validation/joi.js @@ -413,7 +413,13 @@ const updateAppSettingsBodyValidation = joi.object({ systemEmailAddress: joi.string().allow(""), systemEmailPassword: joi.string().allow(""), systemEmailUser: joi.string().allow(""), - systemEmailConnectionHost: joi.string().allow(""), + systemEmailConnectionHost: joi.string().allow("").optional(), + systemEmailTLSServername: joi.string().allow("").optional(), + systemEmailSecure: joi.boolean(), + systemEmailPool: joi.boolean(), + systemEmailIgnoreTLS: joi.boolean(), + systemEmailRequireTLS: joi.boolean(), + systemEmailRejectUnauthorized: joi.boolean(), }); //**************************************** @@ -622,11 +628,11 @@ const sendTestEmailBodyValidation = joi.object({ systemEmailAddress: joi.string(), systemEmailPassword: joi.string(), systemEmailUser: joi.string(), - systemEmailConnectionHost: joi.string(), + systemEmailConnectionHost: joi.string().allow("").optional(), systemEmailIgnoreTLS: joi.boolean(), systemEmailRequireTLS: joi.boolean(), systemEmailRejectUnauthorized: joi.boolean(), - systemEmailTLSServername: joi.string(), + systemEmailTLSServername: joi.string().allow("").optional(), }); export { From d19bbf2b8e195c0bb658794e1f5788a4c1f17f26 Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Fri, 13 Jun 2025 14:15:37 +0530 Subject: [PATCH 7/9] Hide send email button until validation is complete --- client/src/Pages/Settings/SettingsEmail.jsx | 21 +++++++++++---------- client/src/locales/en.json | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index 50f90c38f..81de64392 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -136,8 +136,7 @@ const SettingsEmail = ({ @@ -250,14 +249,16 @@ const SettingsEmail = ({ /> - + {systemEmailHost && systemEmailPort && systemEmailAddress && ( + + )} diff --git a/client/src/locales/en.json b/client/src/locales/en.json index ca3f9dcd6..86d7a8169 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -684,7 +684,7 @@ "settingsEmailRequireTLS": "Require TLS - Force STARTTLS", "settingsEmailRejectUnauthorized": "Reject Unauthorized", "settingsEmailSecure": "Secure - Use SSL", - "settingsEmailPool": "Pool", + "settingsEmailPool": "Pool - Enable connection pooling", "state": "State", "statusBreadCrumbsStatusPages": "Status Pages", "statusBreadCrumbsDetails": "Details", From 2d839285f28528d8174fd0bdf5c20e8478dc1377 Mon Sep 17 00:00:00 2001 From: Br0wnHammer Date: Fri, 13 Jun 2025 20:40:01 +0530 Subject: [PATCH 8/9] Switch Buttons Position --- client/src/Pages/Settings/SettingsEmail.jsx | 50 +++++++++------------ 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index 81de64392..b6ccaf344 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -133,26 +133,6 @@ const SettingsEmail = ({ onChange={handleChange} /> - - {t("settingsEmailSecure")} - - {t("settingsEmailPool")} - - {t("settingsEmailUser")} + + {t("settingsEmailConnectionHost")} + + + {t("settingsEmailSecure")} + + {t("settingsEmailPool")} + {t("settingsEmailIgnoreTLS")} - - {t("settingsEmailConnectionHost")} - - {systemEmailHost && systemEmailPort && systemEmailAddress && ( - )} + {systemEmailHost && + systemEmailPort && + systemEmailAddress && + systemEmailPassword && ( + + )} diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 86d7a8169..387b06a9f 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -714,7 +714,7 @@ "settingsTestEmailFailed": "Failed to send test email", "settingsTestEmailFailedWithReason": "Failed to send test email: {{reason}}", "settingsTestEmailUnknownError": "Unknown error", - "settingsEmailRequiredFields": "Email address, host and port are required", + "settingsEmailRequiredFields": "Email address, host, port and password are required", "statusMsg": { "paused": "Monitoring is paused.", "up": "Your site is up.",