액션 메일러 기본 사항
이 가이드는 애플리케이션에서 이메일을 보내는 데 필요한 모든 것과 액션 메일러의 내부 작동 방식을 제공합니다. 또한 메일러를 테스트하는 방법도 다룹니다.
이 가이드를 읽고 나면 다음을 알 수 있습니다:
- Rails 애플리케이션에서 이메일을 보내는 방법.
- 액션 메일러 클래스와 메일러 뷰를 생성하고 편집하는 방법.
- 환경에 따라 액션 메일러를 구성하는 방법.
- 액션 메일러 클래스를 테스트하는 방법.
액션 메일러란 무엇인가?
액션 메일러를 사용하면 메일러 클래스와 뷰를 사용하여 애플리케이션에서 이메일을 보낼 수 있습니다.
메일러는 컨트롤러와 유사합니다
메일러는 ActionMailer::Base
를 상속받으며 app/mailers
에 있습니다. 메일러는 컨트롤러와 매우 유사하게 작동합니다. 유사점의 예는 다음과 같습니다.
메일러에는:
- 액션과
app/views
에 있는 관련 뷰가 있습니다. - 뷰에서 접근할 수 있는 인스턴스 변수가 있습니다.
- 레이아웃과 부분 템플릿을 사용할 수 있습니다.
- params 해시에 접근할 수 있습니다.
이메일 보내기
이 섹션에서는 메일러와 뷰를 생성하는 단계별 가이드를 제공합니다.
메일러 생성하기
메일러 생성
$ bin/rails generate mailer User create app/mailers/user_mailer.rb create app/mailers/application_mailer.rb invoke erb create app/views/user_mailer create app/views/layouts/mailer.text.erb create app/views/layouts/mailer.html.erb invoke test_unit create test/mailers/user_mailer_test.rb create test/mailers/previews/user_mailer_preview.rb
# app/mailers/application_mailer.rb class ApplicationMailer < ActionMailer::Base default from: "from@example.com" layout 'mailer' end
# app/mailers/user_mailer.rb class UserMailer < ApplicationMailer end
보시다시피 메일러는 다른 생성기와 마찬가지로 Rails에서 생성할 수 있습니다.
생성기를 사용하고 싶지 않다면 app/mailers
내에 직접 파일을 만들면 됩니다. 단, ActionMailer::Base
를 상속받아야 합니다:
class MyMailer < ActionMailer::Base end
메일러 편집하기
메일러에는 “액션"이라고 하는 메서드가 있으며, 뷰를 사용하여 내용을 구조화합니다. 컨트롤러가 클라이언트에게 보낼 HTML 콘텐츠를 생성하는 것과 달리, 메일러는 이메일로 전송할 메시지를 생성합니다.
app/mailers/user_mailer.rb
에는 비어 있는 메일러가 있습니다:
class UserMailer < ApplicationMailer end
사용자의 등록된 이메일 주소로 이메일을 보내는 welcome_email
이라는 메서드를 추가해 보겠습니다:
class UserMailer < ApplicationMailer default from: 'notifications@example.com' def welcome_email @user = params[:user] @url = 'http://example.com/login' mail(to: @user.email, subject: 'Welcome to My Awesome Site') end end
다음은 앞서 제시된 메서드에 대한 간단한 설명입니다. 사용 가능한 모든 옵션 목록은 아래의 "액션 메일러 사용자 설정 가능한 속성 전체 목록” 섹션을 참조하세요.
default
메서드는 이 메일러에서 보내는 모든 이메일의 기본값을 설정합니다. 여기서는 모든 메시지의:from
헤더 값을 설정합니다. 이는 개별 이메일에서 재정의할 수 있습니다.mail
메서드는 실제 이메일 메시지를 생성합니다. 여기서는:to
와:subject
와 같은 헤더 값을 지정합니다.
메일러 뷰 생성하기
app/views/user_mailer/
에 welcome_email.html.erb
라는 파일을 만드세요. 이것이 HTML 형식의 이메일 템플릿이 됩니다:
<!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <h1>Welcome to example.com, <%= @user.name %></h1> <p> You have successfully signed up to example.com, your username is: <%= @user.login %>.<br> </p> <p> To login to the site, just follow this link: <%= @url %>. </p> <p>Thanks for joining and have a great day!</p> </body> </html>
이제 이 이메일의 텍스트 부분도 만들어 보겠습니다. 모든 클라이언트가 HTML 이메일을 선호하지는 않으므로, 두 가지 버전을 모두 보내는 것이 가장 좋습니다. 이를 위해 app/views/user_mailer/
에 welcome_email.text.erb
라는 파일을 만드세요:
Welcome to example.com, <%= @user.name %> =============================================== You have successfully signed up to example.com, your username is: <%= @user.login %>. To login to the site, just follow this link: <%= @url %>. Thanks for joining and have a great day!
이제 mail
메서드를 호출하면 Action Mailer가 두 개의 템플릿(텍스트와 HTML)을 감지하고 자동으로 multipart/alternative
이메일을 생성합니다.
메일러 호출하기
메일러는 사실 뷰를 렌더링하는 또 다른 방법입니다. HTTP 프로토콜을 통해 뷰를 렌더링하는 대신, 이메일 프로토콜을 통해 전송합니다. 따라서 사용자가 성공적으로 생성되면 컨트롤러가 메일러에게 이메일을 보내도록 지시하는 것이 합리적입니다.
이를 설정하는 것은 간단합니다.
먼저 User
스캐폴드를 만들어 보겠습니다:
$ bin/rails generate scaffold user name email login $ bin/rails db:migrate
이제 사용자 모델을 가지고 있으므로 app/controllers/users_controller.rb
파일을 편집하여 새로 생성된 사용자에게 이메일을 보내도록 UserMailer.with(user: @user).welcome_email
를 호출하겠습니다. 이는 사용자가 성공적으로 저장된 직후에 실행됩니다.
우리는 deliver_later
를 사용하여 이메일 전송을 예약할 것입니다. 이는 Active Job에 의해 지원됩니다. 그렇게 하면 컨트롤러 액션이 전송이 완료되기를 기다리지 않고 계속 실행될 수 있습니다.
class UsersController < ApplicationController # ... # POST /users or /users.json def create @user = User.new(user_params) respond_to do |format| if @user.save # Tell the UserMailer to send a welcome email after save UserMailer.with(user: @user).welcome_email.deliver_later format.html { redirect_to(@user, notice: 'User was successfully created.') } format.json { render json: @user, status: :created, location: @user } else format.html { render action: 'new' } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # ... end
참고: Active Job의 기본 동작은 :async
어댑터를 사용하여 작업을 실행하는 것입니다.
따라서 deliver_later
를 사용하여 비동기적으로 이메일을 보낼 수 있습니다.
Active Job의 기본 어댑터는 프로세스 내 스레드 풀로 작업을 실행합니다.
개발/테스트 환경에 적합하지만, 프로덕션에는 적합하지 않습니다. 왜냐하면 재시작 시 보류 중인 작업을 삭제하기 때문입니다.
지속적인 백엔드가 필요한 경우 Sidekiq, Resque 등의 Active Job 어댑터를 사용해야 합니다.
즉시 이메일을 보내고 싶다면(예: 크론 작업에서) deliver_now
를 사용하면 됩니다:
class SendWeeklySummary def run User.find_each do |user| UserMailer.with(user: user).weekly_summary.deliver_now end end end
with
에 전달된 모든 키-값 쌍은 메일러 액션의 params
가 됩니다. 따라서 with(user: @user, account: @user.account)
는 params[:user]
와 params[:account]
를 메일러 액션에서 사용할 수 있게 합니다. 컨트롤러의 params와 마찬가지입니다.
weekly_summary
메서드는 ActionMailer::MessageDelivery
객체를 반환하며, 이 객체는 deliver_now
또는 deliver_later
를 호출하여 자신을 전송할 수 있습니다. ActionMailer::MessageDelivery
객체는 Mail::Message
객체의 래퍼입니다. Mail::Message
객체를 검사, 수정 또는 기타 작업을 수행하려면 ActionMailer::MessageDelivery
객체의 message
메서드를 사용하면 됩니다.
헤더 값의 자동 인코딩
Action Mailer는 헤더와 본문 내의 다국어 문자를 자동으로 인코딩합니다.
더 복잡한 예, 예를 들어 대체 문자 집합 정의 또는 자체 인코딩 텍스트 등은 Mail 라이브러리를 참조하세요.
액션 메일러 메서드 전체 목록
이메일 메시지를 보내기 위해 사용해야 하는 메서드는 다음 세 가지뿐입니다:
- [
headers
][] - 이메일에 원하는 헤더를 지정합니다. 헤더 필드 이름과 값 쌍의 해시를 전달하거나headers[:field_name] = 'value'
와 같이 호출할 수 있습니다. - [
attachments
][] - 이메일에 첨부 파일을 추가할 수 있습니다. 예를 들어,attachments['file-name.jpg'] = File.read('file-name.jpg')
와 같이 사용합니다. mail
- 실제 이메일을 생성합니다. 매개변수로 헤더를 해시 형태로mail
메서드에네, 계속해서 번역하겠습니다.
첨부 파일 추가하기
Action Mailer를 사용하면 첨부 파일을 매우 쉽게 추가할 수 있습니다.
파일 이름과 내용을 전달하면 Action Mailer와 Mail gem이 자동으로
mime_type
을 추측하고encoding
을 설정하며 첨부 파일을 생성합니다.attachments['filename.jpg'] = File.read('/path/to/filename.jpg')
mail
메서드가 호출되면 첨부 파일이 포함된 multipart 이메일을 보냅니다. 최상위 부분은 multipart/mixed
이고, 첫 번째 부분은 일반 텍스트와 HTML 이메일 메시지가 포함된 multipart/alternative
입니다.
참고: Mail은 첨부 파일을 자동으로 Base64로 인코딩합니다. 다른 인코딩을 원하는 경우 내용을 인코딩하고 인코딩된 내용과 인코딩을 Hash
로 attachments
메서드에 전달하면 됩니다.
파일 이름과 헤더 및 내용을 지정하면 Action Mailer와 Mail이 전달한 설정을 사용합니다.
encoded_content = SpecialEncode(File.read('/path/to/filename.jpg')) attachments['filename.jpg'] = { mime_type: 'application/gzip', encoding: 'SpecialEncoding', content: encoded_content }
참고: 인코딩을 지정하면 Mail은 내용이 이미 인코딩되어 있다고 간주하고 Base64로 인코딩하지 않습니다.
인라인 첨부 파일 만들기
Action Mailer 3.0부터 인라인 첨부 파일 기능이 훨씬 더 간단하고 자연스러워졌습니다.
먼저 첨부 파일을 인라인 첨부 파일로 만들려면 메일러 내에서
#inline
을 호출하면 됩니다:def welcome attachments.inline['image.jpg'] = File.read('/path/to/image.jpg') end
그런 다음 뷰에서
attachments
를 해시로 참조하고 원하는 첨부 파일을 지정한 다음url
을 호출하여 결과를image_tag
에 전달할 수 있습니다:<p>Hello there, this is our image</p> <%= image_tag attachments['image.jpg'].url %>
이것은 표준
image_tag
호출이므로 첨부 파일 URL 뒤에 옵션 해시를 전달할 수 있습니다:<p>Hello there, this is our image</p> <%= image_tag attachments['image.jpg'].url, alt: 'My Photo', class: 'photos' %>
여러 수신자에게 이메일 보내기
한 번의 이메일로 여러 명의 수신자에게 이메일을 보낼 수 있습니다(예: 모든 관리자에게 새로운 가입자 알림). 이메일 목록을 :to
키에 설정하면 됩니다. 이메일 목록은 이메일 주소 배열이거나 쉼표로 구분된 이메일 주소 문자열일 수 있습니다.
class AdminMailer < ApplicationMailer default to: -> { Admin.pluck(:email) }, from: 'notification@example.com' def new_registration(user) @user = user mail(subject: "New User Signup: #{@user.email}") end end
동일한 형식을 사용하여 참조(Cc:) 및 숨은 참조(Bcc:) 수신자를 설정할 수 있습니다. 각각 :cc
및 :bcc
키를 사용합니다.
이름과 함께 이메일 보내기
때때로 이메일 주소 대신 사람의 이름을 표시하고 싶을 때가 있습니다. email_address_with_name
을 사용할 수 있습니다:
def welcome_email @user = params[:user] mail( to: email_address_with_name(@user.email, @user.name), subject: 'Welcome to My Awesome Site' ) end
동일한 기술을 사용하여 발신자 이름을 지정할 수 있습니다:
class UserMailer < ApplicationMailer default from: email_address_with_name('notification@example.com', 'Example Company Notifications') end
이름이 빈 문자열인 경우 주소만 반환합니다.
메일러 뷰
메일러 뷰는 app/views/name_of_mailer_class
디렉토리에 있습니다. 특정 메일러 뷰는 메서드 이름과 동일하기 때문에 클래스에 알려져 있습니다. 위의 예에서 welcome_email
메서드의 메일러 뷰는 HTML 버전의 경우 app/views/user_mailer/welcome_email.html.erb
, 텍스트 버전의 경우 welcome_email.text.erb
에 있습니다.
기본 메일러 뷰를 변경하려면 다음과 같이 하면 됩니다:
class UserMailer < ApplicationMailer default from: 'notifications@example.com' def welcome_email @user = params[:user] @url = 'http://example.com/login' mail(to: @user.email, subject: 'Welcome to My Awesome Site', template_path: 'notifications', template_name: 'another') end end
이 경우 notifications
폴더의 another
템플릿을 찾습니다. template_path
에 경로 배열을 전달할 수도 있으며, 이 경우 순서대로 검색됩니다.
더 유연성이 필요하다면 블록을 전달하고 특정 템플릿을 렌더링하거나 템플릿 파일 없이 인라인 또는 텍스트를 렌더링할 수 있습니다:
class UserMailer < ApplicationMailer default from: 'notifications@example.com' def welcome_email @user = params[:user] @url = 'http://example.com/login' mail(to: @user.email, subject: 'Welcome to My Awesome Site') do |format| format.html { render 'another_template' } format.text { render plain: 'Render text' } end end end
이렇게 하면 HTML 부분에 ‘another_template.html.erb’ 템플릿을 렌더링하고 텍스트 부분에 렌더링된 텍스트를 사용합니다. 렌더 명령은 Action Controller에서 사용되는 것과 동일하므로 :text
, :inline
등과 같은 모든 옵션을 사용할 수 있습니다.
기본 app/views/mailer_name/
디렉토리 외부에 있는 템플릿을 렌더링하려면 prepend_view_path
를 적용할 수 있습니다:
class UserMailer < ApplicationMailer prepend_view_path "custom/path/to/mailer/view" # This will try to load "custom/path/to/mailer/view/welcome_email" template def welcome_email # ... end end
append_view_path
메서드를 사용할 수도 있습니다.
메일러 뷰 캐싱
애플리케이션 뷰에서와 마찬가지로 메일러 뷰에서도 cache
메서드를 사용하여 조각 캐싱을 수행할 수 있습니다.
<% cache do %> <%= @company.name %> <% end %>
이 기능을 사용하려면 애플리케이션을 다음과 같이 구성해야 합니다:
config.action_mailer.perform_caching = true
조각 캐싱은 multipart 이메일에서도 지원됩니다. Rails 캐싱 가이드에서 캐싱에 대해 자세히 알아보세요.
액션 메일러 레이아웃
컨트롤러 뷰와 마찬가지로 메일러에도 레이아웃을 사용할 수 있습니다. 레이아웃 이름은 user_mailer.html.erb
및 user_mailer.text.erb
와 같이 메일러와 동일해야 자동으로 인식됩니다.
다른 파일을 사용하려면 메일러에서 layout
을 호출하세요:
class UserMailer < ApplicationMailer layout 'awesome' # use awesome.(html|text).erb as the layout end
컨트롤러 뷰와 마찬가지로 레이아웃 내에서 yield
를 사용하여 뷰를 렌더링합니다.
또한 format 블록 내에서 layout: 'layout_name'
옵션을 전달하여 다른 형식에 대해 다른 레이아웃을 지정할 수 있습니다:
class UserMailer < ApplicationMailer def welcome_email mail(to: params[:user].email) do |format| format.html { render layout: 'my_layout' } format.text end end end
HTML 부분은 my_layout.html.erb
파일을 사용하고 텍스트 부분은 일반적인 user_mailer.text.erb
파일을 사용합니다(있는 경우).
이메일 미리보기
액션 메일러 미리보기를 사용하면 특별한 URL을 방문하여 이메일의 모습을 볼 수 있습니다. 위의 예에서 UserMailer
의 미리보기 클래스는 UserMailerPreview
라고 명명되며 test/mailers/previews/user_mailer_preview.rb
에 있습니다. welcome_email
의 미리보기를 보려면 동일한 이름의 메서드를 구현하고 UserMailer.welcome_email
을 호출하면 됩니다:
class UserMailerPreview < ActionMailer::Preview def welcome_email UserMailer.with(user: User.first).welcome_email end end
그러면 http://localhost:3000/rails/mailers/user_mailer/welcome_email에서 미리보기를 볼 수 있습니다.
app/views/user_mailer/welcome_email.html.erb
나 메일러 자체에서 무언가를 변경하면 자동으로 다시 로드되어 새 스타일을 즉시 렌더링합니다. http://localhost:3000/rails/mailers에서 미리보기 목록도 볼 수 있습니다.
기본적으로 이러한 미리보기 클래스는 test/mailers/previews
에 있습니다.
이는 preview_paths
옵션을 사용하여 구성할 수 있습니다. 예를 들어 lib/mailer_previews
를 추가하려면 config/application.rb
에서 다음과 같이 구성할 수 있습니다:
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
액션 메일러 뷰에서 URL 생성
컨트롤러와 달리 메일러 인스턴스에는 들어오는 요청에 대한 컨텍스트가 없으므로 :host
매개변수를 직접 제공해야 합니다.
:host
는 일반적으로 애플리케이션 전체에서 일관되므로 config/application.rb
에서 전역적으로 구성할 수 있습니다:
config.action_mailer.default_url_options = { host: 'example.com' }
이러한 동작 때문에 이메일 내에서 *_path
헬퍼를 사용할 수 없습니다. 대신 관련 *_url
헬퍼를 사용해야 합니다. 예를 들어
<%= link_to 'welcome', welcome_path %>네, 계속해서 번역하겠습니다. 대신 다음과 같이 사용해야 합니다: ```html+erb <%= link_to 'welcome', welcome_url %>
전체 URL을 사용하면 이메일에서 링크가 작동합니다.
url_for
를 사용하여 URL 생성하기
url_for
는 기본적으로 전체 URL을 생성합니다.
:host
옵션을 전역적으로 구성하지 않은 경우 url_for
에 전달해야 합니다.
<%= url_for(host: 'example.com', controller: 'welcome', action: 'greeting') %>
명명된 경로를 사용하여 URL 생성하기
이메일 클라이언트에는 웹 컨텍스트가 없으므로 경로에 기본 URL이 없어 완전한 웹 주소를 형성할 수 없습니다. 따라서 항상 *_url
버전의 명명된 경로 헬퍼를 사용해야 합니다.
:host
옵션을 전역적으로 구성하지 않은 경우 URL 헬퍼에 전달해야 합니다.
<%= user_url(@user, host: 'example.com') %>
액션 메일러 뷰에 이미지 추가하기
컨트롤러와 달리 메일러 인스턴스에는 들어오는 요청에 대한 컨텍스트가 없으므로 :asset_host
매개변수를 직접 제공해야 합니다.
:asset_host
는 일반적으로 애플리케이션 전체에서 일관되므로 config/application.rb
에서 전역적으로 구성할 수 있습니다:
config.action_mailer.asset_host = 'http://example.com'
참고: 요청에서 프로토콜을 유추할 수 없으므로 :asset_host
구성에 http://
또는 https://
와 같은 프로토콜을 지정해야 합니다.
이제 이메일 내에 이미지를 표시할 수 있습니다.
<%= image_tag 'image.jpg' %>
멀티파트 이메일 보내기
Action Mailer는 동일한 작업에 대해 다른 템플릿이 있는 경우 자동으로 멀티파트 이메일을 보냅니다. 따라서 UserMailer
예에서 app/views/user_mailer
에 welcome_email.text.erb
와 welcome_email.html.erb
가 있는 경우 Action Mailer는 자동으로 HTML과 텍스트 버전이 포함된 멀티파트 이메일을 보냅니다.
부분의 삽입 순서는 ActionMailer::Base.default
내의 :parts_order
내에서 결정됩니다.
동적 배달 옵션으로 이메일 보내기
기본 배달 옵션(예: SMTP 자격 증명)을 재정의하려면 메일러 액션에서 delivery_method_options
를 사용할 수 있습니다.
class UserMailer < ApplicationMailer def welcome_email @user = params[:user] @url = user_url(@user) delivery_options = { user_name: params[:company].smtp_user, password: params[:company].smtp_password, address: params[:company].smtp_host } mail(to: @user.email, subject: "Please see the Terms and Conditions attached", delivery_method_options: delivery_options) end end
템플릿 렌더링 없이 이메일 보내기
때로는 템플릿 렌더링 단계를 건너뛰고 문자열로 이메일 본문을 제공하고 싶을 수 있습니다. :body
옵션을 사용하여 이를 달성할 수 있습니다. 이 경우 :content_type
옵션을 잊지 마세요. 그렇지 않으면 Rails는 기본적으로 text/plain
을 사용합니다.
class UserMailer < ApplicationMailer def welcome_email mail(to: params[:user].email, body: params[:email_body], content_type: "text/html", subject: "Already rendered!") end end
액션 메일러 콜백
Action Mailer에서는 메시지를 구성하기 위해 before_action
, after_action
및 around_action
을 지정할 수 있으며, 배달을 제어하기 위해 before_deliver
, after_deliver
및 around_deliver
를 지정할 수 있습니다.
콜백은 컨트롤러와 유사하게 블록 또는 메일러 클래스의 메서드 기호로 지정할 수 있습니다.
before_action
을 사용하여 인스턴스 변수를 설정하고, 메일 객체에 기본값을 채우거나, 기본 헤더와 첨부 파일을 삽입할 수 있습니다.
class InvitationsMailer < ApplicationMailer before_action :set_inviter_and_invitee before_action { @account = params[:inviter].account } default to: -> { @invitee.email_address }, from: -> { common_address(@inviter) }, reply_to: -> { @inviter.email_address_with_name } def account_invitation mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})" end def project_invitation @project = params[:project] @summarizer = ProjectInvitationSummarizer.new(@project.bucket) mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})" end private def set_inviter_and_invitee @inviter = params[:inviter] @invitee = params[:invitee] end end
after_action
을 사용하여before_action
과 유사한 설정을 수행할 수 있지만, 메일러 액션에서 설정된 인스턴스 변수를 사용합니다.after_action
콜백을 사용하면mail.delivery_method.settings
를 업데이트하여 배달 방법 설정을 재정의할 수 있습니다.
class UserMailer < ApplicationMailer before_action { @business, @user = params[:business], params[:user] } after_action :set_delivery_options, :prevent_delivery_to_guests, :set_business_headers def feedback_message end def campaign_message end private def set_delivery_options # 여기서 mail 인스턴스, @business 및 @user 인스턴스 변수에 액세스할 수 있습니다. if @business && @business.has_smtp_settings? mail.delivery_method.settings.merge!(@business.smtp_settings) end end def prevent_delivery_to_guests if @user && @user.guest? mail.perform_deliveries = false end end def set_business_headers if @business headers["X-SMTPAPI-CATEGORY"] = @business.code end end end
after_deliver
를 사용하여 메시지 배달을 기록할 수 있습니다. 또한 옵저버/인터셉터와 유사한 동작을 허용하지만 전체 메일러 컨텍스트에 액세스할 수 있습니다.
class UserMailer < ApplicationMailer after_deliver :mark_delivered before_deliver :sandbox_staging after_deliver :observe_delivery def feedback_message @feedback = params[:feedback] end private def mark_delivered params[:feedback].touch(:delivered_at) end # 인터셉터의 대안 def sandbox_staging message.to = ['sandbox@example.com'] if Rails.env.staging? end # 비교 가능한 옵저버 예제보다 콜백에 더 많은 컨텍스트가 있습니다. def observe_delivery EmailDelivery.log(message, self.class, action_name, params) end end
- 메일러 콜백은 본문이 nil이 아닌 값으로 설정되면 추가 처리를 중단합니다.
before_deliver
는throw :abort
로 중단할 수 있습니다.
액션 메일러 헬퍼 사용하기
Action Mailer는 AbstractController
를 상속받으므로 Action Controller에서와 마찬가지로 대부분의 헬퍼에 액세스할 수 있습니다.
ActionMailer::MailHelper
에서도 몇 가지 Action Mailer 전용 헬퍼 메서드를 사용할 수 있습니다. 예를 들어 이를 통해 뷰에서 메일러 인스턴스에 mailer
로 액세스하고 메시지에 message
로 액세스할 수 있습니다:
<%= stylesheet_link_tag mailer.name.underscore %> <h1><%= message.subject %></h1>
액션 메일러 구성
다음 구성 옵션은 environment.rb, production.rb 등의 환경 파일에서 설정하는 것이 가장 좋습니다.
구성 | 설명 |
---|---|
logger |
메일링 실행에 대한 정보를 생성합니다. nil 로 설정하면 로깅이 비활성화됩니다. Ruby의 Logger 및 Log4r 로거와 호환됩니다. |
smtp_settings |
:smtp 배달 방법에 대한 자세한 구성을 허용합니다:
|
구성 | 설명 |
---|---|
또는 'peer’) 또는 직접 상수(OpenSSL::SSL::VERIFY_NONE 또는 OpenSSL::SSL::VERIFY_PEER )를 사용할 수 있습니다.:ssl/:tls - SMTP 연결에서 SMTP/TLS(SMTPS: TLS 연결을 통한 SMTP) 사용을 활성화합니다:open_timeout - 연결을 열려고 시도하는 동안 기다리는 초 수.:read_timeout - read(2) 호출이 시간 초과될 때까지 기다리는 초 수. |
|
sendmail_settings |
:sendmail 배달 방법에 대한 옵션을 재정의할 수 있습니다.
|
raise_delivery_errors |
이메일 전송에 실패할 경우 오류를 발생시킬지 여부입니다. 이는 외부 이메일 서버가 즉시 배달을 위해 구성된 경우에만 작동합니다. 기본값은 true 입니다. |
delivery_method |
배달 방법을 정의합니다. 가능한 값은 다음과 같습니다:
|
perform_deliveries |
deliver 메서드가 호출될 때 실제로 배달이 수행되는지 여부를 결정합니다. 기본적으로 수행되지만, 기능 테스트를 돕기 위해 이를 비활성화할 수 있습니다. 이 값이 false 이면 delivery_method 가 :test 여도 deliveries 배열이 채워지지 않습니다. |
deliveries |
:test 배달 방법을 사용하여 보낸 모든 이메일을 배열에 보관합니다. 단위 및 기능 테스트에 가장 유용합니다. |
delivery_job |
deliver_later 에 사용되는 작업 클래스입니다. 기본값은 ActionMailer::MailDeliveryJob 입니다. |
deliver_later_queue_name |
기본 delivery_job 에 사용되는 큐의 이름입니다. 기본 Active Job 큐의 기본값입니다. |
default_options |
mail 메서드 옵션(:from , :reply_to 등)의 기본값을 설정할 수 있습니다. |
가능한 모든 구성에 대한 자세한 내용은 Configuring Rails Applications 가이드의 Configuring Action Mailer를 참조하세요.
액션 메일러 구성 예
적절한 config/environments/$RAILS_ENV.rb
파일에 다음을 추가하는 것이 한 예입니다:
config.action_mailer.delivery_method = :sendmail # Defaults to: # config.action_mailer.sendmail_settings = { # location: '/usr/sbin/sendmail', # arguments: %w[ -i ] # } config.action_mailer.perform_deliveries = true config.action_mailer.raise_delivery_errors = true config.action_mailer.default_options = { from: 'no-reply@example.com' }
Gmail에 대한 액션 메일러 구성
Action Mailer는 Mail gem을 사용하며 유사한 구성을 허용합니다.
Gmail을 통해 보내려면 config/environments/$RAILS_ENV.rb
파일에 다음을 추가하세요:
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.gmail.com', port: 587, domain: 'example.com', user_name: '<username>', password: '<password>', authentication: 'plain', enable_starttls: true, open_timeout: 5, read_timeout: 5 }
Mail gem의 오래된 버전(2.6.x 이하)을 사용하는 경우 enable_starttls_auto
를 대신 사용하세요.
참고: Google은 보안 수준이 낮은 앱의 로그인을 차단합니다. 여기에서 Gmail 설정을 변경하여 시도를 허용할 수 있습니다. Gmail 계정에 2단계 인증이 활성화된 경우 앱 비밀번호를 설정하고 이를 사용해야 합니다.
메일러 테스트
메일러를 테스트하는 방법에 대한 자세한 지침은 테스팅 가이드에서 확인할 수 있습니다.
이메일 가로채기 및 관찰하기
Action Mailer는 Mail 옵저버 및 인터셉터 메서드에 대한 후크를 제공합니다. 이를 통해 모든 전송된 이메일의 배달 수명 주기 동안 호출되는 클래스를 등록할 수 있습니다.
이메일 가로채기
인터셉터를 사용하면 이메일이 배달 에이전트에 전달되기 전에 이메일을 수정할 수 있습니다. 인터셉터 클래스는 ::delivering_email(message)
메서드를 구현해야 하며, 이메일이 전송되기 전에 호출됩니다.
class SandboxEmailInterceptor def self.delivering_email(message) message.to = ['sandbox@example.com'] end end
인터셉터가 작업을 수행하려면 interceptors
구성 옵션을 사용하여 등록해야 합니다.
config/initializers/mail_interceptors.rb
와 같은 초기화 파일에서 이를 수행할 수 있습니다:
Rails.application.configure do if Rails.env.staging? config.action_mailer.interceptors = %w[SandboxEmailInterceptor] end end
참고: 위의 예는 테스트 목적의 “staging"이라는 사용자 정의 환경을 사용합니다. Creating Rails Environments에서 사용자 정의 Rails 환경에 대해 자세히 알아볼 수 있습니다.
이메일 관찰하기
옵저버를 사용하면 이메일이 전송된 후에 이메일 메시지에 액세스할 수 있습니다. 옵저버 클래스는 :delivered_email(message)
메서드를 구현해야 하며, 이메일이 전송된 후에 호출됩니다.
class EmailDeliveryObserver def self.delivered_email(message) EmailDelivery.log(message) end end
인터셉터와 마찬가지로 observers
구성 옵션을 사용하여 옵저버를 등록해야 합니다.
config/initializers/mail_observers.rb
와 같은 초기화 파일에서 이를 수행할 수 있습니다:
Rails.application.configure do config.action_mailer.observers = %w[EmailDeliveryObserver] end