ActionMailerを使用するときに、送信者と受信者の情報に電子メールと名前を指定する方法はありますか?
通常は次のことを行います。
@recipients = "#{user.email}"
@from = "[email protected]"
@subject = "Hi"
@content_type = "text/html"
しかし、名前も指定したい-MyCompany <[email protected]>
、John Doe <john.doe@mycompany>
。
それを行う方法はありますか?
名前と電子メールのユーザー入力を取得している場合、名前と電子メールを非常に慎重に検証またはエスケープしない限り、文字列を連結するだけで無効な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]>"
@recipients = "\"#{user.name}\" <#{user.email}>"
@from = "\"MyCompany\" <[email protected]>"
Rails3では、各環境に次のものを配置します。すなわちproduction.rb
ActionMailer::Base.default :from => "Company Name <[email protected]>"
Rails3では、会社名の周りに引用符を付けてもうまくいきませんでした。
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
私がこれを使用したいバージョンは
%`"#{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}>]
少なくとも新しい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)