From 4929a4729d6e7fca7d72aa27237b3a938f8e7833 Mon Sep 17 00:00:00 2001 From: Marcus Schopen Date: Mon, 11 Nov 2019 22:55:25 +0100 Subject: [PATCH 1/2] set email full From: header for msg sender and full To: header of rcpt --- app/lib/server/functions/notifications/email.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/lib/server/functions/notifications/email.js b/app/lib/server/functions/notifications/email.js index d83be528ea731..9600b0e499b48 100644 --- a/app/lib/server/functions/notifications/email.js +++ b/app/lib/server/functions/notifications/email.js @@ -7,6 +7,7 @@ import { settings } from '../../../../settings'; import { roomTypes } from '../../../../utils'; import { metrics } from '../../../../metrics'; import { callbacks } from '../../../../callbacks'; +import { Users } from '../../../../models'; let advice = ''; let goToMessage = ''; @@ -125,8 +126,18 @@ export function sendEmail({ message, user, subscription, room, emailAddress, has }, }; - email.from = `${ String(username).replace(/@/g, '%40').replace(/[<>,]/g, '') } <${ settings.get('From_Email') }>`; + // email header From: and To: fix + const sender = Users.findOne({ _id: message.u._id }); + const recipient = Users.findOneByEmailAddress(emailAddress); + email.to = `${ recipient.name } <${ emailAddress }>`; + + email.from = `${ String(username).replace(/@/g, '%40').replace(/[<>,]/g, '') } <${ settings.get('From_Email') }>`; + + if (sender.emails[0].address && sender.emails[0].address.length !== 0) { + email.from = `${ String(sender.name).replace(/@/g, '%40').replace(/[<>,]/g, '') } <${ sender.emails[0].address }>`; + }; + // If direct reply enabled, email content with headers if (settings.get('Direct_Reply_Enable')) { const replyto = settings.get('Direct_Reply_ReplyTo') || settings.get('Direct_Reply_Username'); From 44f402ad0a2899e39f51e56508d1f0546863ba68 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Wed, 13 Nov 2019 21:00:27 -0300 Subject: [PATCH 2/2] Always set reply-to --- .../server/functions/notifications/email.js | 48 +++++++++++-------- .../server/lib/sendNotificationsOnMessage.js | 10 +++- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/app/lib/server/functions/notifications/email.js b/app/lib/server/functions/notifications/email.js index 9600b0e499b48..59dbd8a71ca75 100644 --- a/app/lib/server/functions/notifications/email.js +++ b/app/lib/server/functions/notifications/email.js @@ -7,7 +7,6 @@ import { settings } from '../../../../settings'; import { roomTypes } from '../../../../utils'; import { metrics } from '../../../../metrics'; import { callbacks } from '../../../../callbacks'; -import { Users } from '../../../../models'; let advice = ''; let goToMessage = ''; @@ -95,7 +94,19 @@ function getEmailContent({ message, user, room }) { return header; } -export function sendEmail({ message, user, subscription, room, emailAddress, hasMentionToUser }) { +function generateNameEmail(name, email) { + return `${ String(name).replace(/@/g, '%40').replace(/[<>,]/g, '') } <${ email }>`; +} + +export function sendEmail({ + message, + receiver, + sender, + subscription, + room, + emailAddress, + hasMentionToUser, +}) { const username = settings.get('UI_Use_Real_Name') ? message.u.name || message.u.username : message.u.username; let subjectKey = 'Offline_Mention_All_Email'; @@ -111,40 +122,37 @@ export function sendEmail({ message, user, subscription, room, emailAddress, has }); const content = getEmailContent({ message, - user, + user: receiver, room, }); const room_path = roomTypes.getURL(room.t, subscription); + const receiverName = settings.get('UI_Use_Real_Name') + ? receiver.name || receiver.username + : receiver.username; + + const [senderEmail] = sender.emails; + const email = { - to: emailAddress, + from: generateNameEmail(username, settings.get('From_Email')), + to: generateNameEmail(receiverName, emailAddress), subject: emailSubject, html: content + goToMessage + (settings.get('Direct_Reply_Enable') ? advice : ''), data: { room_path, }, + headers: { + 'Reply-To': generateNameEmail(username, senderEmail.address), + }, }; - // email header From: and To: fix - const sender = Users.findOne({ _id: message.u._id }); - - const recipient = Users.findOneByEmailAddress(emailAddress); - email.to = `${ recipient.name } <${ emailAddress }>`; - - email.from = `${ String(username).replace(/@/g, '%40').replace(/[<>,]/g, '') } <${ settings.get('From_Email') }>`; - - if (sender.emails[0].address && sender.emails[0].address.length !== 0) { - email.from = `${ String(sender.name).replace(/@/g, '%40').replace(/[<>,]/g, '') } <${ sender.emails[0].address }>`; - }; - // If direct reply enabled, email content with headers if (settings.get('Direct_Reply_Enable')) { const replyto = settings.get('Direct_Reply_ReplyTo') || settings.get('Direct_Reply_Username'); - email.headers = { - // Reply-To header with format "username+messageId@domain" - 'Reply-To': `${ replyto.split('@')[0].split(settings.get('Direct_Reply_Separator'))[0] }${ settings.get('Direct_Reply_Separator') }${ message._id }@${ replyto.split('@')[1] }`, - }; + + // Reply-To header with format "username+messageId@domain" + email.headers['Reply-To'] = `${ replyto.split('@')[0].split(settings.get('Direct_Reply_Separator'))[0] }${ settings.get('Direct_Reply_Separator') }${ message._id }@${ replyto.split('@')[1] }`; } metrics.notificationsSent.inc({ notification_type: 'email' }); diff --git a/app/lib/server/lib/sendNotificationsOnMessage.js b/app/lib/server/lib/sendNotificationsOnMessage.js index c64a3b092185b..98903237d2e82 100644 --- a/app/lib/server/lib/sendNotificationsOnMessage.js +++ b/app/lib/server/lib/sendNotificationsOnMessage.js @@ -142,7 +142,15 @@ export const sendNotification = async ({ })) { receiver.emails.some((email) => { if (email.verified) { - sendEmail({ message, receiver, subscription, room, emailAddress: email.address, hasMentionToUser }); + sendEmail({ + message, + receiver, + sender, + subscription, + room, + emailAddress: email.address, + hasMentionToUser, + }); return true; }