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>

有没有办法做到这一点?

如果您正在input姓名和电子邮件的用户input,那么除非您仔细validation或转义姓名和电子邮件,否则只需简单地连接string即可生成无效的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>" 
 @recipients = "\"#{user.name}\" <#{user.email}>" @from = "\"MyCompany\" <info@mycompany.com>" 

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

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

在公司名称周围放置引号在Rails3中并不适用于我。

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

我喜欢使用这个版本

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

“反引号。

更新

你也可以改变它

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

阅读更多关于string文字。

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