Rails ActionMailer - 格式化发件人和收件人姓名/电子邮件地址

时间:2009-06-05 18:40:49

标签: ruby-on-rails actionmailer

使用ActionMailer时,有没有办法为发件人和收件人信息指定电子邮件和名称?

通常你会这样做:

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

但是,我也要指定名称 - MyCompany <info@mycompany.com>John Doe <john.doe@mycompany>

有办法吗?

6 个答案:

答案 0 :(得分:228)

如果您正在接收用户输入的姓名和电子邮件,那么除非您非常仔细地验证或转义姓名和电子邮件,否则只需连接字符串就可以得到无效的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>"

答案 1 :(得分:97)

@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"

答案 2 :(得分:41)

在rails3中,我在每个环境中放置以下内容。即production.rb

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

在Rails3中,在公司名称周围放置引号不起作用。

答案 3 :(得分:8)

在Rails 2.3.3中引入了ActionMailer中的一个错误。你可以看到这里的票证Ticket #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

答案 4 :(得分:6)

我喜欢使用的版本是

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

`&lt;&lt;是反叛。

更新

您也可以将其更改为

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

Read more about string literals.

答案 5 :(得分:1)

另一个令人恼火的方面,至少在新的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)