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 มีตัวอย่างวิธีการทำเช่นนี้: guide.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
ขอบคุณมาก! ฉันคิดว่ามีวิธีที่ดีกว่า string concat แต่การใช้Mail::Addressไม่ชัดเจนในเอกสารใด ๆ ที่ฉันอ่าน
Tim Morgan

10
address.display_nameดูเหมือนจะกลายพันธุ์การเข้ารหัสสตริงในบางกรณีดังนั้นหากคุณวางแผนที่จะใช้ในnameภายหลังเช่นในมุมมองจดหมายทางรถไฟให้ทำaddress.display_name = name.dup
Eero

7
ดูเหมือนว่าตอนนี้ Mail gem จะทับสตริงที่ส่งผ่านเข้าไปดังนั้นname.dupดูเหมือนจะไม่จำเป็นอีกต่อไป ที่มาอ่าน:@display_name = str.nil? ? nil : str.dup
philoye

สิ่งนี้ยังใช้งานได้ในconfig.mailer_sender = Proc.new { address = Mail::Address.new... }
Devise

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

2
ฉันไม่คิดอย่างนั้น ต้องไม่มีอักขระที่ไม่ใช่ ASCII สำหรับหนึ่งอักขระไม่สามารถมีอักขระอัญประกาศได้และมีอักขระ ASCII บางตัวที่ไม่ได้รับอนุญาต / ไม่แนะนำในส่วนหัวด้วย ฉันพบว่า RFC2047 มีกลไกสำหรับการเข้ารหัส base64 ค่าดังกล่าว
William Denniss

11
ดูคำตอบของฉันสำหรับวิธีการทำสิ่งนี้ที่เข้ารหัสสตริงอย่างถูกต้อง
James McKinney

8
นี่เป็นประโยชน์! FYI หากคุณกำลังพยายามทดสอบสิ่งนี้คุณจะต้องดูที่ @ email.header ['From']. to_s ไม่ใช่ @ email.from ส่วนหลังมีเฉพาะที่อยู่อีเมลไม่ใช่ชื่อ
sbleon

7
อย่าทำแบบนี้ ดูคำตอบของ @ JamesMcKinney แทน
Matthew Ratzloff

5
อีกครั้งอย่าใช้สิ่งนี้เนื่องจากไม่ปลอดภัย ดูคำตอบของ @ JamesMcKinney แทน
Jake Petroules

43

ในราง 3 ฉันวางสิ่งต่อไปนี้ในแต่ละสภาพแวดล้อม คือ production.rb

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

การวางใบเสนอราคารอบชื่อ บริษัท ไม่ได้ผลสำหรับฉันใน Rails3


คุณสามารถใส่ลงในไฟล์ mailer.rb ได้โดยตรงเช่นนี้:from => "Company Name <no-reply@email.com>"หากคุณไม่มีข้อ จำกัด ด้านสภาพแวดล้อม
Puce

8

ภายใน Rails 2.3.3 มีการนำเสนอบั๊กภายใน ActionMailer คุณสามารถดูตั๋วได้ที่นี่Ticket # 2340# ได้รับการแก้ไขใน 2-3 เสถียรและมาสเตอร์ดังนั้นจะได้รับการแก้ไขใน 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

6

เวอร์ชันที่ฉันชอบใช้คือ

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

`<< เป็น backticks

ปรับปรุง

คุณยังสามารถเปลี่ยนเป็น

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

อ่านเพิ่มเติมเกี่ยวกับตัวอักษรสตริง


1

อีกแง่มุมที่น่ารำคาญอย่างน้อยก็ในรูปแบบ AR ใหม่คือจำไว้ว่า 'ค่าเริ่มต้น' ถูกเรียกใช้ในระดับชั้นเรียน การอ้างอิงรูทีนที่เป็นอินสแตนซ์เท่านั้นทำให้ล้มเหลวโดยไม่โต้ตอบและให้เมื่อคุณพยายามใช้:

 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.