20
12

More than 5 years have passed since last update.

Action Mailer

Last updated at Posted at 2019-04-28

これまでの経緯

  • RailsでWebアプリケーションを作ろう(マスタ画面)
    • Modalウィンドウでajaxのマスタ画面の実装 - OK
  • 会員登録機能の作成
    • メールによるユーザの認証(仮登録機能) - ここ
    • メールに記載のURLで本登録(本登録機能)
    • 本登録後、ログイン(ユーザ認証機能)

Action Mailer

まずは、メール送信について
RailsにはAction Mailerという機能があり、それでメールを送信することができます。

生成

Mailerクラスを生成します。

terminal
$ rails g mailer UserMailer
create  app/mailers/user_mailer.rb
create  app/mailers/application_mailer.rb
create  app/views/user_mailer
$ rails g mailer [Mailer名]

で作成します。
基底クラスのapplication_mailer.rbを継承している[Mailer名].rb
と本文を記載するviews/[Mailer名]以下には、メール本文を定義します。

user_mailer.rb
class UserMailer < ApplicationMailer
    default from: 'hogehoge@gmail.com'

    def test_email
        @user = params[:user]
        mail(to: 'fugafuga@gmail.com', subject: 'これはRails Application Mailerのテストです。')        
    end
end

このtest_mailメソッドでviews/user_mailer/test_email.html.erbもしくは、test_email.text.erbを本文としてメールを送信します。

test_email.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name %>さん、こんにちは!</h1>
    <p>これはAction Mailerのテストメールです。</p>
  </body>
</html>

test_email.text.erb
<%= @user.name %>さん、こんにちは!
これはAction Mailerのテストメールです。

メール送信します。上記のMailerのtest_emailを

メール送信
UserMailer.with(user: @user).test_email.deliver_now

送信について

with()によって、paramsとしてMailerActionに渡すことができます。
with(user: @user)とすることで、param[:user]で参照することが可能となるわけです。

deliver_nowdeliver_laterの2種類のメール送信メソッドがあります。
deliver_nowは、今すぐに送信したい場合に使用します。
deliver_laterは、非同期で送信したい場合に使用します。

html.erbとtext.erb

メールのヘッダー情報はデフォルトでmultipart/alternativeとなり、これに基づいて、HTMLメールとテキストメールが送信され、受信側の設定により、HTMLメールとテキストメールがよしなに展開されます。
しかし、当然「HTML」+「テキスト」が同時に送信されるため、コンテンツによっては、サイズが肥大化することもあり、「テキストだけ送りたい」「HTMLだけ送りたい」という場合が出てくると思います。
それを制御するにはmailメソッドを以下のように記述します。

HTMLメールとテキストメール指定し送信する方法
mail(to: 'hogehoge@gmail.com', subject: 'これはテストです。') do |format|
    format.text #テキストメールを指定
    format.html #HTMLメールを指定
end

メールの設定 ~GMail編~

以上でメール送信はできるわけですが、メールサーバの情報がないとメールは送信できません。
(他の方も書いていらっしゃいますが)GMailのアカウントを使って、メールを送信してみます。
予め、アカウントは作成されている前提でconfig/environments以下の設定ファイルに設定します。
例では、developmentの設定ファイルに記載します。

config/environments/development.rb
Rails.application.configure do
...()...
  ## メールの配信方法
  ## :smtp     -- config.action_mailer.smtp_settingsで設定可能
  ## :sendmail -- config.action_mailer.sendmail_settingsで設定可能
  ## :file:    -- メールをファイルとして保存する。config.action_mailer.file_settingsで設定可能
  ## :test:    -- メールを配列ActionMailer::Base.deliveriesに保存
  config.action_mailer.delivery_method = :smtp

  ## メール送信失敗時エラーとするかどうか
  config.action_mailer.raise_delivery_errors = true

  ## SMTPの設定
  config.action_mailer.smtp_settings = {
    ## SMTPサーバでSTARTTLSが有効かどうかを検出して有効にする
    :enable_starttls_auto => true,

    ## リモートメールサーバ
    :address => 'smtp.gmail.com',

    ## メールサーバのポート
    :port => '587',

    ## HELOドメイン
    :domain => 'smtp.gmail.com',

    ## メールサーバの認証が必要な場合の認証方法
    ## :plain    -- パスワードを平文で送信
    ## :login    -- パスワードをBase64でエンコード
    ## :cram_md5 -- チャレンジ/レスポンスによる情報交換と、MD5アルゴリズムによる重要情報のハッシュ化の組み合わせ
    :authentication => 'plain',

    ## メールサーバの認証に使用するユーザ名
    :user_name => '<GMailのユーザ名>',

    ## メールサーバの認証に使用するパスワード
    :password => '<GMailのパスワード>'
  }
end

最後にGoogleアカウントの設定を変更します。
※アカウントを脆弱にさせてしまうので、気をつけて設定してください。

Googleにログイン後、アカウント設定を開きます。

スクリーンショット 2019-04-29 0.11.54.png

アカウントのメニューの「セキュリティ」を選択します。

スクリーンショット 2019-04-29 0.15.13.png

「セキュリティ」メニューの下の方の「安全性の低いアプリのアクセス」の「アクセスを有効にする(非推奨)」を選択します。

スクリーンショット 2019-04-29 0.17.09.png

「安全性の低いアプリのアクセス」の「安全性の低いアプリの許可:有効」にします。

スクリーンショット 2019-04-29 0.19.09.png

最後に

これで、Railsでメールを送信することができました。
Action Mailerは直感的でわかりやすいなぁという印象です。
ほぼほぼ、Railsガイドを舐めれば、基本的なことはできそうです。

出典

Action Mailer の基礎 - Rails ガイド

20
12
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
20
12