Ruby on Rails
ActionMailer
수색…
소개
작업 메일러를 사용하면 메일러 클래스 및보기를 사용하여 응용 프로그램에서 전자 메일을 보낼 수 있습니다. 메일러는 컨트롤러와 매우 유사하게 작동합니다. 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 구문의 터미널 인 우리의 예약 된 작업을 읽을 수 있습니다.
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