Evaluate mailer from address at runtime

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.
This commit is contained in:
Javi Martín
2019-09-06 15:09:35 +02:00
parent 233e65f18c
commit 66da02f1de
4 changed files with 20 additions and 6 deletions

View File

@@ -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

View File

@@ -12,11 +12,7 @@ Devise.setup do |config|
# 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"

View File

@@ -12,5 +12,14 @@ describe DeviseMailer do
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

View File

@@ -13,5 +13,14 @@ describe Mailer do
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