खोज…


परिचय

एक्शन मेलर आपको मेलर कक्षाओं और विचारों का उपयोग करके अपने आवेदन से ईमेल भेजने की अनुमति देता है। नियंत्रकों के लिए मेलर्स बहुत समान रूप से काम करते हैं। वे ActionMailer से वारिस करते हैं :: बेस और ऐप / मेलर्स में रहते हैं, और उनके पास संबंधित विचार हैं जो ऐप / व्यू में दिखाई देते हैं।

टिप्पणियों

यह सलाह दी जाती है कि ईमेल भेजने की प्रक्रिया को अतुल्यकालिक रूप से किया जाए ताकि आपके वेब सर्वर को टाई न किया जा सके। यह विभिन्न सेवाओं के माध्यम से किया जा सकता है, जैसे delayed_job

बेसिक मेलर

यह उदाहरण चार अलग-अलग फ़ाइलों का उपयोग करता है:

  • उपयोगकर्ता मॉडल
  • उपयोगकर्ता मेलर
  • ईमेल के लिए HTML टेम्पलेट
  • ईमेल के लिए सादा-पाठ टेम्पलेट

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

user_mailer.rb

class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  def approved(post)
      @title = post.title
      @user = post.user
      mail(to: @user.email, subject: "Your Post was Approved!")
  end
end

user.rb

def approved(post)
    UserMailer.approved(post)
end

approved.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>Post Approved</title>
    </head>
    <body>
        <h2>Congrats <%= @user.name %>! Your post (#<%= @title %>) has been approved!</h2>
        <p>We look forward to your future posts!</p>
    </body>
</html>

approved.text.erb

Congrats <%= @user.name %>! Your post (#<%= @title %>) has been approved!
We look forward to your future posts!

एक नया मेलर उत्पन्न करना

एक नया मेलर उत्पन्न करने के लिए, निम्न कमांड दर्ज करें

rails generate mailer PostMailer 

यह app/mailers/post_mailer.rb में एक खाली टेम्पलेट फ़ाइल उत्पन्न करेगा जिसका नाम पोस्टमेलर है

class PostMailer < ApplicationMailer
end

ईमेल व्यू के लिए दो, HTML फॉर्मेट के लिए एक और टेक्स्ट फॉर्मेट के लिए दो लेआउट फाइलें भी जेनरेट की जाएंगी।

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

अनुलग्नक जोड़ना

ActionMailer भी फाइल अटैच करने की अनुमति देता है।

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

डिफ़ॉल्ट रूप से, अनुलग्नक को Base64 साथ एन्कोड किया जाएगा। इसे बदलने के लिए, आप अनुलग्नक विधि में एक हैश जोड़ सकते हैं।

attachments['filename.jpg'] = {
  mime_type: 'application/gzip',
  encoding: 'SpecialEncoding',
  content: encoded_content
}

आप इनलाइन अटैचमेंट भी जोड़ सकते हैं

attachments.inline['image.jpg'] = File.read('/path/to/image.jpg')

ActionMailer कॉलबैक

ActionMailer तीन कॉलबैक का समर्थन करता है

  • before_action
  • after_action
  • around_action

इन्हें अपने मेलर वर्ग में प्रदान करें

class UserMailer < ApplicationMailer
  after_action :set_delivery_options, :prevent_delivery_to_guests, :set_business_headers

फिर इन तरीकों को private कीवर्ड के तहत बनाएं

private
  def set_delivery_options
  end

  def prevent_delivery_to_guests
  end

  def set_business_headers
  end
end

एक अनुसूचित न्यूज़लैटर बनाएँ

न्यूज़लैटर मॉडल बनाएँ:

  rails g model Newsletter name:string email:string

  subl app/models/newsletter.rb

  validates :name, presence: true
  validates :email, presence: true

न्यूज़लेटर नियंत्रक बनाएँ:

  rails g controller Newsletters create
  
  class NewslettersController < ApplicationController
    skip_before_action :authenticate_user!
    before_action :set_newsletter, only: [:destroy]

    def create
      @newsletter = Newsletter.create(newsletter_params)
      if @newsletter.save
        redirect_to blog_index_path
      else
        redirect_to root_path
      end
    end

    private

      def set_newsletter
        @newsletter = Newsletter.find(params[:id])
      end

      def newsletter_params
        params.require(:newsletter).permit(:name, :email)
      end

  end

उसके बाद, create.html.erb व्यू को नेक्स नाम में बदलें। हम इस फाइल को और आंशिक दृश्य में बदल देंगे जो कि फूटर के अंदर संग्रहीत किया जाएगा। नाम होगा _form.html.erb

से नाम फ़ाइल बदलें: सेवा:
app / views / newsletters / create.html.erb एप्लिकेशन / विचार / समाचार पत्र / _form.html.erb

उसके बाद मार्ग निर्धारित करें:

  subl app/config/routes.rb
    
  resources :newsletters

बाद में, हमें वह फ़ॉर्म सेट करना होगा जिसका उपयोग हम प्रत्येक मेल को सहेजने के लिए करेंगे:

  subl app/views/newsletters/_form.html.erb

  <%= form_for (Newsletter.new) do |f| %>
    <div class="col-md-12" style="margin: 0 auto; padding: 0;">
      <div class="col-md-6" style="padding: 0;">
        <%= f.text_field :name, class: 'form-control', placeholder:'Nombre' %>
      </div>
      <div class="col-md-6" style="padding: 0;">
        <%= f.text_field :email, class: 'form-control', placeholder:'Email' %>
      </div>
    </div>
    <div class="col-md-12" style="margin: 0 auto; padding:0;">
      <%= f.submit class:"col-md-12 tran3s s-color-bg hvr-shutter-out-horizontal", style:'border: none; color: white; cursor: pointer; margin: 0.5em auto; padding: 0.75em; width: 100%;' %>
    </div>
  <% end %>

और उसके बाद, पाद पर डालें:

  subl app/views/layouts/_footer.html.erb

  <%= render 'newsletters/form' %>

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

सबसे पहले मणि को अपने विकास के माहौल में जोड़ें और इसे स्थापित करने के लिए बंडल कमांड चलाएं।

  subl your_project/Gemfile

  gem "letter_opener", :group => :development

फिर विकास पर्यावरण में वितरण विधि निर्धारित करें:

  subl your_project/app/config/environments/development.rb

  config.action_mailer.delivery_method = :letter_opener

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

  rails generate mailer UserMailer newsletter_mailer

और UserMailer के अंदर, हमें न्यूज़लैटर मेलर नामक एक विधि बनानी होगी, जो कि नवीनतम ब्लॉग पोस्ट के अंदर समाहित करने के लिए बनाई जाएगी और एक रेक कार्रवाई से निकाल दी जाएगी। हम मानेंगे कि आपके पास पहले एक ब्लॉग संरचना थी।

subl your_project/app/mailers/user_mailer.rb

class UserMailer '[email protected]'

  
  def newsletter_mailer
    @newsletter = Newsletter.all
    @post = Post.last(3)
    emails = @newsletter.collect(&:email).join(", ")
    mail(to: emails, subject: "Hi, this is a test mail.")
  end
  
end

उसके बाद, मेलर टेम्पलेट बनाएँ:

subl your_project/app/views/user_mailer/newsletter_mailer.html.erb

<p> Dear Followers: </p>
<p> Those are the lastest entries to our blog. We invite you to read and share everything we did on this week. </p>

<br/>
<table>
<% @post.each do |post| %>
  <%#= link_to blog_url(post) do %>
      <tr style="display:flex; float:left; clear:both;">
        <td style="display:flex; float:left; clear:both; height: 80px; width: 100px;">
          <% if post.cover_image.present? %>
            <%= image_tag post.cover_image.fullsize.url, class:"principal-home-image-slider" %>
          <%# else %>
            <%#= image_tag 'http://your_site_project.com' + post.cover_video, class:"principal-home-image-slider" %>
            <%#= raw(video_embed(post.cover_video)) %>
          <% end %>
        </td>
        <td>
          <h3>
            <%= link_to post.title, :controller => "blog", :action => "show", :only_path => false, :id => post.id %>
          </h3>
          <p><%= post.subtitle %></p>
        </td>
        <td style="display:flex; float:left; clear:both;">
           
        </td>
      </tr>
  <%# end %>
<% end %>
</table>

चूंकि हम ईमेल को एक अलग प्रक्रिया के रूप में भेजना चाहते हैं, तो आइए ईमेल को बंद करने के लिए एक रेक कार्य बनाएं। अपने रेल अनुप्रयोग के lib / कार्य निर्देशिका में email_tasks.rake नामक एक नई फ़ाइल जोड़ें:

touch lib/taks/email_tasks.rake

desc 'weekly newsletter email'
task weekly_newsletter_email: :environment do
  UserMailer.newsletter_mailer.deliver!
end

Send_digest_email:: पर्यावरण का अर्थ है कार्य चलाने से पहले रेल के वातावरण को लोड करना, ताकि आप कार्य के भीतर एप्लिकेशन क्लासेस (जैसे UserMailer) तक पहुँच सकें।

अब, कमांड रेक-टी चलाने से नए बनाए गए रेक कार्य को सूचीबद्ध किया जाएगा। कार्य को चलाकर और ईमेल भेजे गए या नहीं, यह जाँच कर सब कुछ परखता है।

मेलर विधि काम करती है, तो परीक्षण करने के लिए, रेक कमांड चलाएँ:

  rake weekly_newsletter_email

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

subl your_project/Gemfile
  
  gem 'whenever', require: false

उसके बाद, आपके लिए एक प्रारंभिक config / schedule.rb फ़ाइल बनाने के लिए अगला कमांड चलाएं (जब तक कि आपके प्रोजेक्ट में कॉन्फ़िगरेशन फ़ोल्डर पहले से मौजूद है)।

  wheneverize .

  [add] writing `./config/schedule.rb'
  [done] wheneverized!

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

subl your_project/config/schedule.rb

every 1.day, :at => '4:30 am' do
  rake 'weekly_newsletter_email'
end

क्रोन जॉब बेसिक सिंटेक्स

जब भी क्रोन जॉब्स

अब क्रोन जॉब का परीक्षण करने के लिए सफलतापूर्वक बनाया गया था ताकि हम टर्मिनल के बाद से पढ़ने के लिए अगले आदेश का उपयोग कर सकें, CRON SYNTAX में हमारी निर्धारित नौकरी:

your_project your_mac_user$ whenever

30 4 * * * /bin/bash -l -c 'cd /Users/your_mac_user/Desktop/your_project && RAILS_ENV=production bundle exec rake weekly_newsletter_email --silent'

अब, विकास पर्यावरण में परीक्षण को चलाने के लिए, एप्लिकेशन को अगली पंक्ति सेट करने के लिए समझदार है। प्रिंसिपल फाइल को यह बताने के लिए कि एप्लिकेशन को यह पता है कि वे कौन से मॉडल का उपयोग करेंगे।

  subl your_project/config/application.rb

  config.action_mailer.default_url_options = { :host => "http://localhost:3000/" }

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

  subl your_project/Capfile

  require 'whenever/capistrano'

और तैनाती फ़ाइल में डालें पहचानकर्ता जो CRON JOB पर्यावरण और अनुप्रयोग के नाम के बारे में उपयोग करेगा।

subl your_project/config/deploy.rb

set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:rails_env)}" }

और तैयार है, प्रत्येक फ़ाइल पर परिवर्तनों को बचाने के बाद, capistrano परिनियोजित कमांड चलाएँ:

  cap production deploy

और अब आपका JOB बनाया गया था और मेलर मेथड को चलाने के लिए कैलेंडर बनाया गया था, जो कि मैं चाहता हूं और इस फाइल के समय की सीमा में।

एक्शनमेलर इंटरसेप्टर

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

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

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

एक्शनमेलर इंटरसेप्टर को पंजीकृत करने का उदाहरण:

# config/initializers/override_mail_recipient.rb

if Rails.env.development? or Rails.env.test?
  class OverrideMailRecipient
    def self.delivering_email(mail)
      mail.subject = 'This is dummy subject'
      mail.bcc = '[email protected]'
      mail.to = '[email protected]'
    end
  end
  ActionMailer::Base.register_interceptor(OverrideMailRecipient)
end


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow