115

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

通常你会这样做:

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

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

有没有办法做到这一点?

4

7 回答 7

244

如果您正在接受用户输入的姓名和电子邮件,那么除非您非常仔细地验证或转义姓名和电子邮件,否则您可能会通过简单地连接字符串而得到无效的 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>"
于 2011-11-12T17:55:30.277 回答
97
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"
于 2009-06-05T18:49:17.010 回答
44

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

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

在 Rails3 中,在公司名称周围加上引号对我来说不起作用。

于 2011-02-22T21:47:40.230 回答
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
于 2010-01-24T16:47:06.343 回答
6

我喜欢使用的版本是

%`"#{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}>]

阅读有关字符串文字的更多信息。

于 2013-02-14T02:40:19.010 回答
1

另一个令人讨厌的方面,至少对于新的 AR 格式,是要记住在类级别调用“默认”。引用仅实例的例程会导致它静默失败并在您尝试使用它时给出:

 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)
于 2010-08-24T00:36:48.540 回答
1

Rails 6.1开始,有一个新的方便的辅助方法ActionMailer::Base

ActionMailer::Base.email_address_with_name("test@test.com", "John Test with Quotes <'")
=> "\"John Test with Quotes <'\" <test@test.com>"

在 Mailer 中,它可以在没有类名的情况下访问:

mail to: email_address_with_name(user.email, user.name), ...

在引擎盖下,它使用 Mail::Address ,就像在最佳答案中一样。

于 2021-11-18T08:25:30.920 回答