From 419c84ab39151b4068c267f82475c41d1be288ba Mon Sep 17 00:00:00 2001 From: eelco Date: Thu, 13 Nov 2025 10:43:03 +0700 Subject: [PATCH] Include reply-to, cc + bcc in logging output --- lib/courrier/email/providers/logger.rb | 25 +++++++++++++++++--- test/courrier/email/providers/logger_test.rb | 20 +++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/courrier/email/providers/logger.rb b/lib/courrier/email/providers/logger.rb index 759f4b0..f7c5945 100644 --- a/lib/courrier/email/providers/logger.rb +++ b/lib/courrier/email/providers/logger.rb @@ -21,9 +21,7 @@ def format_email_using(options) <<~EMAIL #{separator} Timestamp: #{Time.now.strftime("%Y-%m-%d %H:%M:%S %z")} - From: #{@options.from} - To: #{@options.to} - Subject: #{@options.subject} + #{meta_fields(from: options)} Text: #{@options.text || "(empty)"} @@ -35,6 +33,27 @@ def format_email_using(options) end def separator = "-" * 80 + + def meta_fields(from:) + fields = [ + [:from, "From"], + [:to, "To"], + [:reply_to, "Reply-To"], + [:cc, "Cc"], + [:bcc, "Bcc"], + [:subject, "Subject"] + ] + + fields.map do |field, label| + value = from.send(field) + + next if value.nil? || value.to_s.strip.empty? + + "#{label}:".ljust(11) + value + rescue NoMatchingPatternError + nil + end.compact.join("\n") + end end end end diff --git a/test/courrier/email/providers/logger_test.rb b/test/courrier/email/providers/logger_test.rb index df7745e..2de4e65 100644 --- a/test/courrier/email/providers/logger_test.rb +++ b/test/courrier/email/providers/logger_test.rb @@ -7,7 +7,8 @@ class LoggerTest < Minitest::Test def test_formats_email_for_logging email = TestEmail.new( from: "devs@railsdesigner.com", - to: "recipient@railsdesigner.com" + to: "recipient@railsdesigner.com", + reply_to: "support@railsdesigner.com" ) logger = Logger.new(options: email.options) @@ -20,6 +21,23 @@ def test_formats_email_for_logging assert_includes output, "HTML:\n

Test HTML Body

" end + def test_formats_optional_meta_fields_for_logging + email = TestEmail.new( + from: "devs@chirpform.com", + to: "recipient@chirpform.com", + reply_to: "reply-to@chirpform.com", + cc: "cc@chirpform.com", + bcc: "bcc@chirpform.com" + ) + logger = Logger.new(options: email.options) + + output = capture_logger_output { logger.deliver } + + assert_includes output, "Reply-To: reply-to@chirpform.com" + assert_includes output, "Cc: cc@chirpform.com" + assert_includes output, "Bcc: bcc@chirpform.com" + end + private def capture_logger_output