Rails ActionMailer - формат отправителя и имя получателя/адрес электронной почты
Есть ли способ указать адрес электронной почты и имя для отправителя и получателя при использовании ActionMailer?
Обычно вы делаете:
@recipients = "#{user.email}"
@from = "[email protected]"
@subject = "Hi"
@content_type = "text/html"
Но я также хочу указать имя - MyCompany <[email protected]>
, John Doe <[email protected]>
.
Есть ли способ сделать это?
Ответы
Ответ 1
Если вы берете пользовательский ввод для имени и электронной почты, то, если вы не очень тщательно проверяете или не удаляете имя и адрес электронной почты, вы можете получить недопустимый заголовок From, просто конкатенируя строки. Вот безопасный способ:
require 'mail'
address = Mail::Address.new email # ex: "[email protected]"
address.display_name = name.dup # ex: "John Doe"
# Set the From or Reply-To header to the following:
address.format # returns "John Doe <[email protected]>"
Ответ 2
@recipients = "\"#{user.name}\" <#{user.email}>"
@from = "\"MyCompany\" <[email protected]>"
Ответ 3
В rails3 я помещаю следующее в каждую среду. т.е. production.rb
ActionMailer::Base.default :from => "Company Name <[email protected]>"
Размещение котировок вокруг имени компании не работало для меня в Rails3.
Ответ 4
в Rails 2.3.3 была введена ошибка в ActionMailer. Вы можете увидеть билет здесь Ticket # 2340. Он разрешился в 2-3-стабильной и ведущей, поэтому он будет зафиксирован в 3.x и 2.3.6.
Для устранения проблемы в 2.3. * вы можете использовать код, указанный в комментариях к билетам:
module ActionMailer
class Base
def perform_delivery_smtp(mail)
destinations = mail.destinations
mail.ready_to_send
sender = (mail['return-path'] && mail['return-path'].spec) || Array(mail.from).first
smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
smtp_settings[:authentication]) do |smtp|
smtp.sendmail(mail.encoded, sender, destinations)
end
end
end
end
Ответ 5
Версия, которую я хотел бы использовать, это
%`"#{account.full_name}" <#{account.email}>`
`< являются backticks.
Update
Вы также можете изменить это на
%|"#{account.full_name}" <#{account.email}>|
%\"#{account.full_name}" <#{account.email}>\
%^"#{account.full_name}" <#{account.email}>^
%["#{account.full_name}" <#{account.email}>]
Подробнее о строковых литералах.
Ответ 6
Другим раздражающим аспектом, по крайней мере, с новым форматом AR, является запоминание того, что на уровне класса вызывается "default". Обрабатывающие процедуры, которые являются экземплярами, только заставляют его молча проваливаться и давать, когда вы пытаетесь его использовать:
NoMethodError: undefined method `new_post' for Notifier:Class
Вот что я в итоге использовал:
def self.named_email(name,email) "\"#{name}\" <#{email}>" end
default :from => named_email(user.name, user.email)