Ruby on Rails 5.2 - ActionMailer::Base

क्लास एक्शनमेलर :: बेस




ruby

क्लास एक्शनमेलर :: बेस

जनक:
AbstractController::Base
शामिल मॉड्यूल:
ActionMailer::DeliveryMethods , ActionMailer::Rescuable , ActionMailer::Parameterized , ActionMailer :: पूर्वावलोकन , AbstractController::Rendering , AbstractController :: सहायकों , AbstractController::Translation , AbstractController::Callbacks , AbstractController::Caching , ActionView::Layouts

एक्शन मेलर आपको मेलर मॉडल और विचारों का उपयोग करके अपने एप्लिकेशन से ईमेल भेजने की अनुमति देता है।

मेलर मॉडल

एक्शन मेलर का उपयोग करने के लिए, आपको मेलर मॉडल बनाना होगा।

$ rails generate mailer Notifier

जेनरेट किया गया मॉडल ApplicationMailer से विरासत में मिला है जो बदले में ActionMailer::Base से विरासत में मिला है। एक मेलर मॉडल एक ईमेल संदेश उत्पन्न करने के लिए उपयोग की जाने वाली विधियों को परिभाषित करता है। इन विधियों में, आप मेलर व्यू में उपयोग किए जाने वाले वेरिएबल को सेटअप कर सकते हैं, मेल पर ही विकल्प जैसे :from पते से, और अटैचमेंट से।

class ApplicationMailer < ActionMailer::Base
  default from: '[email protected]'
  layout 'mailer'
end

class NotifierMailer < ApplicationMailer
  default from: '[email protected]',
          return_path: '[email protected]'

  def welcome(recipient)
    @account = recipient
    mail(to: recipient.email_address_with_name,
         bcc: ["[email protected]", "Order Watcher <[email protected]>"])
  end
end

मेलर विधि के भीतर, आपके पास निम्न विधियों तक पहुंच है:

  • attachments[]= - आप सहज तरीके से अपने ईमेल में संलग्नक जोड़ने की अनुमति देता है; attachments['filename.png'] = File.read('path/to/filename.png')

  • attachments.inline[]= - आपको attachments.inline[]= के समान तरीके से अपने ईमेल में इनलाइन अटैचमेंट जोड़ने की अनुमति देता है

  • headers[]= - आपको अपने ईमेल में headers['X-No-Spam'] = 'True' जैसे किसी भी हेडर फ़ील्ड को निर्दिष्ट करने की अनुमति देता है। ध्यान दें कि एक हेडर को कई बार घोषित करने से एक ही नाम के कई क्षेत्र जुड़ जाएंगे। अधिक जानकारी के लिए headers पढ़ें।

  • headers(hash) - आपको अपने ईमेल में कई हेडर निर्दिष्ट करने की अनुमति देता है जैसे headers({'X-No-Spam' => 'True', 'In-Reply-To' => '[email protected]'})

  • mail - आपको भेजे जाने वाले ईमेल को निर्दिष्ट करने की अनुमति देता है।

मेल विधि को पास किया गया हैश आपको कोई भी हेडर निर्दिष्ट करने की अनुमति देता है जिसे Mail::Message स्वीकार करेगा (वैकल्पिक फ़ील्ड सहित कोई भी मान्य ईमेल हेडर)।

mail विधि, यदि कोई ब्लॉक पास नहीं किया गया है, तो आपके विचारों का निरीक्षण करेगा और सभी विचारों को विधि के समान नाम के साथ भेजेगा, इसलिए उपरोक्त कार्रवाई से welcome.text.erb दृश्य फ़ाइल के साथ-साथ welcome.text.erb भेजा जाएगा multipart/alternative ईमेल में फ़ाइल देखें।

यदि आप स्पष्ट रूप से केवल कुछ टेम्प्लेट प्रस्तुत करना चाहते हैं, तो एक ब्लॉक पास करें:

mail(to: user.email) do |format|
  format.text
  format.html
end

ब्लॉक सिंटैक्स किसी भाग को विशिष्ट जानकारी प्रदान करने में भी उपयोगी है:

mail(to: user.email) do |format|
  format.text(content_transfer_encoding: "base64")
  format.html
end

या यहां तक ​​कि एक विशेष दृश्य प्रस्तुत करने के लिए:

mail(to: user.email) do |format|
  format.text
  format.html { render "some_other_template" }
end

मेलर विचार

एक्शन कंट्रोलर की तरह, प्रत्येक मेलर क्लास में एक संबंधित व्यू डायरेक्टरी होती है जिसमें क्लास का प्रत्येक तरीका अपने नाम के साथ एक टेम्प्लेट के लिए दिखता है।

एक मेलर के साथ उपयोग किए जाने वाले टेम्पलेट को परिभाषित करने के लिए, अपने मेलर मॉडल में विधि के समान नाम के साथ एक .erb फ़ाइल बनाएं। उदाहरण के लिए, ऊपर परिभाषित मेलर में, app/views/notifier_mailer/welcome.text.erb पर टेम्प्लेट का उपयोग ईमेल बनाने के लिए किया जाएगा।

आपके मेलर मॉडल के तरीकों में परिभाषित चर उनके संगत दृश्य में उदाहरण चर के रूप में सुलभ हैं।

डिफ़ॉल्ट रूप से ईमेल सादे पाठ में भेजे जाते हैं, इसलिए हमारे मॉडल उदाहरण के लिए एक नमूना दृश्य इस तरह दिखाई दे सकता है:

Hi <%= @account.name %>,
Thanks for joining our service! Please check back often.

आप इन दृश्यों में एक्शन व्यू हेल्पर्स का उपयोग भी कर सकते हैं। उदाहरण के लिए:

You got a new note!
<%= truncate(@note.body, length: 25) %>

यदि आपको दृश्य में या प्राप्तकर्ताओं से विषय को एक्सेस करने की आवश्यकता है, तो आप संदेश ऑब्जेक्ट के माध्यम से कर सकते हैं:

You got a new note from <%= message.from %>!
<%= truncate(@note.body, length: 25) %>

जनरेटिंग यूआरएल

URL को url_for या नामित मार्गों का उपयोग करके मेलर दृश्यों में उत्पन्न किया जा सकता है। एक्शन पैक के नियंत्रकों के विपरीत, मेलर के उदाहरण में आने वाले अनुरोध के बारे में कोई संदर्भ नहीं है, इसलिए आपको एक URL बनाने के लिए आवश्यक सभी विवरण प्रदान करने होंगे।

url_for का उपयोग करते url_for आपको :host :controller , और :action प्रदान करने की आवश्यकता होगी:

<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %>

नामित मार्गों का उपयोग करते समय आपको केवल आपूर्ति करने की आवश्यकता होती है :host :

<%= users_url(host: "example.com") %>

आपको named_route_url शैली (जो पूर्ण URL उत्पन्न करता है) का उपयोग करना चाहिए और named_route_path शैली (जो सापेक्ष URL उत्पन्न करता है) का उपयोग करने से बचना चाहिए, क्योंकि मेल पढ़ने वाले ग्राहकों को वर्तमान URL की कोई अवधारणा नहीं होगी, जिसमें कोई सापेक्ष पथ निर्धारित करना हो।

एक डिफ़ॉल्ट होस्ट सेट करना भी संभव है जो सभी मेलर में उपयोग किया जाएगा :host config/application.rb में कॉन्फ़िगरेशन विकल्प के रूप में :host विकल्प config/application.rb :

config.action_mailer.default_url_options = { host: "example.com" }

आप प्रति मेलर इन डिफ़ॉल्ट सेटिंग्स को ओवरराइड करने के लिए अलग-अलग मेलर्स पर एक default_url_options विधि को भी परिभाषित कर सकते हैं।

डिफ़ॉल्ट रूप से जब config.force_ssl true होता true , तो होस्ट्स के लिए उत्पन्न URL HTTPS प्रोटोकॉल का उपयोग करेगा।

मेल भेजना

मेलर एक्शन और टेम्प्लेट परिभाषित होने के बाद, आप अपना संदेश दे सकते हैं या बाद में इसके निर्माण और वितरण को टाल सकते हैं:

NotifierMailer.welcome(User.first).deliver_now # sends the email
mail = NotifierMailer.welcome(User.first)      # => an ActionMailer::MessageDelivery object
mail.deliver_now                               # generates and sends the email now

ActionMailer::MessageDelivery वर्ग एक प्रतिनिधि के चारों ओर एक आवरण है जो मेल उत्पन्न करने के लिए आपके तरीके को कॉल करेगा। यदि आप प्रतिनिधि, या Mail::Message लिए सीधी पहुँच चाहते हैं, तो आप ActionMailer::MessageDelivery पर message विधि को कॉल कर सकते हैं।

NotifierMailer.welcome(User.first).message     # => a Mail::Message object

एक्शन मेलर एक्टिव जॉब के साथ अच्छी तरह से एकीकृत है, इसलिए आप पृष्ठभूमि में ईमेल उत्पन्न और भेज सकते हैं (उदाहरण: अनुरोध-प्रतिक्रिया चक्र के बाहर, ताकि उपयोगकर्ता को इस पर इंतजार न करना पड़े):

NotifierMailer.welcome(User.first).deliver_later # enqueue the email sending to Active Job

ध्यान दें कि deliver_later पृष्ठभूमि कार्य से आपकी विधि निष्पादित करेगा।

आप कभी भी अपने मेलर क्लास को इंस्टेंट न करें। बल्कि, आप केवल उस विधि को कहते हैं जिसे आपने कक्षा में परिभाषित किया था। सभी उदाहरण विधियों को भेजे जाने वाले संदेश ऑब्जेक्ट को वापस करने की अपेक्षा की जाती है।

मल्टीपार्ट ईमेल

मल्टीपार्ट संदेशों का उपयोग अंतर्निहित रूप से भी किया जा सकता है क्योंकि एक्शन मेलर स्वचालित रूप से मल्टीपार्ट टेम्प्लेट का पता लगाएगा और उपयोग करेगा, जहां प्रत्येक टेम्पलेट का नाम कार्रवाई के नाम पर रखा जाता है, उसके बाद सामग्री प्रकार। संदेश में प्रत्येक ऐसे पता लगाए गए टेम्पलेट को एक अलग भाग के रूप में जोड़ा जाएगा।

उदाहरण के लिए, यदि निम्न टेम्पलेट मौजूद हैं:

  • signup_notification.text.erb

  • signup_notification.html.erb

  • signup_notification.xml.builder

  • signup_notification.yml.erb

प्रत्येक को संबंधित सामग्री प्रकार के साथ संदेश में एक अलग भाग के रूप में प्रदान और जोड़ा जाएगा। संपूर्ण संदेश के लिए सामग्री प्रकार स्वचालित रूप से multipart/alternative करने के लिए सेट है, जो इंगित करता है कि ईमेल में एक ही ईमेल निकाय के कई अलग-अलग प्रतिनिधित्व हैं। एक्शन में परिभाषित समान उदाहरण चर सभी ईमेल टेम्प्लेटों को दिए जाते हैं।

यदि कोई अटैचमेंट या पुर्जे ईमेल में जोड़े गए हैं तो इम्प्लिमेंट टेम्पलेट रेंडरिंग नहीं किया जाता है। इसका मतलब यह है कि आपको ईमेल में प्रत्येक भाग को मैन्युअल रूप से जोड़ना होगा और ईमेल के कंटेंट टाइप को multipart/alternative करने के लिए सेट करना होगा।

संलग्नक

ईमेल में अनुलग्नक भेजना आसान है:

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments['free_book.pdf'] = File.read('path/to/file.pdf')
    mail(to: recipient, subject: "New account information")
  end
end

कौन सा होगा (अगर यह दोनों एक welcome.text.erb और दृश्य निर्देशिका में welcome.html.erb टेम्पलेट है), दो भागों के साथ एक पूर्ण multipart/mixed ईमेल भेजें, पहला भाग टेक्स्ट और HTML के साथ एक multipart/alternative हो सकता है। ईमेल भागों के अंदर, और दूसरा एक बेस application/pdf 64 के साथ एक application/pdf रहा है। फ़ाइल नाम free_book.pdf साथ फ़ाइल की application/pdf कॉपी एनकोडेड है।

यदि आपको बिना किसी सामग्री के अटैचमेंट भेजने की आवश्यकता है, तो आपको इसके लिए एक खाली दृश्य बनाने या इस तरह एक खाली बॉडी पैरामीटर जोड़ने की आवश्यकता है:

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments['free_book.pdf'] = File.read('path/to/file.pdf')
    mail(to: recipient, subject: "New account information", body: "")
  end
end

आप html टेम्पलेट के साथ अटैचमेंट भी भेज सकते हैं, इस मामले में आपको इस तरह की बॉडी, अटैचमेंट और कस्टम कंटेंट टाइप जोड़ना होगा:

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments["free_book.pdf"] = File.read("path/to/file.pdf")
    mail(to: recipient,
         subject: "New account information",
         content_type: "text/html",
         body: "<html><body>Hello there</body></html>")
  end
end

इनलाइन अटैचमेंट

आप यह भी निर्दिष्ट कर सकते हैं कि एक फाइल को अन्य HTML के साथ इनलाइन प्रदर्शित किया जाना चाहिए। यदि आप कॉर्पोरेट लोगो या फोटो प्रदर्शित करना चाहते हैं तो यह उपयोगी है।

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments.inline['photo.png'] = File.read('path/to/photo.png')
    mail(to: recipient, subject: "Here is what we look like")
  end
end

और फिर दृश्य में छवि को संदर्भित करने के लिए, आप एक image_tag फ़ाइल बनाते हैं और आप जिस अनुलग्नक को प्रदर्शित करना चाहते हैं image_tag गुजरने वाले image_tag पर कॉल करते हैं और फिर छवि के लिए सापेक्ष सामग्री आईडी पथ प्राप्त करने के लिए अनुलग्नक पर url कहते हैं। स्रोत:

<h1>Please Don't Cringe</h1>

<%= image_tag attachments['photo.png'].url -%>

जैसा कि हम एक्शन व्यू की image_tag विधि का उपयोग कर रहे हैं, आप अपने इच्छित अन्य विकल्पों में से गुजर सकते हैं:

<h1>Please Don't Cringe</h1>

<%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%>

अवलोकन और अवरोधन मेल

एक्शन मेलर मेल पर्यवेक्षक और इंटरसेप्टर विधियों में हुक प्रदान करता है। ये आपको उन कक्षाओं को पंजीकृत करने की अनुमति देते हैं जिन्हें मेल वितरण जीवन चक्र के दौरान कहा जाता है।

एक पर्यवेक्षक वर्ग को लागू करना होगा :delivered_email(message) विधि जिसे ईमेल भेजे जाने के बाद भेजे गए प्रत्येक ईमेल के लिए एक बार कॉल किया जाएगा।

एक इंटरसेप्टर वर्ग को लागू करना चाहिए :delivering_email(message) विधि जिसे ईमेल भेजे जाने से पहले कॉल किया जाएगा, जिससे आप डिलीवरी एजेंटों को हिट करने से पहले ईमेल में संशोधन कर सकेंगे। आपकी कक्षा को सीधे Mail::Message उदाहरण में पारित किए गए किसी भी आवश्यक संशोधन करना चाहिए।

डिफ़ॉल्ट Hash

एक्शन मेलर आपके ईमेल के लिए कुछ बुद्धिमान चूक प्रदान करता है, ये आमतौर पर वर्ग परिभाषा के अंदर एक डिफ़ॉल्ट विधि में निर्दिष्ट होते हैं:

class NotifierMailer < ApplicationMailer
  default sender: '[email protected]'
end

आप किसी भी हेडर मान में पास कर सकते हैं जो Mail::Message स्वीकार करता है। बॉक्स से बाहर, ActionMailer::Base निम्नलिखित सेट करता है:

  • mime_version: "1.0"

  • charset: "UTF-8"

  • content_type: "text/plain"

  • parts_order: [ "text/plain", "text/enriched", "text/html" ]

parts_order और charset वास्तव में मान्य नहीं हैं Mail::Message हेडर फ़ील्ड, लेकिन एक्शन मेलर उन्हें उचित रूप से अनुवाद करता है और सही मान सेट करता है।

जैसा कि आप किसी भी हेडर में पास कर सकते हैं, आपको हेडर को एक स्ट्रिंग के रूप में उद्धृत करने की आवश्यकता है, या इसे अंडरस्कोर किए गए प्रतीक के रूप में पास करें, इसलिए निम्नलिखित काम करेगा:

class NotifierMailer < ApplicationMailer
  default 'Content-Transfer-Encoding' => '7bit',
          content_description: 'This is a description'
end

अंत में, एक्शन मेलर Proc और Lambda ऑब्जेक्ट्स को डिफ़ॉल्ट हैश में पास करने का समर्थन करता है, इसलिए आप उन तरीकों को परिभाषित कर सकते हैं जो संदेश के रूप में मूल्यांकन करते हैं:

class NotifierMailer < ApplicationMailer
  default 'X-Special-Header' => Proc.new { my_method }, to: -> { @inviter.email_address }

  private
    def my_method
      'some complex call'
    end
end

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

इन डिफ़ॉल्ट विकल्पों को सेट करना भी संभव है जो सभी मेलर्स में default_options= कॉन्फ़िगरेशन config/application.rb कॉन्फ़िगरेशन में कॉन्फ़िगरेशन के माध्यम से उपयोग किए जाएंगे।

config.action_mailer.default_options = { from: "[email protected]" }

कॉलबैक

आप अपने संदेशों को कॉन्फ़िगर करने के लिए before_action और after_action उपयोग करके कॉलबैक निर्दिष्ट कर सकते हैं। यह उपयोगी हो सकता है, उदाहरण के लिए, जब आप एक निश्चित मेलर वर्ग द्वारा भेजे गए सभी संदेशों के लिए डिफ़ॉल्ट इनलाइन अटैचमेंट जोड़ना चाहते हैं:

class NotifierMailer < ApplicationMailer
  before_action :add_inline_attachment!

  def welcome
    mail
  end

  private
    def add_inline_attachment!
      attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
    end
end

Action Mailer में Callbacks AbstractController::Callbacks का उपयोग करके कार्यान्वित किया जाता है, इसलिए आप कॉलबैक को उसी तरीके से परिभाषित और कॉन्फ़िगर कर सकते हैं, जिसमें आप ActionController::Base से विरासत में प्राप्त कॉलबैक का उपयोग करेंगे।

ध्यान दें कि जब तक आपके पास ऐसा करने का कोई विशिष्ट कारण नहीं है, तब तक आपको अपने एक्शन मेलर कक्षाओं में before_action बजाय पहले से उपयोग करना पसंद करना चाहिए ताकि हेडर ठीक से पार्स हो।

ईमेल का पूर्वावलोकन

आप ActionMailer::Base.preview_path मेलर प्रीव्यू फ़ाइल जोड़कर अपने ईमेल टेम्प्लेट को नेत्रहीन देख ActionMailer::Base.preview_path । चूंकि अधिकांश ईमेल डेटाबेस डेटा के साथ कुछ दिलचस्प करते हैं, आपको नकली डेटा के साथ संदेश लोड करने के लिए कुछ परिदृश्य लिखने की आवश्यकता होगी:

class NotifierMailerPreview < ActionMailer::Preview
  def welcome
    NotifierMailer.welcome(User.first)
  end
end

विधियों को एक Mail::Message ऑब्जेक्ट वापस करना होगा जो अतिरिक्त deliver_now / deliver_later बिना मेलर विधि को कॉल करके उत्पन्न किया जा सकता है। मेलर प्रीव्यू डायरेक्टरी के स्थान को प्रीव्यू_पैथ विकल्प का उपयोग करके कॉन्फ़िगर किया जा सकता है जिसमें test/mailers/previews का डिफ़ॉल्ट है:

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

सभी पूर्वावलोकन का अवलोकन http://localhost:3000/rails/mailers पर चल रहे विकास सर्वर उदाहरण पर उपलब्ध है।

प्रीव्यू को भी इसी तरह से इंटरसेप्ट किया जा सकता है, जैसा कि प्रीव्यू इंटरसेप्टर को रजिस्टर करके किया जा सकता है जिसमें प्रीव्यू_मैल विधि है:

class CssInlineStyler
  def self.previewing_email(message)
    # inline CSS styles
  end
end

config.action_mailer.preview_interceptors :css_inline_styler

ध्यान दें कि इंटरसेप्टर को register_interceptor और register_preview_interceptor दोनों के साथ register_interceptor होने की आवश्यकता है यदि उन्हें ईमेल भेजने और पूर्वावलोकन करने दोनों पर काम करना चाहिए।

कॉन्फ़िगरेशन विकल्प

ये विकल्प वर्ग स्तर पर निर्दिष्ट हैं, जैसे ActionMailer::Base.raise_delivery_errors = true

  • default_options - आप इसे एक वर्ग स्तर पर और साथ ही उपरोक्त अनुभाग के अनुसार कक्षा में ही पास कर सकते हैं।

  • logger - यदि उपलब्ध हो तो मेलिंग रन पर जानकारी उत्पन्न करने के लिए लकड़हारे का उपयोग किया जाता है। बिना लॉगिंग के nil लिए सेट किया जा सकता है। रूबी के अपने लकड़हारे और Log4r लकड़हारे दोनों के साथ संगत।

  • smtp_settings - :smtp वितरण विधि के लिए विस्तृत विन्यास की अनुमति देता है:

    • :address - आपको एक दूरस्थ मेल सर्वर का उपयोग करने की अनुमति देता है। बस इसे अपने डिफ़ॉल्ट "लोकलहोस्ट" सेटिंग से बदल दें।

    • :port - बंद मौका पर कि आपका मेल सर्वर 25 पोर्ट पर नहीं चलता है, आप इसे बदल सकते हैं।

    • :domain - यदि आपको एक हेलो डोमेन निर्दिष्ट करने की आवश्यकता है, तो आप इसे यहाँ कर सकते हैं।

    • :user_name - यदि आपके मेल सर्वर को प्रमाणीकरण की आवश्यकता है, तो इस सेटिंग में उपयोगकर्ता नाम सेट करें।

    • :password - यदि आपके मेल सर्वर को प्रमाणीकरण की आवश्यकता है, तो इस सेटिंग में पासवर्ड सेट करें।

    • :authentication - यदि आपके मेल सर्वर को प्रमाणीकरण की आवश्यकता है, तो आपको यहां प्रमाणीकरण प्रकार निर्दिष्ट करने की आवश्यकता है। यह एक प्रतीक है और इनमें से एक :plain (पासवर्ड बेस 64 इनकोडेड भेजेगा) :login (पासवर्ड बेस 64 एनकोडेड भेजेगा) या :cram_md5 (सूचनाओं का आदान-प्रदान करने के लिए एक चुनौती / प्रतिक्रिया तंत्र को जोड़ती है और क्रिप्टोग्राफिक डाइजेस्ट 5 एल्गोरिथ्म हैश करने के लिए महत्वपूर्ण जानकारी)

    • :enable_starttls_auto - यह पता लगाता है कि क्या STARTTLS आपके SMTP सर्वर में सक्षम है और इसका उपयोग करना शुरू कर देता है। true अवहेलना।

    • :openssl_verify_mode - TLS का उपयोग करते समय, आप यह निर्धारित कर सकते हैं कि OpenSSL प्रमाणपत्र की जाँच कैसे करता है। यह वास्तव में उपयोगी है यदि आपको स्व-हस्ताक्षरित और / या वाइल्डकार्ड प्रमाणपत्र को मान्य करने की आवश्यकता है। आप एक ओपनएसएसएल OpenSSL::SSL::VERIFY_NONE ( 'none' या 'peer' ) या सीधे OpenSSL::SSL::VERIFY_NONE उपयोग कर सकते हैं ( OpenSSL::SSL::VERIFY_NONE या OpenSSL::SSL::VERIFY_PEER )। :ssl/:tls tls SMTP / TLS (SMTPS: SMTP सीधे टीएलटी कनेक्शन से अधिक) का उपयोग करने के लिए SMTP कनेक्शन को सक्षम करता है

  • sendmail_settings - आपको इसके लिए विकल्पों को ओवरराइड करने की अनुमति देता है :sendmail डिलीवरी विधि।

    • :location - प्रेषक का स्थान निष्पादन योग्य। चूक /usr/sbin/sendmail

    • :arguments - कमांड लाइन तर्क। संदेश भेजने से पहले -f [email protected] साथ डिफ़ॉल्ट को स्वचालित रूप से जोड़ा जाता है।

  • file_settings - आपको :file डिलीवरी विधि के लिए विकल्पों को ओवरराइड करने की अनुमति देता है।

    • :location - निर्देशिका जिसमें ईमेल लिखा जाएगा। आवेदन tmp/mails लिए चूक।

  • raise_delivery_errors - यदि ईमेल डिलीवर होने में विफल रहता है, तो त्रुटियों को उठाया जाना चाहिए या नहीं।

  • delivery_method - एक वितरण विधि को परिभाषित करता है। संभावित मान हैं :smtp (डिफ़ॉल्ट) :sendmail :test , और :file । या आप एक कस्टम डिलीवरी विधि ऑब्जेक्ट प्रदान कर सकते हैं जैसे MyOwnDeliveryMethodClass । इंटरफ़ेस पर मेल रत्न प्रलेखन देखें जिसे आपको कस्टम डिलीवरी एजेंट के लिए लागू करने की आवश्यकता है।

  • perform_deliveries - यह निर्धारित करता है कि जब आप कॉल करते हैं तो ईमेल वास्तव में एक्शन मेलर से भेजे जाते हैं। ईमेल संदेश पर या एक्शन मेलर विधि पर। यह डिफ़ॉल्ट रूप से चालू है लेकिन कार्यात्मक परीक्षण में सहायता के लिए बंद किया जा सकता है।

  • deliveries - एक्शन मेलर के माध्यम से डिलीवरी_मिथोड delivery_method :test माध्यम से भेजे गए सभी ईमेलों की एक सरणी रखता है। यूनिट और कार्यात्मक परीक्षण के लिए सबसे उपयोगी।

  • deliver_later_queue_name - deliver_later_queue_name उपयोग कतार के नाम। मेल करने वालों को चूक।

स्थिरांक

PROTECTED_IVARS

गुण

mailer_name [W]

वर्तमान मेलर का नाम सेट करने की अनुमति देता है।

पब्लिक क्लास के तरीके

नियंत्रक_पथ ()
इसके लिए उपनाम: mailer_name
डिफ़ॉल्ट (मान = शून्य) स्रोत दिखाएं
# File actionmailer/lib/action_mailer/base.rb, line 521
def default(value = nil)
  self.default_params = default_params.merge(value).freeze if value
  default_params
end

एप्लिकेशन कॉन्फ़िगरेशन के माध्यम से चूक सेट करता है:

config.action_mailer.default(from: "[email protected]")

Aliased ::default_options= द्वारा

इसके रूप में भी उपनाम: ::default_options=
default_options = (मान = शून्य)

एप्लिकेशन कॉन्फ़िगरेशन के माध्यम से डिफ़ॉल्ट सेट करने की अनुमति देता है:

config.action_mailer.default_options = { from: "[email protected]" }
अन्य के लिए उपनाम: default
# File actionmailer/lib/action_mailer/base.rb, line 509
def mailer_name
  @mailer_name ||= anonymous? ? "anonymous" : name.underscore
end

वर्तमान मेलर का नाम देता है। इस विधि का उपयोग व्यू लुकअप के लिए पथ के रूप में भी किया जा रहा है। यदि यह एक गुमनाम मेलर है, तो यह विधि इसके बजाय anonymous लौटेगी।

इसके अलावा उपनाम: controller_path
# File actionmailer/lib/action_mailer/base.rb, line 593
def initialize
  super()
  @_mail_was_called = false
  @_message = Mail.new
end
सुपरक्लास विधि कहता है
प्राप्त (raw_mail) स्रोत दिखाएं
# File actionmailer/lib/action_mailer/base.rb, line 543
def receive(raw_mail)
  ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload|
    mail = Mail.new(raw_mail)
    set_payload_for_mail(payload, mail)
    new.receive(mail)
  end
end

एक कच्चा ईमेल प्राप्त करता है, इसे एक ईमेल ऑब्जेक्ट में पार्स करता है, इसे डिकोड करता है, एक नए मेलर को इंस्टेंट करता है, और ईमेल ऑब्जेक्ट को मेलर ऑब्जेक्ट के receive विधि में पास करता है।

यदि आप चाहते हैं कि आपका मेलर आने वाले संदेशों को संसाधित करने में सक्षम हो, तो आपको एक receive विधि लागू करने की आवश्यकता होगी जो कच्चे ईमेल स्ट्रिंग को एक पैरामीटर के रूप में स्वीकार करती है:

class MyMailer < ActionMailer::Base
  def receive(mail)
    # ...
  end
end
register_interceptor (इंटरसेप्टर) स्रोत दिखाएँ
# File actionmailer/lib/action_mailer/base.rb, line 493
def register_interceptor(interceptor)
  Mail.register_interceptor(observer_class_for(interceptor))
end

एक इंटरसेप्टर पंजीकृत करें जिसे मेल भेजे जाने से पहले बुलाया जाएगा। या तो एक वर्ग, स्ट्रिंग या प्रतीक को इंटरसेप्टर के रूप में पारित किया जा सकता है। यदि इसमें एक स्ट्रिंग या प्रतीक पारित किया जाता है, तो उसे व्यवस्थित और स्थिर किया जाएगा।

register_interceptors (* इंटरसेप्टर) स्रोत दिखाएँ
# File actionmailer/lib/action_mailer/base.rb, line 479
def register_interceptors(*interceptors)
  interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) }
end

एक या एक से अधिक इंटरसेप्टर को पंजीकृत करें जो मेल भेजे जाने से पहले कहा जाएगा।

register_observer (पर्यवेक्षक) स्रोत दिखाएं
# File actionmailer/lib/action_mailer/base.rb, line 486
def register_observer(observer)
  Mail.register_observer(observer_class_for(observer))
end

एक ऑब्ज़र्वर पंजीकृत करें जिसे मेल द्वारा वितरित किए जाने पर अधिसूचित किया जाएगा। या तो एक वर्ग, स्ट्रिंग या प्रतीक को पर्यवेक्षक के रूप में पारित किया जा सकता है। यदि इसमें एक स्ट्रिंग या प्रतीक पारित किया जाता है, तो उसे व्यवस्थित और स्थिर किया जाएगा।

register_observers (* पर्यवेक्षक) स्रोत दिखाएं
# File actionmailer/lib/action_mailer/base.rb, line 474
def register_observers(*observers)
  observers.flatten.compact.each { |observer| register_observer(observer) }
end

एक या एक से अधिक ऑब्जर्वर रजिस्टर करें जो मेल डिलीवर होने पर अधिसूचित होंगे।

निजी कक्षा के तरीके

# File actionmailer/lib/action_mailer/base.rb, line 884
def self.supports_path? # :doc:
  false
end

ईमेल रिश्तेदार पथ लिंक का समर्थन नहीं करते हैं।

सार्वजनिक प्रवृत्ति के तरीके

संलग्नक () स्रोत दिखाएं
# File actionmailer/lib/action_mailer/base.rb, line 702
def attachments
  if @_mail_was_called
    LateAttachmentsProxy.new(@_message.attachments)
  else
    @_message.attachments
  end
end

आपको ईमेल में अनुलग्नक जोड़ने की अनुमति देता है, जैसे:

mail.attachments['filename.jpg'] = File.read('/path/to/filename.jpg')

यदि आप ऐसा करते हैं, तो मेल फ़ाइल नाम लेगा और माइम प्रकार का काम करेगा। यह सामग्री-प्रकार, सामग्री-विवाद, सामग्री-स्थानांतरण-एन्कोडिंग को भी सेट करेगा और आधार की सामग्री को अनुलग्नक में इनकोड करेगा।

यदि आप एक स्ट्रिंग के बजाय एक हैश पास करके भी ओवरराइड निर्दिष्ट कर सकते हैं:

mail.attachments['filename.jpg'] = {mime_type: 'application/gzip',
                                    content: File.read('/path/to/filename.jpg')}

यदि आप बेस 64 के अलावा एन्कोडिंग का उपयोग करना चाहते हैं तो आपको पूर्व-एन्कोडेड सामग्री के साथ एन्कोडिंग प्रकार पास करना होगा क्योंकि मेल को पता नहीं है कि डेटा को कैसे डीकोड करना है:

file_content = SpecialEncode(File.read('/path/to/filename.jpg'))
mail.attachments['filename.jpg'] = {mime_type: 'application/gzip',
                                    encoding: 'SpecialEncoding',
                                    content: file_content }

आप विशिष्ट अनुलग्नकों को भी खोज सकते हैं:

# By Filename
mail.attachments['filename.jpg']   # => Mail::Part object or nil

# or by index
mail.attachments[0]                # => Mail::Part (first attachment)
हेडर (args = nil) स्रोत दिखाएँ
# File actionmailer/lib/action_mailer/base.rb, line 664
def headers(args = nil)
  if args
    @_message.headers(args)
  else
    @_message
  end
end

आपको नए Mail::Message लिए यादृच्छिक और असामान्य हेडर पास करने की अनुमति देता है Mail::Message ऑब्जेक्ट जो उन्हें खुद से जोड़ देगा।

headers['X-Special-Domain-Specific-Header'] = "SecretValue"

आप हेडर फ़ील्ड नामों और मूल्यों के हेडर में एक हैश भी पारित कर सकते हैं, जो तब Mail::Message ऑब्जेक्ट पर सेट किया जाएगा:

headers 'X-Special-Domain-Specific-Header' => "SecretValue",
        'In-Reply-To' => incoming.message_id

परिणामी Mail::Message हेडर में निम्नलिखित होंगे:

X-Special-Domain-Specific-Header: SecretValue

पहले से परिभाषित हेडर को बदलने के बारे में ध्यान दें:

  • subject

  • sender

  • from

  • to

  • cc

  • bcc

  • reply-to

  • orig-date

  • message-id

  • references

ईमेल हेडर में फ़ील्ड केवल एक बार दिखाई दे सकती हैं जबकि अन्य क्षेत्र जैसे कि X-Anything कई बार दिखाई दे सकते हैं।

यदि आप पहले से मौजूद किसी भी हेडर को बदलना चाहते हैं, तो वैल्यू रीसेट करने के लिए पहले इसे सेट करें अन्यथा उसी हेडर के लिए एक और फील्ड जोड़ी जाएगी।

मेल (हेडर = {}, और ब्लॉक) दिखाएँ स्रोत
# File actionmailer/lib/action_mailer/base.rb, line 811
def mail(headers = {}, &block)
  return message if @_mail_was_called && headers.blank? && !block

  # At the beginning, do not consider class default for content_type
  content_type = headers[:content_type]

  headers = apply_defaults(headers)

  # Apply charset at the beginning so all fields are properly quoted
  message.charset = charset = headers[:charset]

  # Set configure delivery behavior
  wrap_delivery_behavior!(headers[:delivery_method], headers[:delivery_method_options])

  assign_headers_to_message(message, headers)

  # Render the templates and blocks
  responses = collect_responses(headers, &block)
  @_mail_was_called = true

  create_parts_from_responses(message, responses)

  # Setup content type, reapply charset and handle parts order
  message.content_type = set_content_type(message, content_type, headers[:content_type])
  message.charset      = charset

  if message.multipart?
    message.body.set_sort_order(headers[:parts_order])
    message.body.sort_parts!
  end

  message
end

मुख्य विधि जो संदेश बनाती है और ईमेल टेम्पलेट्स को प्रस्तुत करती है। इस पद्धति को कॉल करने के दो तरीके हैं, एक ब्लॉक के साथ, या एक ब्लॉक के बिना।

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

  • :subject - संदेश का विषय, यदि यह छोड़ दिया जाता है, तो एक्शन मेलर रेल I18n वर्ग का अनुवाद के लिए पूछेगा :subject [mailer_scope, action_name] के दायरे में :subject या यदि यह अनुपस्थित है, तो action_name का action_name संस्करण अनुवाद action_name

  • :to - कौन संदेश के लिए किस्मत में है, पते की एक स्ट्रिंग, या पते की एक सरणी हो सकती है।

  • :from - संदेश किससे है

  • :cc - इस ईमेल पर आप किसे कार्बन-कॉपी करना चाहते हैं, यह पते की एक स्ट्रिंग, या पते की एक सरणी हो सकती है।

  • :bcc - इस ईमेल पर आप ब्लाइंड-कार्बन-कॉपी किसे पसंद करेंगे, यह पते का एक स्ट्रिंग, या पते की एक सरणी हो सकती है।

  • :reply_to - ईमेल के हेडर-टू हेडर को सेट करने के लिए कौन।

  • :date - ईमेल पर भेजे जाने की तिथि कहने की तिथि।

आप किसी भी उपरोक्त हेडर के लिए डिफ़ॉल्ट मान सेट कर सकते हैं :date ( default :date को छोड़कर) default क्लास विधि का उपयोग करके:

class Notifier < ActionMailer::Base
  default from: '[email protected]',
          bcc: '[email protected]',
          reply_to: '[email protected]'
end

यदि आपको ऊपर सूचीबद्ध अन्य हेडर की आवश्यकता है, तो आप उन्हें हेडर हैश के भाग के रूप में पास कर सकते हैं या हेडर का उपयोग कर सकते headers['name'] = value विधि।

जब a :return_path को हेडर के रूप में निर्दिष्ट किया जाता है, तो उस मूल्य का उपयोग मेल संदेश के लिए 'लिफाफे' के पते के रूप में किया जाएगा। इसे सेट करना तब उपयोगी होता है जब आप एक से अधिक भिन्न पते पर भेजे गए डिलीवरी नोटिफिकेशन को इसमें :from । मेल वास्तव में :return_path को प्राथमिकता में उपयोग करेगा :sender को प्राथमिकता में :from 'लिफाफा' मान के लिए फ़ील्ड से।

यदि आप mail विधि के लिए कोई ब्लॉक पास नहीं करते हैं, तो यह डिफ़ॉल्ट रूप से मेलर नाम और जिस विधि नाम से इसे बुलाया जा रहा है, का उपयोग करके सभी पथों में सभी टेम्प्लेट मिल जाएगा, यह तब इन प्रत्येक टेम्पलेट के लिए समझदारी से भागों का निर्माण करेगा, सही सामग्री प्रकार और अनुक्रम पर शिक्षित अनुमान लगाना, और एक पूरी तरह से तैयार Mail::Message लौटना Mail::Message कॉल करने के लिए तैयार Mail::Message :deliver भेजने के लिए :deliver करें।

उदाहरण के लिए:

class Notifier < ActionMailer::Base
  default from: '[email protected]'

  def welcome
    mail(to: '[email protected]')
  end
end

नाम "स्वागत" के साथ "एप्लिकेशन / विचार / सूचना" पर सभी टेम्पलेट्स के लिए दिखेगा। यदि कोई स्वागत टेम्प्लेट मौजूद नहीं है, तो यह ActionView :: MissingTemplate त्रुटि को बढ़ाएगा।

हालाँकि, जिन्हें अनुकूलित किया जा सकता है:

mail(template_path: 'notifications', template_name: 'another')

और अब यह "ऐप / व्यू / नोटिफिकेशन" पर सभी टेम्प्लेट को "दूसरे" नाम से देखेगा।

यदि आप एक ब्लॉक पास करते हैं, तो आप अपनी पसंद के विशिष्ट टेम्पलेट्स को प्रस्तुत कर सकते हैं:

mail(to: '[email protected]') do |format|
  format.text
  format.html
end

आप बिना टेम्प्लेट का उपयोग किए भी सीधे सादे पाठ को प्रस्तुत कर सकते हैं:

mail(to: '[email protected]') do |format|
  format.text { render plain: "Hello Mikel!" }
  format.html { render html: "<h1>Hello Mikel!</h1>".html_safe }
end

जो text/plain और text/html भागों के साथ एक multipart/alternative ईमेल को प्रस्तुत करेगा।

यदि आप चाहें तो ब्लॉक सिंटैक्स आपको पार्ट हेडर को अनुकूलित करने की अनुमति देता है:

mail(to: '[email protected]') do |format|
  format.text(content_transfer_encoding: "base64")
  format.html
end
# File actionmailer/lib/action_mailer/base.rb, line 626
def mailer_name
  self.class.mailer_name
end

मेलर ऑब्जेक्ट का नाम देता है।

निजी उदाहरण तरीके

default_i18n_subject (प्रक्षेप = {}) स्रोत दिखाएं
# File actionmailer/lib/action_mailer/base.rb, line 878
def default_i18n_subject(interpolations = {}) # :doc:
  mailer_scope = self.class.mailer_name.tr("/", ".")
  I18n.t(:subject, interpolations.merge(scope: [mailer_scope, action_name], default: action_name.humanize))
end

[mailer_scope, action_name] दायरे के तहत रेल I18n वर्ग का उपयोग करके subject का अनुवाद करता है। यदि यह निर्दिष्ट दायरे के तहत subject के लिए अनुवाद नहीं action_name , तो यह action_name के action_name संस्करण में डिफ़ॉल्ट होगा। यदि विषय में प्रक्षेप हैं, तो आप उन्हें interpolations पैरामीटर के माध्यम से पारित कर सकते हैं।

set_content_type (m, user_content_type, class_default) स्रोत दिखाएँ
# File actionmailer/lib/action_mailer/base.rb, line 856
def set_content_type(m, user_content_type, class_default) # :doc:
  params = m.content_type_parameters || {}
  case
  when user_content_type.present?
    user_content_type
  when m.has_attachments?
    if m.attachments.detect(&:inline?)
      ["multipart", "related", params]
    else
      ["multipart", "mixed", params]
    end
  when m.multipart?
    ["multipart", "alternative", params]
  else
    m.content_type || class_default
  end
end

संदेश की सामग्री प्रकार सेट करने के लिए mail द्वारा उपयोग किया जाता है।

यह दिए गए user_content_type उपयोग करेगा, या मेल संदेश में कोई अनुलग्नक होने पर मल्टीपार्ट करें। यदि अटैचमेंट इनलाइन हैं, तो सामग्री प्रकार "मल्टीपार्ट / संबंधित" होगा, अन्यथा "मल्टीपार्ट / मिश्रित"।

यदि हेडर के माध्यम से कोई सामग्री प्रकार पारित नहीं किया गया है, और कोई अनुलग्नक नहीं हैं, या संदेश मल्टीपार्ट है, तो डिफ़ॉल्ट सामग्री प्रकार का उपयोग किया जाता है।

Original text