Skip to content

Commit

Permalink
Evaluate mailer from address at runtime
Browse files Browse the repository at this point in the history
We're reading the value from the database, but the
`ApplicationMailer.default` method is evaluated when the application is
started. So if we don't use a Proc, we'll need to restart the server
every time we change the value in the database, or else the old value
will still be used.

Using a Proc makes sure the mailer from address is evaluated at runtime,
so emails are sent using the from address currently defined in the
database.

The same situation took place using the devise mailer. Now we don't need
to check for the settings table being present because the Proc in the
devise initializer won't be evaluated before the settings table is
created and populated.
  • Loading branch information
javierm committed Sep 6, 2019
1 parent bbb4a6a commit 98b4460
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
2 changes: 1 addition & 1 deletion app/mailers/application_mailer.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
class ApplicationMailer < ActionMailer::Base
helper :settings
helper :application
default from: "#{Setting["mailer_from_name"]} <#{Setting["mailer_from_address"]}>"
default from: Proc.new { "#{Setting["mailer_from_name"]} <#{Setting["mailer_from_address"]}>" }
layout "mailer"
end
6 changes: 1 addition & 5 deletions config/initializers/devise.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,7 @@
# Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class
# with default "from" parameter.
if Rails.env.test? || !ActiveRecord::Base.connection.data_source_exists?("settings")
config.mailer_sender = "noreply@consul.dev"
else
config.mailer_sender = "'#{Setting["mailer_from_name"]}' <#{Setting["mailer_from_address"]}>"
end
config.mailer_sender = Proc.new { "'#{Setting["mailer_from_name"]}' <#{Setting["mailer_from_address"]}>" }

# Configure the class responsible to send e-mails.
config.mailer = "DeviseMailer"
Expand Down
9 changes: 9 additions & 0 deletions spec/mailers/devise_mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,14 @@

expect(email.subject).to include("confirmación")
end

it "reads the from address at runtime" do
Setting["mailer_from_name"] = "New organization"
Setting["mailer_from_address"] = "new@consul.dev"

email = DeviseMailer.confirmation_instructions(create(:user), "ABC")

expect(email).to deliver_from "'New organization' <new@consul.dev>"
end
end
end
9 changes: 9 additions & 0 deletions spec/mailers/mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,14 @@

expect(email.subject).to include("comentado")
end

it "reads the from address at runtime" do
Setting["mailer_from_name"] = "New organization"
Setting["mailer_from_address"] = "new@consul.dev"

email = Mailer.comment(create(:comment))

expect(email).to deliver_from "New organization <new@consul.dev>"
end
end
end

0 comments on commit 98b4460

Please sign in to comment.