Ruby on Rails
ActionMailer
खोज…
परिचय
एक्शन मेलर आपको मेलर कक्षाओं और विचारों का उपयोग करके अपने आवेदन से ईमेल भेजने की अनुमति देता है। नियंत्रकों के लिए मेलर्स बहुत समान रूप से काम करते हैं। वे 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