diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 9613ce95afcc..c91d596529f2 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1930,6 +1930,10 @@ "Username_is_already_in_here": "`@%s` is already in here.", "Username_is_not_in_this_room": "The user `#%s` is not in this room.", "Username_Placeholder": "Please enter usernames...", + "User_sent_a_message_on_channel": "__username__ sent a message on __channel__:", + "User_uploaded_a_file_on_channel": "__username__ uploaded a file on __channel__:", + "User_sent_a_message_to_you": "__username__ sent you a message:", + "User_uploaded_a_file_to_you": "__username__ sent you a file:", "Username_title": "Register username", "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ wants to start OTR. Do you want to accept?", "Users": "Users", diff --git a/packages/rocketchat-i18n/i18n/pt.i18n.json b/packages/rocketchat-i18n/i18n/pt.i18n.json index 39bced0b33f8..8d3b571611f4 100644 --- a/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -1246,6 +1246,10 @@ "User_removed": "Usuário removido", "User_removed_by": "Usuário __user_removed__ removido da conversa por __user_by__.", "User_Settings": "Configurações do Usuário", + "User_sent_a_message_on_channel": "__username__ enviou uma mensagem em __channel__:", + "User_uploaded_a_file_on_channel": "__username__ enviou um arquivo em __channel__:", + "User_sent_a_message_to_you": "__username__ enviou uma mensagem para você:", + "User_uploaded_a_file_to_you": "__username__ enviou um arquivo para você:", "User_unmuted_by": "__user_by__ permitiu que __user_unmuted__ fale na sala.", "User_unmuted_in_room": "Usuário pode falar na sala", "User_updated_successfully": "Usuário atualizado com sucesso", diff --git a/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js b/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js index 28219a3394ca..336bcf6f4821 100644 --- a/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js +++ b/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js @@ -1,6 +1,57 @@ import moment from 'moment'; import s from 'underscore.string'; +function getEmailContent({ messageContent, message, user, room }) { + const lng = user && user.language || RocketChat.settings.get('language') || 'en'; + + const roomName = `#${ RocketChat.settings.get('UI_Allow_room_names_with_special_chars') ? room.fname || room.name : room.name }`; + + const userName = RocketChat.settings.get('UI_Use_Real_Name') ? message.u.name || message.u.username : message.u.username; + + const header = TAPi18n.__(room.t === 'd' ? 'User_sent_a_message_to_you' : 'User_sent_a_message_on_channel', { + username: userName, + channel: roomName, + lng + }); + + if (messageContent) { + return `${ header }

${ messageContent }`; + } + + if (message.file) { + const fileHeader = TAPi18n.__(room.t === 'd' ? 'User_uploaded_a_file_to_you' : 'User_uploaded_a_file_on_channel', { + username: userName, + channel: roomName, + lng + }); + + let content = `${ TAPi18n.__('Attachment_File_Uploaded') }: ${ message.file.name }`; + + if (message.attachments && message.attachments.length === 1 && message.attachments[0].description !== '') { + content += `

${ message.attachments[0].description }`; + } + + return `${ fileHeader }

${ content }`; + } + + if (message.attachments.length > 0) { + const [ attachment ] = message.attachments; + + let content = ''; + + if (attachment.title) { + content += `${ attachment.title }
`; + } + if (attachment.text) { + content += `${ attachment.text }
`; + } + + return `${ header }

${ content }`; + } + + return header; +} + RocketChat.callbacks.add('afterSaveMessage', function(message, room) { // skips this callback if the message was edited if (message.editedAt) { @@ -26,19 +77,23 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) { }; const divisorMessage = '
'; - let messageHTML = s.escapeHTML(message.msg); - message = RocketChat.callbacks.run('renderMessage', message); - if (message.tokens && message.tokens.length > 0) { - message.tokens.forEach((token) => { - token.text = token.text.replace(/([^\$])(\$[^\$])/gm, '$1$$$2'); - messageHTML = messageHTML.replace(token.token, token.text); - }); + let messageHTML; + + if (message.msg !== '') { + messageHTML = s.escapeHTML(message.msg); + message = RocketChat.callbacks.run('renderMessage', message); + if (message.tokens && message.tokens.length > 0) { + message.tokens.forEach((token) => { + token.text = token.text.replace(/([^\$])(\$[^\$])/gm, '$1$$$2'); + messageHTML = messageHTML.replace(token.token, token.text); + }); + } + messageHTML = messageHTML.replace(/\n/gm, '
'); } const header = RocketChat.placeholders.replace(RocketChat.settings.get('Email_Header') || ''); let footer = RocketChat.placeholders.replace(RocketChat.settings.get('Email_Footer') || ''); - messageHTML = messageHTML.replace(/\n/gm, '
'); const usersToSendEmail = {}; if (room.t === 'd') { @@ -166,11 +221,17 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) { } user.emails.some((email) => { if (email.verified) { + const content = getEmailContent({ + messageContent: messageHTML, + message, + user, + room + }); email = { to: email.address, from: RocketChat.settings.get('From_Email'), subject: emailSubject, - html: header + messageHTML + divisorMessage + (linkByUser[user._id] || defaultLink) + footer + html: header + content + divisorMessage + (linkByUser[user._id] || defaultLink) + footer }; // If direct reply enabled, email content with headers if (RocketChat.settings.get('Direct_Reply_Enable')) { diff --git a/packages/rocketchat-lib/server/models/Users.js b/packages/rocketchat-lib/server/models/Users.js index c7c9f941cfe3..dbfc705822c7 100644 --- a/packages/rocketchat-lib/server/models/Users.js +++ b/packages/rocketchat-lib/server/models/Users.js @@ -541,7 +541,17 @@ Find users to send a message by email if: 'emails.verified': true }; - return this.find(query, { fields: { name: 1, username: 1, emails: 1, 'settings.preferences.emailNotificationMode': 1 } }); + const options = { + fields: { + name: 1, + username: 1, + emails: 1, + 'settings.preferences.emailNotificationMode': 1, + language: 1 + } + }; + + return this.find(query, options); } }