railsのactionmailerでメール通知機能を作る


やりたいこと

  • controllerから呼び出してactionmailerでメール送信

全体像

初期設定

  • application_mailerにてmailアドレスなどの設定
  • (gmail使う場合)gmailの設定

mailerの作成

  • rails generate mailerコマンドでmailer作成
  • viewにテキスト本文作成
  • メソッドを呼び出す

mailerの作成方法

$ bin/rails generate mailer UserMailer
app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "[email protected]"
  layout 'mailer'
end
app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
end

mailerはcontrollerと似ていて上記コマンドでview(メール文面)もテストも生成される。このmailerで使えるオプションは下記に

ちなみにbin/railsコマンドについても調べてみた。

Railsはプロジェクトルートの bin ディレクトリにある rails ファイル(実行可能ファイル)を優先的に起動する仕様になっているからです。

railsコマンドだとbin/を付ける必要がなくてrakeコマンドだとある。

configの設定

configの記述箇所

cofig/environments/○○.rbで書くかconfig/initializers/の2パターンある。

cofig/environments/○○.rbはそのfileの環境にのみ適用したい時、config/initializers/はどの環境でも使いたいときに使用する。

config/environments/development.rb
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  domain: 'gmail.com',
  port: 587,
  user_name: 'Gmail のメールアドレス',
  password: 'Gmail のパスワード',
  authentication: 'plain',
  enable_starttls_auto: true
}

smtpモードでの設定情報

  • address => SMTPサーバーのホスト名
  • port => SMTPサーバーのポート番号
  • domain => 使うgmailアカウントのドメイン。もし無料アカウントから転送で使っていたら無料アカウントのドメイン(gmailなど)。有料だった場合独自ドメイン。
  • user_name => メール送信に使用するgmailのアカウント
  • password => メール送信に使用するgmailのパスワード
  • authentication => 認証方法
  • enable_starttls_auto => メールの送信にTLS認証を使用するか

引用:https://qiita.com/Yama-to/items/823baf26bba3193712ea

パスワードは下記の方法でアプリパスワードを取得しないといけない

メール本文をmailerviewで作成

app/views/user_mailer/ディレクトリでmailerでセットされたインスタンス変数名.html.erbというファイルを作成するとメール本文を編集できる。.text.erbで作るとテキストメールになる。

gmailの設定

gmailから送信する場合以下の作業をしないといけない

  • 2段階認証を有効にする
  • アプリパスワードの設定
    • 端末は適当で良し
  • 転送の設定をしている場合、設定のアカウントをちゃんと変更しておく

controllerの記述

app/controllers/post_controller.rb
NotificationMailer.send_oubo_notification("なんか引数あったらここに").deliver_later

細かい注意点