From 735bc73c96c9d7350fbe8f4b59dabf5a27bd4a65 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Tue, 28 Apr 2026 14:17:03 +0530 Subject: [PATCH] fix: Preserve single newlines in outgoing email messages (#14138) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request Template ## Description This PR fixes an issue where outgoing Email messages (via API) do not preserve single line breaks in rendered HTML. #### Cause Messages are stored with `\n`, but rendering differs: * **Other channel** (`markdown-it`, `breaks: true`) → `\n` → `
` * **Email** (CommonMark) without `HARDBREAKS` → `\n` collapsed into spaces Result: multi-line messages appear as a single paragraph in Email. #### Solution * Added `hardbreaks:` option to `render_message` (default: false) * Enabled `hardbreaks: true` in `EmailHelper#render_email_html` This ensures `\n` renders as `
` in Email, matching web widget behavior. Fixes https://linear.app/chatwoot/issue/CW-6941/outgoing-email-messages-strip-single-newlines-from-plain-text-content ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? #### Screenshots **Before** image **After** image ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Co-authored-by: Muhsin Keloth --- app/helpers/email_helper.rb | 2 +- lib/chatwoot_markdown_renderer.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/email_helper.rb b/app/helpers/email_helper.rb index fcc8b463d..67e8d953d 100644 --- a/app/helpers/email_helper.rb +++ b/app/helpers/email_helper.rb @@ -7,7 +7,7 @@ module EmailHelper def render_email_html(content) return '' if content.blank? - ChatwootMarkdownRenderer.new(content).render_message.to_s + ChatwootMarkdownRenderer.new(content).render_message(hardbreaks: true).to_s end # Raise a standard error if any email address is invalid diff --git a/lib/chatwoot_markdown_renderer.rb b/lib/chatwoot_markdown_renderer.rb index c7adac30a..58f1ec189 100644 --- a/lib/chatwoot_markdown_renderer.rb +++ b/lib/chatwoot_markdown_renderer.rb @@ -3,8 +3,8 @@ class ChatwootMarkdownRenderer @content = content end - def render_message - markdown_renderer = BaseMarkdownRenderer.new + def render_message(hardbreaks: false) + markdown_renderer = BaseMarkdownRenderer.new(options: hardbreaks ? [:HARDBREAKS] : :DEFAULT) doc = CommonMarker.render_doc(@content, :DEFAULT, [:strikethrough, :autolink]) html = markdown_renderer.render(doc) render_as_html_safe(html)