はじめに
Ruby on Railsでメール送信を行う際に必要となったツール及び実装を整理しましたφ(..)
目次
ActionMailerとは
Railsには、メールを送信するために、ActionMailerという仕組みがあります。
ActionMailerは、コントローラやーViewと同じような使い方でメールを送信させることができます。
railsguides.jp
用意するツール
SendGrid
SendGridを使うことで、自前でSMTPサーバ(メール送信用の端末)を
用意しなくてもRailsからメールを送付することが出来る。
SendGridはクラウドベースのメール配信サービスです。
アカウントを取得するだけですぐに利用を開始でき、簡単・確実にメールをお届けします。
面倒なメンテナンス作業や無駄なコストを削減し、ビジネスを加速させましょう!
sendgrid.kke.co.jp
使い方
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アプリのドメイン' }
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
github.com
使い方
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
以上