RailsのMailerについて勉強してみた

#経緯
最近，webサービスを開発しました．
今回は，ログインの部分でメールを使う必要があったのでMailerの勉強をしようと思った次第です．
基本的には，Railsガイドを読み進めてまとめているだけです．

始めて半年も経っていないので至らない点があると思います．その時はコメントでご指摘して頂ければ幸いです．

(注:文章作成が下手なので読み難いときはアドバイスをくださると助かります．)

#1.はじめに
Action Mailerは，コントロールと似た動作でメール送信ができるものです．
Rails内ではアプリケーションのメイラークラスやビューで送信を構成できます．

#2.メールの送信をする
###2.1.メイラーを作成する
ここでは，実際にメイラーとビューの作成を行なっているので順を追ってやっていきます．

```terminal:terminal
bin/rails generate mailer UserMailer

   identical  app/mailers/user_mailer.rb
      invoke  erb
       exist    app/views/user_mailer
      invoke  test_unit
   identical    test/mailers/user_mailer_test.rb
   identical    test/mailers/previews/user_mailer_preview.rb
```
これで，メイラーとビューの作成ができました．`generate`を使いたくない場合は，`app/mailers`ディレクトリ以下に自身でファイルを作成し，`ActionMailer::Base`を継承すればできます．

```ruby:my_mailer.rb
class MyMailer < ActionMailer::Base
end
```

###2.2.メイラーを編集する
前述したように，メイラーはコントローラによく似ているのでアクションとメールの設定をするためのビューがあります．<br>
先程の`generate`により，`app/mailers/user_mailer.rb`に空のメイラーがあります．

```ruby:user_mailer.rb
class UserMailer < ApplicationMailer
end
```

ここをいじればユーザーが登録したメールアドレスにメールを送信することができます．それでは，実際にいじくってみます．

```ruby:user_mailer.rb
class UserMailer < ApplicationMailer
    defalut from: '自分のメールアドレス'
    def Regist_email
        @user = params[:user]
        @url = '自身のサイトのURL'
        mail(to: @user.email,subject:'サイトに登録していただきありがとうございます．')
    end
end
```
中身を上から説明していきます．
`defalut:` 全てのメイラーからメールを送信するときに使うアドレスを設定するものです． `:form`は送信元のメールアドレスを設定しています．因みに，この値は上書きもできます．<br>
@&#xFFF0;user,と@&#xFFF0;urlは，インスタンス変数なので自身の開発にあったものを書いてください．<br>
`mail:` 実際のメールの内容を入れる場所です．`subject`は，本文を入れることができます．詳しいことは，<a href="http://localhost">Rails6.0.0の公式ライブラリ</a>から確認してみてください．

###2.3 メイラービューを作成する
`app/views/user_mailer/`内にhtml.erbファイルを作成します．このHTMLを，メールテンプレートにします．

```html:welcome_eamil.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name %>様、example.comへようこそ。</h1>
    <p>
      example.comへのサインアップが成功しました。
      your username is: <%= @user.login %>.<br>
    </p>
    <p>
      このサイトにログインするには、<%= @url %>をクリックしてください。
    </p>
    <p>ご入会ありがとうございます。どうぞお楽しみくださいませ。</p>
  </body>
</html>
```

ユーザーによっては，HTMLフォーマットを受け取りたくない場合もあるそうなので，テキストメールも作っておきます．こちらは，同じディレクト内にtext.erbファイルを作成します．

```text:welcome_eamil.text.erb
<%= @user.name %>様、example.comへようこそ。
===============================================

example.comへのサインアップが成功しました。ユーザー名は「<%= @user.login %>」です。 

このサイトにログインするには、<%= @url %>をクリックしてください。 

本サイトにユーザー登録いただきありがとうございます。 
```

今のAction Mailerだとmultipart/alternative形式(html，testどちらでも表示する形式)でメールを自動生成します．

###2.4 メイラーを呼び出す
Action MailerはActive Job(バックグエンドでメール配信を行うフレームワーク)とうまく統合されているようなので，Webのリクエスト/レスポンスサイクルの外で非同期にメールを送信できます．

```ruby:users_controller.rb
class UsersController < ApplicationController
   UserMailer.with(user: @user).welcome_email.deliver_later
end
```
ここでの`with`とdeliver_laterは，インスタンスメソッドでありこれも<a href="http://localhost">Rails6.0.0の公式ライブラリ</a>に記載されています．
それでは，それぞれの説明をします．
`with:` インスタンスメソッドとコールバックで使用するためにパラメータを提供するもの．

`deliver_later:` Active jobを通して，電子メールをキューに入れるもの．使用時は，メソッドの`deliver_now`を使ってメール送信が行われる．

これでUserMailerを呼び出し，`welcome_email.html.erb`や，`welcome_email.test.erb`を送信することができます．

#終わりに
今回は，Mailerの基本的な部分をみてきました．メールを用いたログインの機能になるともう少し知識が必要な気もしますが…
まあ，その部分は実際に開発をしてみてから投稿したいと思います．
最後まで読んでいただきありがとうございました．

#引用
Railsガイド　Action Mailerの基礎
https://railsguides.jp/action_mailer_basics.html#%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B
Ruby on Rails6.0.0の公式ライブラリ
https://api.rubyonrails.org/