From 4e04c4dddd9657b977d4dde85edf0e5a5b54397d Mon Sep 17 00:00:00 2001 From: Anton Batenev Date: Sun, 7 Jul 2013 04:37:44 +0400 Subject: [PATCH 1/3] Add custom headers for email messages See http://meta.discourse.org/t/custom-headers-in-emails-site-settings/7480 --- app/models/site_setting.rb | 1 + config/locales/server.en.yml | 1 + lib/email/message_builder.rb | 13 +++++++++++++ spec/components/email/message_builder_spec.rb | 11 +++++++++++ 4 files changed, 26 insertions(+) diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index 1164ce6bc82..a4c1b937e39 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -129,6 +129,7 @@ class SiteSetting < ActiveRecord::Base # we need to think of a way to force users to enter certain settings, this is a minimal config thing setting(:notification_email, 'info@discourse.org') + setting(:email_custom_headers, 'Precedence: bulk|Auto-Submitted: auto-generated') setting(:allow_index_in_robots_txt, true) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 2745d5c9364..fa7e6faf01e 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -477,6 +477,7 @@ en: apple_touch_icon_url: "Icon used for Apple touch devices. Recommended size is 144px by 144px." notification_email: "The return email address used when sending system emails such as notifying users of lost passwords, new accounts etc" + email_custom_headers: "A pipe-delimited list of custom email headers" use_ssl: "Should the site be accessible via SSL? (NOT IMPLEMENTED, EXPERIMENTAL)" best_of_score_threshold: "The minimum score of a post to be included in the 'best of'" best_of_posts_required: "Minimum posts in a topic before 'best of' mode is enabled" diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb index 10bc3f21dfb..da58a0c1004 100644 --- a/lib/email/message_builder.rb +++ b/lib/email/message_builder.rb @@ -75,6 +75,19 @@ module Email result['Reply-To'] = from_value end + result.merge(MessageBuilder.custom_headers(SiteSetting.email_custom_headers)) + end + + def self.custom_headers(string) + result = {} + string.split('|').each { |item| + header = item.split(':', 2) + if header.length == 2 + name = header[0].strip + value = header[1].strip + result[name] = value if name.length > 0 && value.length > 0 + end + } result end diff --git a/spec/components/email/message_builder_spec.rb b/spec/components/email/message_builder_spec.rb index 944100893a0..9d2ec3e00be 100644 --- a/spec/components/email/message_builder_spec.rb +++ b/spec/components/email/message_builder_spec.rb @@ -75,6 +75,17 @@ describe Email::MessageBuilder do end + context "custom headers" do + + let(:custom_headers_string) { " Precedence : bulk | :: | No-colon | No-Value: | Multi-colon : : value : : | Auto-Submitted : auto-generated " } + let(:custom_headers_result) { { "Precedence" => "bulk", "Multi-colon" => ": value : :", "Auto-Submitted" => "auto-generated" } } + + it "custom headers builder" do + expect(Email::MessageBuilder.custom_headers(custom_headers_string)).to eq(custom_headers_result) + end + + end + context "header args" do let(:message_with_header_args) { Email::MessageBuilder.new(to_address, From b0dbb0ea13e02f18075e2a6f95f231a17a95bd27 Mon Sep 17 00:00:00 2001 From: Anton Batenev Date: Tue, 9 Jul 2013 20:19:10 +0400 Subject: [PATCH 2/3] And add tests for empty string & null --- app/models/site_setting.rb | 2 +- lib/email/message_builder.rb | 2 +- spec/components/email/message_builder_spec.rb | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index a4c1b937e39..90d11db4387 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -129,7 +129,7 @@ class SiteSetting < ActiveRecord::Base # we need to think of a way to force users to enter certain settings, this is a minimal config thing setting(:notification_email, 'info@discourse.org') - setting(:email_custom_headers, 'Precedence: bulk|Auto-Submitted: auto-generated') + setting(:email_custom_headers, 'Auto-Submitted: auto-generated') setting(:allow_index_in_robots_txt, true) diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb index da58a0c1004..e376450f107 100644 --- a/lib/email/message_builder.rb +++ b/lib/email/message_builder.rb @@ -87,7 +87,7 @@ module Email value = header[1].strip result[name] = value if name.length > 0 && value.length > 0 end - } + } if !string.nil? result end diff --git a/spec/components/email/message_builder_spec.rb b/spec/components/email/message_builder_spec.rb index 9d2ec3e00be..3e1310e63a3 100644 --- a/spec/components/email/message_builder_spec.rb +++ b/spec/components/email/message_builder_spec.rb @@ -84,6 +84,14 @@ describe Email::MessageBuilder do expect(Email::MessageBuilder.custom_headers(custom_headers_string)).to eq(custom_headers_result) end + it "empty headers builder" do + expect(Email::MessageBuilder.custom_headers("")).to eq({}) + end + + it "null headers builder" do + expect(Email::MessageBuilder.custom_headers(nil)).to eq({}) + end + end context "header args" do From 60c49a85d0bc72a8e831ff64b0520e2640be5f58 Mon Sep 17 00:00:00 2001 From: Anton Batenev Date: Wed, 10 Jul 2013 17:47:38 +0400 Subject: [PATCH 3/3] Refactoring #1157 --- lib/email/message_builder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb index e376450f107..3d0687ee0f4 100644 --- a/lib/email/message_builder.rb +++ b/lib/email/message_builder.rb @@ -87,7 +87,7 @@ module Email value = header[1].strip result[name] = value if name.length > 0 && value.length > 0 end - } if !string.nil? + } unless string.nil? result end