25
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsでメール送信機能を実装する

Last updated at Posted at 2021-03-13

これは何?

Railsの課題を実施しています。メール送信機能を作りましょうとの課題がありました。作りながら調べたことを勉強も兼ねてまとめています。

なお、実行環境は以下の通りです。

  • Rails 5.2.3
  • Ruby 2.6.0

そして、本記事は課題の内容を参考にしつつもRailsガイドのAction Mailer の基礎から多くを引用して作成しています。

メール送信機能の実装

必要ファイルの生成

それでは、早速メール送信機能を実装していきます。まずは以下のコマンドを打ちます。

$ rails g mailer UserMailer

このコマンドで、以下のファイルとディレクトリが追加されました。

Image from Gyazo

また、Railsにはデフォルトで以下のレイアウトファイルが含まれています。

views      # 関係のないファイルは省略
└── layouts
     ├── mailer.html.slim
     └── mailer.text.slim

それぞれのファイルには、レイアウトに必要な設定が全て書かれています。メール本文に当たる部分は、先程生成したapp/views/user_mailerディレクトリ内に作成していきます。(下記は、デフォルトで生成されているレイアウトファイルのサンプル)

app/views/layouts/mailer.html.slim
doctype html
html
  head
    meta[http-equiv="Content-Type" content="text/html; charset=utf-8"]
    style
      |  /* Email styles need to be inline */
  body
    main
      = yield

mailerの書き方(メール送信メソッドの実装)

mailerの書き方は、controllerに似ています。まず、デフォルトで生成されているApplicationMailerには、以下のように記載されています。

app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end

ここでのdefaultは引数にハッシュを取り、全てのメーラーに共通の設定を記載できるそう。from:以外にもto:, reply_to:などの設定がRailsガイドでは扱われていました。

先程生成したUserMailerには、ApplicationMailerを継承した、さまざまなメソッドを記載します。

class UserMailer < ApplicationMailer
  def welcome_email
    @user = params[:user]
    mail(to: @user.email, subject: 'メールのタイトルがここに入ります')
  end
end

mailの部分は、実際のメール・メッセージです。

ビューの生成

mailerで定義した変数はビューで使えます。app/views/user_mailerに例えば以下のようなメッセージを作成することができます。

app/views/user_mailer/sample_mail.html.slim
h2= #{@user.name}さん
p= "アプリへようこそ!楽しんでいってくださいね!" 
p= link_to "ログインはこちら", login_url

mailの場合、*_pathのように相対パスになる表示は使えないので、*_urlのような絶対パスでパスを指定します。

送信のトリガー

最後に、送信のトリガーとなるメソッドを実装します。
userを作成した直後に、先のwelcome_mailメソッドが発動するようにした場合、users_controllerに以下のように記載します。

app/controllers/users_controller.rb
class UsersController < ApplicationController
  def create
    @user = params[:user]
    if @user.save
      UserMailer.with(user: @user).welcome_mail.deliver_later
      # その他の処理は略
    end
  end
end

.withの部分でkey: valueを渡すと、その部分はparamsになってUserMailerに渡ります。

deliver_laterの部分で、直前の処理(ここではcreateが完了した場合、その直後にメールを送ることができます。

そのほかにもdeliver_nowなどのメソッドもあるようです。

完成!

以上で、メール送信メソッドを完成することができました!
実際には、先の記事で紹介したletter_opener_webのgemを使っているので、メールを送信するとすぐに擬似的なメーラーが開いて確認できます^^

Railsの機能のおかげで、簡単に実装できるんですね。引き続き、頑張ろうと思います。

25
15
2

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
25
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?