Rails ActionMailer - форматирует имя отправителя и получателя / адрес электронной почты - PullRequest
108 голосов
/ 05 июня 2009

Можно ли указать адрес электронной почты и имя отправителя и получателя при использовании ActionMailer?

Обычно вы делаете:

@recipients   = "#{user.email}"
@from         = "info@mycompany.com"
@subject      = "Hi"
@content_type = "text/html"

Но я также хочу указать имя - MyCompany <info@mycompany.com>, John Doe <john.doe@mycompany>.

Есть ли способ сделать это?

Ответы [ 6 ]

230 голосов
/ 12 ноября 2011

Если вы принимаете пользовательский ввод для имени и адреса электронной почты, то, если вы не будете очень тщательно проверять или исключать имя и адрес электронной почты, вы можете получить недопустимый заголовок From, просто объединяя строки. Вот безопасный способ:

require 'mail'
address = Mail::Address.new email # ex: "john@example.com"
address.display_name = name.dup   # ex: "John Doe"
# Set the From or Reply-To header to the following:
address.format # returns "John Doe <john@example.com>"
97 голосов
/ 05 июня 2009
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"
42 голосов
/ 23 февраля 2011

В рельсах3 я размещаю следующее в каждой среде. то есть производство. rb

ActionMailer::Base.default :from => "Company Name <no-reply@production-server.ca>"

Размещение цитат вокруг названия компании не помогло мне в Rails3.

8 голосов
/ 24 января 2010

в Rails 2.3.3 была введена ошибка в ActionMailer. Вы можете увидеть билет здесь Билет № 2340 . Он разрешен в 2-3-stable и master, поэтому будет исправлен в 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
6 голосов
/ 14 февраля 2013

Версия, которую мне нравится использовать, это

%`"#{account.full_name}" <#{account.email}>`

`<< - обратные кавычки. </p>

Обновление

Вы также можете изменить это на

%|"#{account.full_name}" <#{account.email}>|
%\"#{account.full_name}" <#{account.email}>\
%^"#{account.full_name}" <#{account.email}>^
%["#{account.full_name}" <#{account.email}>]

Подробнее о строковых литералах.

1 голос
/ 24 августа 2010

Еще один раздражающий аспект, по крайней мере, с новым форматом 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)
...