Rails ActionMailer - format sender and recipient name/email address

后端 未结 6 1219
耶瑟儿~
耶瑟儿~ 2020-12-04 09:44

Is there a way to specify email AND name for sender and recipient info when using ActionMailer?

Typically you\'d do:

@recipients   = \"#{user.email         


        
相关标签:
6条回答
  • 2020-12-04 09:56

    If you are taking user input for name and email, then unless you very carefully validate or escape the name and email, you can end up with an invalid From header by simply concatenating strings. Here is a safe way:

    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>"
    
    0 讨论(0)
  • 2020-12-04 10:01
    @recipients   = "\"#{user.name}\" <#{user.email}>"
    @from         = "\"MyCompany\" <info@mycompany.com>"
    
    0 讨论(0)
  • 2020-12-04 10:02

    Another irritating aspect, at least with the new AR format, is to remember that 'default' is called on the class level. Referencing routines that are instance-only causes it to silently fail and give when you try to use it:

     NoMethodError: undefined method `new_post' for Notifier:Class
    

    Here's what I ended up using:

    def self.named_email(name,email) "\"#{name}\" <#{email}>" end
    default :from => named_email(user.name, user.email)
    
    0 讨论(0)
  • 2020-12-04 10:06

    In rails3 I place the following in each environment. i.e. production.rb

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

    Placing quotations around the company name did not work for me in Rails3.

    0 讨论(0)
  • 2020-12-04 10:14

    within Rails 2.3.3 a bug within the ActionMailer was introduced. You can see the ticket over here Ticket #2340. It's resolved in 2-3-stable and master so it will be fixed in 3.x and 2.3.6.

    For fixing the problem within 2.3.* you can use the code provided within the ticket comments:

    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
    
    0 讨论(0)
  • 2020-12-04 10:16

    The version I like to use of this is

    %`"#{account.full_name}" <#{account.email}>`
    

    ` << are backticks.

    Update

    You could also change that to

    %|"#{account.full_name}" <#{account.email}>|
    %\"#{account.full_name}" <#{account.email}>\
    %^"#{account.full_name}" <#{account.email}>^
    %["#{account.full_name}" <#{account.email}>]
    

    Read more about string literals.

    0 讨论(0)
提交回复
热议问题