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

Grn*_*gle 109 ruby-on-rails actionmailer

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

通常你会这样做:

@recipients   = "#{user.email}"
@from         = "info@mycompany.com"
@subject      = "Hi"
@content_type = "text/html"
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做到这一点?

Jam*_*ney 232

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

  • 在某些情况下,`address.display_name`似乎会改变字符串编码,所以如果您计划稍后使用`name`,例如在rails mailer视图中,请执行`address.display_name = name.dup` (10认同)
  • 看起来Mail gem现在会传入传入的字符串,所以`name.dup`似乎不再需要了.[来源](https://github.com/mikel/mail/blob/master/lib/mail/elements/address.rb#L96)上写着:`@display_name = str.nil??nil:str.dup` (6认同)

Edu*_*coz 97

@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"
Run Code Online (Sandbox Code Playgroud)

  • 请参阅我的答案,了解正确编码字符串的方法. (11认同)
  • 这很有帮助!仅供参考,如果你想测试这个,你需要查看@ email.header ['From'].to_s,而不是@ email.from.后者仅包含电子邮件地址,而不包含名称. (8认同)
  • 不要这样做.请参阅@ JamesMcKinney的回答. (7认同)
  • 同样,不要使用它,因为它不安全.请参阅@ JamesMcKinney的回答. (5认同)
  • 我不这么认为.它不能包含任何非ASCII字符,它不能包含引号字符本身,并且在标题中也有一些不允许/不推荐的ASCII字符.我发现RFC2047为base64编码这样的值提供了一种机制. (2认同)

ast*_*ohn 42

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

ActionMailer::Base.default :from => "Company Name <no-reply@production-server.ca>"
Run Code Online (Sandbox Code Playgroud)

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


ank*_*nka 8

在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
Run Code Online (Sandbox Code Playgroud)

  • 对于任何有疑问的人,"我在哪里放这个代码?" 答案是将它保存为[rails app root]/config/initializers目录中的.rb文件. (2认同)

Mar*_*arc 6

我喜欢使用的版本是

%`"#{account.full_name}" <#{account.email}>`
Run Code Online (Sandbox Code Playgroud)

`<<是反击.

更新

您也可以将其更改为

%|"#{account.full_name}" <#{account.email}>|
%\"#{account.full_name}" <#{account.email}>\
%^"#{account.full_name}" <#{account.email}>^
%["#{account.full_name}" <#{account.email}>]
Run Code Online (Sandbox Code Playgroud)

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