はじめに
Ruby on Railsでメール送信を行う際に必要となったツール及び実装を整理しましたφ(..)
目次
ActionMailerとは
Railsには、メールを送信するために、ActionMailerという仕組みがあります。 ActionMailerは、コントローラやーViewと同じような使い方でメールを送信させることができます。
用意するツール
SendGrid
SendGridを使うことで、自前でSMTPサーバ(メール送信用の端末)を 用意しなくてもRailsからメールを送付することが出来る。
SendGridはクラウドベースのメール配信サービスです。 アカウントを取得するだけですぐに利用を開始でき、簡単・確実にメールをお届けします。 面倒なメンテナンス作業や無駄なコストを削減し、ビジネスを加速させましょう!
使い方
herokuへプラグインを導入
rem SendGridのプラグインを導入 rem Herokuアカウントにクレジットカード情報を登録しないとエラーとなるため注意 heroku addons:create sendgrid:starter
設定用にSendgridの情報を取得
rem USER_NAMEの確認 heroku config:get SENDGRID_USERNAME rem PASSWORDの確認 heroku config:get SENDGRID_PASSWORD
SendGridの情報を環境変数へ設定
rem USER_NAMEの環境変数設定 heroku config:set SENDGRID_USERNAME=(調べたSENDGRID_USERNAME) rem PASSWORDの環境変数設定 heroku config:set SENDGRID_PASSWORD=(調べたSENDGRID_PASSWORD)
設定ファイルの編集
config/environments/production.rb
に下記を追記
config.action_mailer.default_url_options = { host: '自分のHerokuアプリのドメイン' } #hoge.herokuapp.com ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.smtp_settings = { user_name: ENV['SENDGRID_USERNAME'], password: ENV['SENDGRID_PASSWORD'], domain: "heroku.com", address: "smtp.sendgrid.net", port: 587, authentication: :plain, enable_starttls_auto: true }
※環境変数からユーザー名やパスワードを取得することによって、公開を防ぐ事ができる。
rem herokuのドメイン名確認 heroku domains
letter_opener_web
letter_opener_webはメールの送信結果をブラウザ上で確認出来るgem
使い方
gemのインストール
Gemfile
へ下記を追記し、bundle install
実施する。
省略 # 開発環境のみで使用 group :development do gem 'letter_opener_web' end
lettor_opener_webのroutingを設定
config/routes
に下記を追記する。
# 開発環境かどうかを判断 if Rails.env.development? mount LetterOpenerWeb::Engine, at: "/letter_opener" end
開発環境の環境設定
config/environments/development.rb
に下記を追記
# 省略 config.action_mailer.default_url_options = { host: 'localhost:3000' } config.action_mailer.delivery_method = :letter_opener_web
メール送信処理を実装する
手順概要
- Mailerの生成
- Mailerの実装
- Mail Viewの実装
- 送信アクションの実装
メール送信処理概要
- 送信アクションの実行(Mailerの呼び出し)
- MailerがMail Viewを元に本文を生成し、送信
具体的な実装内容
Mailerの生成
rails g mailer "Mailer名" rem rails g mailer "Mailer名" "メソッド名"で、メソッドをあわせて作成することも可能
Mailerの実装
Mailerでは宛先とメールのタイトル等を指定可能、引数も取ることが出来る。
app/mailers/notice_mailer.rb
class NoticeMailer < ApplicationMailer 省略 def sendmail_blog(blog) @blog = blog mail to: "メールアドレス", # 宛先 subject: "メールタイトル" # メールのタイトル end end
Mail Viewの実装
Mail Viewでは実装に送信するメールの文面を通常のViewのように記載可能
※MailerもControllerと同様にメソッド名と紐付いたViewを取得するため注意
app/views/notice_mailer/sendmail_blog.html.erb
<h1>新しくブログが投稿されました!</h1> <h4>title: <%= @blog.title %></h4> <p>content: <%= @blog.content %></p> <p> <%= link_to '投稿されたブログはこちら', blogs_url %> </p>
※テキスト形式のメール文面も作成する場合はapp/views/notice_mailer/sendmail_blog.text.erb
も合わせて編集する。
送信アクションの実装
メールの送信にはdeliver
メソッドを使用する。
app/controllers/blogs_controller.rb
def create @blog = Blog.new(blogs_params) if @blog.save redirect_to blogs_path, notice: "ブログを作成しました!" NoticeMailer.sendmail_blog(@blog).deliver else render 'new' end end
以上