web-dev-qa-db-ja.com

Rails ActionMailer-送信者と受信者の名前/メールアドレスのフォーマット

ActionMailerを使用するときに、送信者と受信者の情報に電子メールと名前を指定する方法はありますか?

通常は次のことを行います。

@recipients   = "#{user.email}"
@from         = "[email protected]"
@subject      = "Hi"
@content_type = "text/html"

しかし、名前も指定したい-MyCompany <[email protected]>John Doe <[email protected]>

それを行う方法はありますか?

108
Grnbeagle

名前と電子メールのユーザー入力を取得している場合、名前と電子メールを非常に慎重に検証またはエスケープしない限り、文字列を連結するだけで無効なFromヘッダーが作成される可能性があります。安全な方法は次のとおりです。

require 'mail'
address = Mail::Address.new email # ex: "[email protected]"
address.display_name = name.dup   # ex: "John Doe"
# Set the From or Reply-To header to the following:
address.format # returns "John Doe <[email protected]>"
231
James McKinney
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <[email protected]>"
97
Eduardo Scoz

Rails3では、各環境に次のものを配置します。すなわちproduction.rb

ActionMailer::Base.default :from => "Company Name <[email protected]>"

Rails3では、会社名の周りに引用符を付けてもうまくいきませんでした。

42
astjohn

within Rails 2.3.3 ActionMailer内のバグが導入されました。チケットはこちらで確認できます チケット#234 。そのため、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
8
anka

私がこれを使用したいバージョンは

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

文字列リテラルについての詳細を読む。

6
Marc

少なくとも新しいAR形式では、クラスレベルで「デフォルト」が呼び出されることを覚えておくことは、もう1つのイライラする側面です。インスタンスのみのルーチンを参照すると、サイレントに失敗し、使用しようとしたときにエラーが発生します。

 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)
1
Kevin