notifications: per user email prefs

This commit is contained in:
Girish Ramakrishnan
2024-12-11 18:24:20 +01:00
parent 746e694d7e
commit 6004cd17bf
12 changed files with 130 additions and 27 deletions

View File

@@ -34,12 +34,13 @@ const MAIL_TEMPLATES_DIR = path.join(__dirname, 'mail_templates');
// This will collect the most common details required for notification emails
async function getMailConfig() {
const cloudronName = await branding.getCloudronName();
const { domain:dashboardDomain } = await dashboard.getLocation();
const { fqdn:dashboardFqdn, domain:dashboardDomain } = await dashboard.getLocation();
return {
cloudronName,
notificationFrom: `"${cloudronName}" <no-reply@${dashboardDomain}>`,
supportEmail: 'support@cloudron.io'
supportEmail: 'support@cloudron.io',
dashboardFqdn
};
}
@@ -99,15 +100,14 @@ async function sendInvite(user, invitor, email, inviteLink) {
const mailConfig = await getMailConfig();
const translationAssets = await translations.getTranslations();
const { fqdn:dashboardFqdn } = await dashboard.getLocation();
const templateData = {
user: user.displayName || user.username || user.email,
webadminUrl: `https://${dashboardFqdn}`,
webadminUrl: `https://${mailConfig.dashboardFqdn}`,
inviteLink: inviteLink,
invitor: invitor ? invitor.email : null,
cloudronName: mailConfig.cloudronName,
cloudronAvatarUrl: `https://${dashboardFqdn}/api/v1/cloudron/avatar`
cloudronAvatarUrl: `https://${mailConfig.dashboardFqdn}/api/v1/cloudron/avatar`
};
const mailOptions = {
@@ -134,7 +134,6 @@ async function sendNewLoginLocation(user, loginLocation) {
const mailConfig = await getMailConfig();
const translationAssets = await translations.getTranslations();
const { fqdn:dashboardFqdn } = await dashboard.getLocation();
const templateData = {
user: user.displayName || user.username || user.email,
@@ -143,7 +142,7 @@ async function sendNewLoginLocation(user, loginLocation) {
country,
city,
cloudronName: mailConfig.cloudronName,
cloudronAvatarUrl: `https://${dashboardFqdn}/api/v1/cloudron/avatar`
cloudronAvatarUrl: `https://${mailConfig.dashboardFqdn}/api/v1/cloudron/avatar`
};
const mailOptions = {
@@ -164,13 +163,12 @@ async function passwordReset(user, email, resetLink) {
const mailConfig = await getMailConfig();
const translationAssets = await translations.getTranslations();
const { fqdn:dashboardFqdn } = await dashboard.getLocation();
const templateData = {
user: user.displayName || user.username || user.email,
resetLink: resetLink,
cloudronName: mailConfig.cloudronName,
cloudronAvatarUrl: `https://${dashboardFqdn}/api/v1/cloudron/avatar`
cloudronAvatarUrl: `https://${mailConfig.dashboardFqdn}/api/v1/cloudron/avatar`
};
const mailOptions = {
@@ -190,12 +188,13 @@ async function backupFailed(mailTo, errorMessage, logUrl) {
assert.strictEqual(typeof logUrl, 'string');
const mailConfig = await getMailConfig();
const notificationsUrl = `https://${mailConfig.dashboardFqdn}/cloudron/#/notifications`;
const mailOptions = {
from: mailConfig.notificationFrom,
to: mailTo,
subject: `[${mailConfig.cloudronName}] Failed to backup`,
text: render('backup_failed.ejs', { cloudronName: mailConfig.cloudronName, message: errorMessage, logUrl })
text: render('backup_failed.ejs', { cloudronName: mailConfig.cloudronName, message: errorMessage, logUrl, notificationsUrl })
};
await sendMail(mailOptions);
@@ -207,12 +206,13 @@ async function certificateRenewalError(mailTo, domain, message) {
assert.strictEqual(typeof message, 'string');
const mailConfig = await getMailConfig();
const notificationsUrl = `https://${mailConfig.dashboardFqdn}/cloudron/#/notifications`;
const mailOptions = {
from: mailConfig.notificationFrom,
to: mailTo,
subject: `[${mailConfig.cloudronName}] Certificate renewal error`,
text: render('certificate_renewal_error.ejs', { domain, message })
text: render('certificate_renewal_error.ejs', { domain, message, notificationsUrl })
};
await sendMail(mailOptions);