115

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

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

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

でも、名前も指定したい―― MyCompany <info@mycompany.com>、。John Doe <john.doe@mycompany>

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

4

7 に答える 7

244

名前と電子メールのユーザー入力を取得している場合、名前と電子メールを慎重に検証またはエスケープしない限り、単に文字列を連結するだけで無効な 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>"
于 2011-11-12T17:55:30.277 に答える
97
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"
于 2009-06-05T18:49:17.010 に答える
44

rails3では、それぞれの環境に以下を配置します。すなわちproduction.rb

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

Rails3では、会社名を引用符で囲むことはできませんでした。

于 2011-02-22T21:47:40.230 に答える
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
于 2010-01-24T16:47:06.343 に答える
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}>]

文字列リテラルの詳細を参照してください。

于 2013-02-14T02:40:19.010 に答える
1

少なくとも新しい AR 形式では、もう 1 つの厄介な側面は、'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)
于 2010-08-24T00:36:48.540 に答える