窓際BLOG

プログラミングの学習メモや書籍の感想等を公開していきます。

Ruby on Rails:メール送信処理の準備・実装内容について(開発・本番環境)

はじめに

Ruby on Railsでメール送信を行う際に必要となったツール及び実装を整理しましたφ(..)

目次

ActionMailerとは

Railsには、メールを送信するために、ActionMailerという仕組みがあります。 ActionMailerは、コントローラやーViewと同じような使い方でメールを送信させることができます。

railsguides.jp

用意するツール

SendGrid

SendGridを使うことで、自前でSMTPサーバ(メール送信用の端末)を 用意しなくてもRailsからメールを送付することが出来る。

SendGridはクラウドベースのメール配信サービスです。 アカウントを取得するだけですぐに利用を開始でき、簡単・確実にメールをお届けします。 面倒なメンテナンス作業や無駄なコストを削減し、ビジネスを加速させましょう!

sendgrid.kke.co.jp

使い方

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

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

メール送信処理を実装する

手順概要

  1. Mailerの生成
  2. Mailerの実装
  3. Mail Viewの実装
  4. 送信アクションの実装

メール送信処理概要

  • 送信アクションの実行(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

以上