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


112

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

通常は次のようにします。

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

しかし、私はwell--として名前を指定しますMyCompany <info@mycompany.com>John Doe <john.doe@mycompany>

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


Railsガイドには、これを行う方法の例があります:guides.rubyonrails.org/…また、この質問の別の回答を参照してくださいstackoverflow.com/a/8106387/879854
BF4

回答:


237

名前と電子メールのユーザー入力を受け取る場合、名前と電子メールを非常に慎重に検証またはエスケープしない限り、単に文字列を連結するだけで、無効な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>"

1
どうもありがとうございます!私は文字列連結よりも良い方法があると考えましたが、Mail::Address私が読んだどのドキュメントでも使用が明確ではありません。
Tim Morgan

10
address.display_nameあなたが使用する予定もしそうなら、いくつかのケースでは、文字列のエンコーディングを変異させる表示されname、メーラービューレールなどで、後で行うaddress.display_name = name.dup
エーロ

7
Mail gemは渡された文字列を複製するname.dupように見えたので、もう必要ないようです。ソースの読み取り:@display_name = str.nil? ? nil : str.dup
フィロワ

この工夫初期化子でさえ作品:config.mailer_sender = Proc.new { address = Mail::Address.new... }
CIMM

97
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"

2
そうは思いません。1つの非ASCII文字を含めることはできません。引用文字自体を含めることはできません。また、ヘッダーで許可されていない/推奨されないASCII文字もあります。RFC2047が、そのような値をbase64でエンコードするメカニズムを提供していることがわかりました。
William Denniss、2011

11
文字列を適切にエンコードする方法については、私の回答を参照してください。
ジェームズマッキーニー

8
これは役に立ちました!参考までに、これをテストする場合は、@ email.fromではなく@ email.header ['From']。to_sを確認する必要があります。後者にはメールアドレスのみが含まれ、名前は含まれません。
sbleon

7
このようにしないでください。代わりに@JamesMcKinneyの回答を参照してください。
マシュー・ラッツロフ2012

5
繰り返しますが、これは安全ではないので使用しないでください。代わりに@JamesMcKinneyの回答を参照してください。
Jake Petroules、2014年

43

rails3では、各環境に以下を配置します。つまり、production.rb

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

Rails3では、会社名を引用することはできませんでした。


:from => "Company Name <no-reply@email.com>"環境制限がない場合は、このようにmailer.rbファイルに直接配置することもできます。
Puce、2015年

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

2
「このコードはどこに置けばよいのですか?」答えは、それを.rbファイルとして[rails app root] / config / initializersディレクトリに保存することです。
JellicleCat 2012

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}>]

文字列リテラルの詳細をご覧ください。


1

少なくとも新しい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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.