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)