October 22, 2019
This blog is part of our Rails 6 series.
When using ActionMailer::Base#mail
, if we want to display name and email
address of the user in email, we can pass a string in format
"John Smith" <[email protected]>
in to
, from
or reply_to
options.
Before Rails 6, we had to join name and email address using string interpolation as mentioned in Rails 5.2 Guides and shown below.
email_with_name = %("John Smith" <[email protected]>)
mail(
to: email_with_name,
subject: 'Hey Rails 5.2!'
)
Problem with string interpolation is it doesn't escape unexpected special characters like quotes(") in the name.
Here's an example.
irb(main):001:0> %("John P Smith" <[email protected]>)
=> "\"John P Smith\" <[email protected]>"
irb(main):002:0> %('John "P" Smith' <[email protected]>)
=> "'John \"P\" Smith' <[email protected]>"
Rails 6 adds
ActionMailer::Base#email_address_with_name
to join name and email address in the format "John Smith" <[email protected]>
and take care of escaping special characters.
irb(main):001:0> ActionMailer::Base.email_address_with_name("[email protected]", "John P Smith")
=> "John P Smith <[email protected]>"
irb(main):002:0> ActionMailer::Base.email_address_with_name("[email protected]", 'John "P" Smith')
=> "\"John \\\"P\\\" Smith\" <[email protected]>"
mail(
to: email_address_with_name("[email protected]", "John Smith"),
subject: 'Hey Rails 6!'
)
Here's the relevant pull request for this change.
If this blog was helpful, check out our full blog archive.