Rails에서 이메일을 미리 보려면 어떻게해야합니까?


116

이것은 어리석은 질문 일 수 있지만 Rails에서 HTML 이메일을 모을 때 브라우저에서 템플릿을 미리 볼 수있는 특히 쉬운 내장 방법이 있습니까? 아니면 가져 오는 일종의 사용자 지정 컨트롤러를 작성해야합니까? 그것의 관점에서?


2
분명히 어떤 바보 같은 질문이 있습니다 : D
knagode

답변:


133

Action Mailer는 이제 Rails 4.1 에서 이메일 미리보기 방식을 내장하고 있습니다. 예를 들어 다음을 확인하십시오.

# located in test/mailers/previews/notifier_mailer_preview.rb

class NotifierPreview < ActionMailer::Preview
  # Accessible from http://localhost:3000/rails/mailers/notifier/welcome
  def welcome
    Notifier.welcome(User.first)
  end
end

5
@andres 이것은 의도적으로 설계된 것이라 확신합니다. 사용자가 프로덕션 서버에서 메일을 미리 보는 것을 원하지는 않습니다. 이는 로컬 개발 전용입니다.
mpowered

1
@mpowered 사용자가 보내려는 메일을 미리 보거나 수정할 수 있도록하려면 어떻게해야합니까? (예 : 관리자가 사용자 신청을 거부하고 신청자에게 경고하는 이메일이 발송 됨)
시릴 두촌 도리스

2
@CyrilDD 당신은 당신 자신과 같은 것을 만들어야 할 것입니다. 나는 이것이 그 일을위한 도구가 될 것이라고 생각하지 않습니다.
benjaminjosephw

1
미리보기는 localhost : 3000 / rails / mailers / notifier / welcome 에서 사용할 수 있으며 목록은 localhost : 3000 / rails / mailers에 있습니다.
zires

8
당신이 RSpec에를 사용하는 경우, 미리보기에서 이동spec/mailers/previews
드류 스티븐스

73

Daniel의 대답 은 좋은 시작이지만 이메일 템플릿에 동적 데이터가 포함되어 있으면 작동하지 않습니다. 예를 들어 이메일이 주문 영수증이고 그 안에 인쇄한다고 가정합니다 @order.total_price. 이전 방법을 사용하면 @order변수가 nil이됩니다.

내가 사용하는 작은 레시피는 다음과 같습니다.

첫째,이 이메일 미리보기 기능은 확실히 내부 전용이므로 관리 네임 스페이스에 몇 가지 일반 경로를 설정했습니다.

#routes.rb

MySite::Application.routes.draw do
  namespace :admin do
    match 'mailer(/:action(/:id(.:format)))' => 'mailer#:action'
  end
end

다음으로 컨트롤러를 만듭니다. 이 컨트롤러에서는 이메일 템플릿 당 하나의 메소드를 생성합니다. 대부분의 이메일에는 동적 데이터가 포함되어 있으므로 템플릿에 필요한 모든 멤버 변수를 채워야합니다.

이것은 픽스쳐로 수행 할 수 있지만 일반적으로 의사 랜덤 실제 데이터를 가져 오는 것을 선호합니다. 기억하십시오-이것은 단위 테스트가 아닙니다-이것은 순전히 개발 지원입니다. 매번 동일한 결과를 생성 할 필요는 없습니다. 사실, 그렇지 않으면 더 좋을 것입니다!

#app/controllers/admin/mailer_controller.rb
class Admin::MailerController < Admin::ApplicationController

  def preview_welcome()
    @user = User.last
    render :file => 'mailer/welcome.html.erb', :layout => 'mailer'
  end

end

템플릿을 렌더링 할 때 layout=>:mailer. 이렇게하면 일반적인 웹 애플리케이션 레이아웃 (예 :)이 아닌 생성 한 HTML 이메일 레이아웃에 이메일 본문이 포함됩니다 application.html.erb.

그리고 그것은 거의 다입니다. 이제 http://example.com/admin/mailer/preview_welcome 을 방문 하여 환영 이메일 템플릿의 변경 사항을 미리 볼 수 있습니다 .


:) 감사합니다 - 이것은 사실 내가 촬영하고 난 당신의 대답을 읽기 시작으로 단지 코딩했다 정확하게 접근했다
피터 Nixey

좋은 대답입니다! 정확히 내가 필요한 것!
Kulgar

이제 맛있는 레시피입니다! 훌륭한 답변에 감사드립니다!
Rob Cooper

이것은 멋진 대답입니다! 감사합니다!
OzBandit

5
경로는 get 'mailer...이제 대신 이어야합니다 match.
Patrick Berkeley

18

37Signals에는 mail_view 라는 자체 메일 테스트 젬도 있습니다 . 꽤 환상적입니다.


문제 없어요. 어떤 방식으로 사용하게 되었습니까?
Marc

Bac 내가 이것을 게시했을 때 나는 내가 직접 작성한 사용자 정의 컨트롤러로 문제를 해결했지만 곧 다시 칠 것이므로 이것을 실험 할 것입니다
Peter Nixey

16

내가 본 가장 쉬운 설정은 MailCatcher 입니다. 설치는 2 분이 걸렸으며 새 메일러에서 즉시 사용할 수 있습니다.


이것은 참으로 훌륭합니다. 설정은 매우 빠르고 모든 메일러에서 작동합니다! 좋은 팁!
REPT


5

최근에 Maily 라는 gem을 작성 하여 브라우저를 통해 애플리케이션 이메일을 미리보고, 편집하고 (템플릿 파일) 전달했습니다. 또한 데이터를 연결하는 친숙한 방법, 유연한 권한 부여 시스템 및 최소한의 UI를 제공합니다.

가까운 장래에 다음과 같은 새로운 기능을 추가 할 계획입니다.

  • 이메일 당 여러 후크
  • UI를 통해 이메일 매개 변수화 (메일러 방법의 인수)
  • 번역 키로 재생 (목록, 강조 표시, ...)

나는 그것이 당신을 도울 수 있기를 바랍니다.



4

rails을 사용하는 경우 메일 미리보기를 생성합니다 rails g mailer CustomMailer. 폴더 CustomMailerPreview안에 파일 이 spec/mailers/previews생깁니다.

여기서 메일러를 호출하고 미리보기를 생성하는 메소드를 작성할 수 있습니다.

예를 들어-

class CustomMailerPreview < ActionMailer::Preview
  def contact_us_mail_preview
    CustomMailer.my_mail(user: User.first)
  end
end

http : // localhost : 3000 / rails / mailers / custom_mailer 에서 모든 이메일을 미리 봅니다.


RSpec에 나는 내 앱에 추가 config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
마우로

3

Rails 이메일 미리보기를 사용하면 개발 모드에서 웹 브라우저에서 이메일을 빠르게 볼 수 있습니다.

1) “gem ‘rails_email_preview’, ‘~> 0.2.29’ “gem 파일에 추가 하고 번들을 설치합니다.

2) 실행 “rails g rails_email_preview:install” 하면 config 폴더에 이니셜 라이저가 생성되고 경로가 추가됩니다.

3) “rails g rails_email_preview:update_previews”앱 디렉토리에서이 상자 mailer_previews 폴더를 실행하십시오 .

Generator는 각 이메일에 스텁을 추가 한 다음 스텁을 모의 데이터로 채 웁니다.

전의:

class UserMailerPreview
def invitation
UserMailer.invitation mock_user(‘Alice’), mock_user(‘Bob’)
end
def welcome
UserMailer.welcome mock_user
end
private
def mock_user(name = Bill Gates’)
fake_id User.new(name: name, email: user#{rand 100}@test.com”)
end
def fake_id(obj)
obj.define_singleton_method(:id) { 123 + rand(100) }
obj
end
end

4) 검색어의 매개 변수는 클래스 미리보기를위한 인스턴스 변수로 사용할 수 있습니다. 예 : “/emails/user_mailer_preview-welcome?user_id=1” @user_id환영 방법에 정의 된 것과 같은 URL이 있으면 UserMailerPreview특정 사용자에게 메일을 보내는 데 도움이됩니다.

class UserMailerPreview
def welcome
user = @user_id ? User.find(@user_id) : mock_user
UserMailer.welcome(user)
end
end

5) 다음과 같은 REP url에 액세스하려면

rails_email_preview.rep_root_url
rails_email_preview.rep_emails_url
rails_email_preview.rep_email_url(‘user_mailer-welcome’)

6) REP를 통해 이메일을 보낼 수 있으며 환경 메일러 설정을 사용합니다. 테스트 환경에서 메일 전송을 비활성화하려면 이니셜 라이저에서이 줄의 주석 처리를 제거하십시오.

config.enable_send_email = false

출처 : RailsCarma 블로그 : Mail_View Gem을 사용하여 Rails 애플리케이션에서 이메일 미리보기


3

누구도 letter_opener를 언급하지 않았다는 것에 놀랐습니다 . 이메일이 dev에 전달 될 때마다 브라우저 페이지로 이메일을 렌더링하고 여는 gem입니다.


1
letter_opener는 멋진 보석이며 필수품입니다. 그러나 때때로 메일은 순전히 메일의 html / css를 확인하기 위해 재생하지 않으려는 특별한 이벤트에서 시작됩니다.
Mauro

2

메일러에서 직접 미리 볼 수있는 방법은 없습니다. 그러나 당신이 쓴 것처럼, 당신은 다음과 같은 컨트롤러를 작성할 수 있습니다.

class EmailPreviewsControllers < ActionController::Base
  def show
    render "#{params[:mailer]}_mailer/#{params[:method]}"
  end
end

하지만 이메일이 올바르게 보이면 테스트하는 가장 좋은 방법은 아니라고 생각합니다.


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'앱용으로 만든 HTML 이메일 레이아웃에 이메일 본문을 포함합니다.
덱스터

감사합니다. 브라우저 호환성을 다시 확인하고 싶지 않습니다. 별도로 처리하겠습니다. 신속하게 처리하고 어떻게 보이는지 확인하고 싶습니다. 귀하의 접근 방식이 잘 작동한다고 생각합니다.
Peter Nixey

1

나는 mails_viewer gem을 선호합니다 . 이 gem은 HTML 템플릿을 tmp 폴더에 저장하므로 매우 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.