रेल्स एक्शनमेलर - प्रारूप प्रेषक और प्राप्तकर्ता का नाम / ईमेल पता


112

क्या एक्शनमेलर का उपयोग करते समय प्रेषक और प्राप्तकर्ता की जानकारी के लिए ईमेल और नाम निर्दिष्ट करने का कोई तरीका है?

आमतौर पर आप ऐसा करेंगे:

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

लेकिन, मुझे well-- के रूप में नाम निर्दिष्ट करना चाहते हैं MyCompany <info@mycompany.com>, John Doe <john.doe@mycompany>

क्या ऐसा करने के लिए कोई रास्ता है?


रेल गाइड के पास ऐसा करने का एक उदाहरण है: guide.rubyonrails.org/… इस सवाल में एक और जवाब भी देखें stackoverflow.com/a/8106387/879854
BF4

जवाबों:


237

यदि आप नाम और ईमेल के लिए उपयोगकर्ता इनपुट ले रहे हैं, तो जब तक आप नाम और ईमेल को बहुत सावधानी से सत्यापित या बच नहीं जाते हैं, तब तक आप हेडर को केवल स्ट्रिंग से अमान्य कर सकते हैं। यहाँ एक सुरक्षित तरीका है:

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मैंने जो भी दस्तावेज़ पढ़ा है , उसमें यह स्पष्ट नहीं है।
टिम मॉर्गन

10
address.display_nameकुछ मामलों में स्ट्रिंग एन्कोडिंग को म्यूट करने के लिए प्रकट होता है, इसलिए यदि आप nameबाद में उपयोग करने की योजना बनाते हैं , जैसे रेल मेलर विचारों में, करते हैंaddress.display_name = name.dup
Eero

7
ऐसा लगता है कि मेल रत्न अब स्ट्रिंग को पास कर देता है, इसलिए name.dupयह आवश्यक नहीं लगता है। स्रोत पढ़ता है:@display_name = str.nil? ? nil : str.dup
फिलो

यह डेविस इनिशियलाइज़र में भी काम करता है:config.mailer_sender = Proc.new { address = Mail::Address.new... }
१४:४४

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

2
मुझे ऐसा नहीं लगता। इसमें एक के लिए कोई भी गैर-ASCII वर्ण नहीं हो सकता है, इसमें स्वयं उद्धरण वर्ण नहीं हो सकता है, और कुछ ASCII वर्ण हैं जिन्हें अनुमति नहीं है / हेडर में भी अनुशंसित नहीं है। मैंने पाया कि RFC2047 ऐसे मूल्यों को आधारभूत एन्कोडिंग के लिए एक तंत्र प्रदान करता है।
विलियम डेनिस

11
ऐसा करने के तरीके के लिए मेरे जवाब को देखें जो स्ट्रिंग्स को ठीक से एन्कोड करता है।
जेम्स मैककिनी

8
यह मददगार था! FYI करें, यदि आप इसका परीक्षण करने का प्रयास कर रहे हैं, तो आपको @ email.header ['से'] [to] पर देखना होगा, @ email.from से नहीं। उत्तरार्द्ध में केवल ईमेल पता होता है और नाम नहीं।
सेबलन

7
इस तरह से मत करो। इसके बजाय @ JamesMcKinney का जवाब देखें।
मैथ्यू रत्ज़ोल्फ

5
फिर से, इसका उपयोग न करें क्योंकि यह असुरक्षित है। इसके बजाय @ JamesMcKinney का जवाब देखें।
जेक पेट्रेल्स

43

Rails3 में मैं निम्नलिखित को प्रत्येक वातावरण में रखता हूं। उत्पादन .rb

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

कंपनी के नाम के आसपास कोटेशन रखने से मेरे लिए Rails3 में काम नहीं किया।


:from => "Company Name <no-reply@email.com>"यदि आप पर्यावरण प्रतिबंध नहीं है, तो आप इसे सीधे अपने mailer.rb फ़ाइल में भी डाल सकते हैं ।
puce

8

रेल्स के भीतर एईएम में एक बग एक्शनमेलर पेश किया गया था। आप यहाँ टिकट # 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
किसी के लिए भी, जो मेरा सवाल है, "मैं यह कोड कहां डालूं?" इसका उत्तर यह है कि आप अपने [रेल एप्लिकेशन रूट] / config / initializers निर्देशिका में एक .rb फ़ाइल के रूप में सहेज सकते हैं।
जेल्लेकैट

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

एक और परेशान करने वाला पहलू, कम से कम नए एआर प्रारूप के साथ, यह याद रखना है कि 'डिफ़ॉल्ट' को क्लास स्तर पर कहा जाता है। उदाहरण के लिए रेफ़रिंग रूटीन केवल इसे विफल करने का कारण बनता है और जब आप इसका उपयोग करने का प्रयास करते हैं तो देते हैं:

 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.