1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails初学者】Railsでメールが送信できる仕組みをざっくり理解する

1
Posted at

ゴール

この記事では、Railsでなぜ簡単にメール送信できるようになっているのか、その仕組みをざっくり理解することを目指します⭐️
Action Mailerの基本的な概念と、メール送信の流れを理解し、全体像を把握することを目標とします🙋

action-mailer.png

Action Mailerとは?

Action Mailerは、Railsフレームワークの一部であり、アプリケーションからメールを送信するための仕組みを提供します!
Action Mailerは「メーラー(mailer)」と呼ばれるクラスを使用して、メールの内容や送信先などを定義し、メールのテンプレートを使用してメールの本文を生成します✉️

特徴

  • メーラークラスはActionMailer::Baseを継承し、メソッド(メーラーアクション)を定義する(コントローラーに似た構造
  • ERBテンプレートを使用してメールの本文を生成できる
  • HTMLメールとテキストメールの両方をサポート
  • 開発環境でメールの見た目を確認できる(プレビュー機能)

Action Mailerの基本構造

app/
├── mailers/
│   ├── application_mailer.rb      # 基底メーラークラス
│   └── user_mailer.rb              # ユーザー関連のメーラー
│
└── views/
    ├── layouts/
    │   └── mailer.html.erb         # メールレイアウト(HTML版)
    │   └── mailer.text.erb         # メールレイアウト(テキスト版)
    │
    └── user_mailer/
        ├── welcome_reply.html.erb  # HTMLメール本文
        └── welcome_reply.text.erb  # テキストメール本文

test/
└── mailers/
    ├── previews/
    │   └── user_mailer_preview.rb  # プレビュー用
    └── user_mailer_test.rb         # テスト

メーラーとビューの作成

メーラーを生成する

まず、メーラーを生成します。以下のコマンドを実行して、UserMailerというメーラーを作成します。

$ rails generate mailer User

生成されるファイル

ファイルパス 説明
app/mailers/user_mailer.rb メーラークラス
app/views/user_mailer/ メールテンプレートディレクト
test/mailers/user_mailer_test.rb メーラーテスト
test/mailers/previews/user_mailer_preview.rb メーラープレビュー

user_mailer.rbを確認すると、以下の通りApplicationMailerを継承したクラスが生成されています。

class UserMailer < ApplicationMailer
end

ApplicationMailerは、appication_mailer.rbに定義されており、ActionMailer::Baseを継承しています。
このクラスで、メールのデフォルト設定(送信元アドレスやレイアウトなど)を定義できます。

class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end

ActionMailer::Baseとは?

  • Railsのメール送信機能を提供する基底クラス。すべてのメーラークラスはこのクラスを継承することで、メール送信に必要な機能を利用できるようになる。

ActionMailer::Baseが提供する主な機能

  • メール送信メソッド
    • mail() - メールを作成
    • deliver_now - 即座に送信
    • deliver_later - バックグラウンドジョブで送信
  • 設定メソッド
    • default - デフォルト値の設定
    • attachments - 添付ファイル
    • headers - カスタムヘッダー
  • テンプレート機能
    • ビューテンプレートの自動読み込み
    • レイアウトの適用
  • コントローラーに似た機能
    • インスタンス変数をビューで使用可能
    • フィルター(before_action など)

メーラーを編集する

メーラークラスにメール送信のロジックを追加します!
以下は、ユーザー登録完了時に送信するウェルカムメールの例です。

# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def welcome_reply(user)
    @user = user
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: 'エンジニア学習サイトへようこそ!')
  end
end
  • welcome_replyメソッドは、メール送信のためのアクションを定義
  • mailメソッドで送信先や件名を指定
  • インスタンス変数(@user@url)は、ビューで使用可能
  • テキスト版が必要な場合は、同様にwelcome_reply.text.erbテンプレートを作成

メーラービューを作成する

メールの本文を定義するために、対応するビューを作成します!(コントローラーのアクションに対応するビューを作成するのと似ていますね🙆)

作成場所ですが、app/views/user_mailer/ディレクトリ内に、以下のようにHTML版とテキスト版のテンプレートを作成します。

<!-- app/views/user_mailer/welcome_reply.html.erbの場合 -->
<h1><%= @user.name %>様、ようこそ!</h1>
<p>アカウントの登録が完了しました。</p>
<p>以下のURLからログインできます。</p>
<p><a href="<%= @url %>"><%= @url %></a></p

<header>タグや<body>タグがないですが、なぜですか?

  • メールテンプレートは、ApplicationMailerで指定したレイアウト(views/layouts/mailer.html.erb)に自動的に組み込まれます。
  • そのため、個々のテンプレートにはHTMLの基本構造を含める必要はありません。

メールの送信

メーラーとビューが準備できたら、実際にメールを送信してみましょう!
メール送信は、コントローラーやモデルなど、アプリケーションの任意の場所から行うことができます。

# コントローラーの場合
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      # ユーザー登録成功時にウェルカムメールを送信
      UserMailer.welcome_reply(@user).deliver_now
      redirect_to @user, notice: 'ユーザーが作成されました。'
    else
      render :new
    end
  end
end
  • UserMailer.welcome_reply(@user).deliver_nowでメールを即座に送信
  • deliver_nowで同期的にメールを送信する
  • 非同期に送信したい場合は、deliver_laterを使用することも可能

まとめ

Railsメール送信の仕組み

終わりに

簡単ですが、RailsのAction Mailerを使ったメール送信の仕組みについてまとめてみました!
もう少し詳細な設定やカスタマイズもRailsガイドに記載されていたので、必要に応じて確認したいと思います!

参考記事

1
1
0

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?