수색…


소개

작업 메일러를 사용하면 메일러 클래스 및보기를 사용하여 응용 프로그램에서 전자 메일을 보낼 수 있습니다. 메일러는 컨트롤러와 매우 유사하게 작동합니다. ActionMailer :: Base에서 상속 받아 app / mailer에 살며 app / views에 연결된 뷰가 있습니다.

비고

이메일 서버를 비동기 적으로 처리하여 웹 서버를 묶지 않는 것이 좋습니다. 이는 delayed_job 과 같은 다양한 서비스를 통해 수행 할 수 있습니다.

기본 메일러

이 예제에서는 네 가지 파일을 사용합니다.

  • 사용자 모델
  • 사용자 메일러
  • 이메일의 html 템플릿
  • 이메일의 일반 텍스트 템플릿

이 경우 사용자 모델은 메일러에서 approved 메소드를 호출하고 approved post 을 전달합니다 (모델의 approved 메소드는 콜백, 컨트롤러 메소드 등에서 호출 할 수 있음). 그런 다음 메일러는 전달 된 post (예 : 제목)의 정보를 사용하여 html 또는 일반 텍스트 템플릿에서 전자 메일을 생성합니다. 기본적으로 메일러는 메일러의 메소드와 이름이 같은 템플릿을 사용합니다 (메일러 메소드와 템플릿이 모두 '승인 됨'인 이유).

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 라는 app 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

Mailer 클래스에 제공하십시오.

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 보기를 nex 이름으로 변경하십시오. 이 파일은 바닥 글에 저장되며 부분보기바닥 글에 저장됩니다. 이름은 _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 -를 설치하여 기본 브라우저에서 전자 메일을 보내지 않고 미리 볼 수 있습니다. 즉, 개발 환경에서 전자 메일 배달을 설정할 필요가 없으므로 실수로 다른 사람의 주소로 테스트 전자 메일을 보내는 것에 대해 걱정할 필요가 없습니다.

먼저 gem을 개발 환경에 추가하고 bundle 명령을 실행하여 설치하십시오.

  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 내부에서 가장 최근의 블로그 게시물에 내부를 포함하기 위해 작성되는 Newsletter Mailer 라는 메소드를 작성해야하며 Rake 액션으로 해고 될 것입니다. 전에 작성한 블로그 구조가 있다고 가정합니다.

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>

전자 메일을 별도의 프로세스로 보내려고하므로 전자 메일을 시작하기위한 레이크 작업을 만들어 보겠습니다. email_tasks.rake라는 새 파일을 Rails 애플리케이션의 lib / tasks 디렉토리에 추가하십시오.

touch lib/taks/email_tasks.rake

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

send_digest_email : : 환경은 작업을 실행하기 전에 Rails 환경을로드하여 작업 내에서 UserMailer와 같은 애플리케이션 클래스에 액세스 할 수 있음을 의미합니다.

이제 rake -T 명령을 실행하면 새로 생성 된 Rake 작업이 나열됩니다. 모든 작업을 테스트하려면 작업을 실행하고 전자 메일이 보내 졌는지 여부를 확인하십시오.

메일러 방법이 작동하는지 테스트하려면 rake 명령을 실행하십시오.

  rake weekly_newsletter_email

이 시점에서 crontab을 사용하여 예약 할 수있는 작업 갈퀴 작업이 있습니다. 따라서 우리는 cron 작업을 작성하고 배포하기위한 명확한 구문을 제공하는 데 사용되는 Whenever Gem 을 설치합니다.

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

그 후에 다음 명령을 실행하여 초기 config / schedule.rb 파일을 만듭니다 (config 폴더가 이미 프로젝트에있는 경우).

  wheneverize .

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

이제 스케줄 파일 내부에서 CRON JOB 을 생성하고 CRON JOB을 결정하는 내부의 mailer 메소드를 호출하여 도움없이 그리고 선택된 시간 범위 내에서 일부 작업을 수행해야합니다. 이 링크에서 설명한대로 다양한 유형의 구문을 사용할 수 있습니다.

subl your_project/config/schedule.rb

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

크론 작업 기본 구문

Cron Jobs with Whenever

이제 크론 작업 을 테스트하려면 성공적으로 만들었습니다. 우리는 다음 명령을 사용하여 CRON 구문의 터미널 인 우리의 예약 된 작업을 읽을 수 있습니다.

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'

이제 개발 환경에서 테스트를 실행하려면 application.rb 주 파일의 다음 줄을 설정하여 응용 프로그램이 사용할 모델이 어디에 있는지 알리십시오.

  subl your_project/config/application.rb

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

이제 Capistrano V3 가 새로운 Cron 작업을 서버 내부에 저장하고 트리거를 실행하여이 작업을 실행하게하려면 다음 요구 사항을 추가해야합니다.

  subl your_project/Capfile

  require 'whenever/capistrano'

CRON JOB환경응용 프로그램 의 이름에 대해 사용할 ID를 배치 파일에 삽입하십시오.

subl your_project/config/deploy.rb

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

그리고 각 파일의 변경 사항을 저장 한 후 capistrano deploy 명령을 실행합니다.

  cap production deploy

그리고 이제 당신의 작업이 만들어지고 메일러 메서드를 실행하도록 일정을 잡았습니다. 메일러 메서드는 내가 원했던 시간과이 파일을 설정하는 시간 범위에서 실행됩니다.

ActionMailer 인터셉터

조치 메일러는 인터셉터 메소드에 후크를 제공합니다. 이를 통해 메일 전달 수명주기 동안 호출되는 클래스를 등록 할 수 있습니다.

인터셉터 클래스는 deliver_email (message) 메소드를 구현해야합니다.이 메소드는 이메일이 전송되기 전에 호출되어 전달 에이전트에 충돌하기 전에 이메일을 수정할 수있게합니다. 클래스는 전달 된 Mail :: Message 인스턴스에 직접 필요한 수정 작업을 수행해야합니다.

개발자가 실제 사용자가 아닌 전자 메일을 보내는 것이 유용 할 수 있습니다.

actionmailer 인터셉터 등록의 예 :

# 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