LoginSignup
0

More than 3 years have passed since last update.

railsでメール送信機能実装

Posted at

はじめに

現場で使える Ruby on Rails 5速習実践ガイドでインプットを行っており、アウトプットで投稿しています。
サンプルは、タスク管理アプリです。今回の投稿では、ユーザーがタスクを登録したときに、「○○タスクが登録されました」というメールを送る機能を実装します。

目次

  1. メイラーの作成
  2. メソッドを追加
  3. テンプレート作成
  4. 送信処理実装
  5. 動作確認
  6. テスト作成
  7. 参考文献

メイラーの作成

メイラーとは、ActionMailerのことで、railsに搭載されているメールを送る機能です。controllerが、templateに情報を渡し画面出力を行っているのと同様に、Mailerもtemplateに情報を渡しメールを送信します。
まずは、今回実装するTaskMailerを作成します。以下のコマンドを実行します。

rails g mailer TaskMailer

メソッドを追加

先程のコマンドでapp/mailer/task_mailer.rbというファイルが作成されます。そこに、今回送信するメールのメソッド「creation_email」を定義します。

app/mailer/task_mailer.rb
def creation_email(task)
  @task = task
  mail(
    subject: 'タスク作成完了メール',
    to: 'user@example.com',
    from: 'task@example.com'
  )
end

こちらのメソッドを呼び出すときに、追加されたタスクを引数として渡してもらいます。taskの内容をtemplateで表示するのでインスタンス変数に格納しています。

テンプレート作成

次にテンプレートを作成します。ユーザーの受信環境によっては、html形式のメールを表示できない可能性があります。text形式のファイルを合わせて作成し、html形式と合わせて送信しますのでファイルを二種類作成します。

app/views/task_mailer/creation_email.html.slim
| 以下のタスクを作成しました

ul
  li
    | 名称:
    = @task.name
  li
    | 詳しい説明
    = simple_format(@task.description)

app/views/task_mailer/creation_email.text.slim
| 以下のタスクを作成しました
= "\n"
| 名称:
= @task.name
= "\n"
| 詳しい説明
= "\n"
= @task.description

送信処理実装

ここまで来たらあとは、送信する処理を記述するのみです!
今回は、タスクの保存処理と合わせてメールを送信するため、tasks_controllerのcreateメソッドに送信処理を書きます。

app/controllers/tasks_controller.rb
  
    if @task.save
      TaskMailer.creation_email(@task).deliver_now
      SampleJob.perform_later
      logger.debug "task:「#{@task.attributes.inspect}」を登録しました"
      redirect_to tasks_url, notice: "タスク「#{@task.name}」を登録しました。"
    else
      render :new
    end
  

deliver_nowは文字通り、即時に送信する命令です。5分後にメールを送りたいときは、deliver_later(wait: 5minutes)とします。

動作確認

メールが送信されたか、メールの内容は意図したとおりになっているか。これを確かめるために、「mailcatcher」というgemを使用します。

gem install mailcatcher

上記のコマンドを実行し、railsの設定ファイルに以下の記述を行います。

config/environments/development.rb
  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = false
  # 以下二行を追記
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { address: '127.0.0.1', port: 1025}

上記は開発環境の設定ですが、本番環境の設定は、procuction.rbに記述をします。

設定ファイルの記述が完了したら、サーバーを再起動してください。
確認の手順は、

  • ターミナルでmailcatcherを実行
  • メール送信のフローを実行後、http://127.0.0.1:1080/にアクセス

そうすると、送信メールの確認ができます。

テスト作成

まずは、mailerのSpec用にディレクトリを作成します。

mkdir spec/mailers

作成したフォルダの中にtask_mailer_spec.rbを作成し、以下のように記述します。

spec/mailers/task_mailer_spec.rb
require 'rails_helper'
describe TaskMailer, type: :mailer do
end

これで枠組みは完成なので、実際にテストを書いていきます。

spec/mailers/task_mailer_spec.rb
require "rails_helper"

RSpec.describe TaskMailer, type: :mailer do
  let(:task){FactoryBot.create(:task, name: 'メイラーSpecを書く', description: '送信したメールの内容を確認します')}
  let(:text_body) do
    part = mail.body.parts.detect{|part| part.content_type == 'text/plain; charset=UTF-8'}
    part.body.raw_source
  end
  let(:html_body) do
    part = mail.body.parts.detect{|part| part.content_type == 'text/html; charset=UTF-8'}
    part.body.raw_source
  end

  describe '#creation_email' do
    let(:mail){TaskMailer.creation_email(task)}

    it "想定通りのメールが生成されている" do
      expect(mail.subject).to eq('タスク作成完了メール')
      expect(mail.to).to eq(['user@example.com'])
      expect(mail.from).to eq(['taskleaf@example.com'])

      expect(text_body).to match('以下のタスクを作成しました')
      expect(text_body).to match('メイラーSpecを書く')
      expect(text_body).to match('送信したメールの内容を確認します')

      expect(html_body).to match('以下のタスクを作成しました')
      expect(html_body).to match('メイラーSpecを書く')
      expect(html_body).to match('送信したメールの内容を確認します')
    end
  end
end

以下のコマンドを実行し通るか確認します。

bundle exec rspec spec/mailers/task_mailer_spec.rb

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0