Photo by Web Hosting on Unsplash
はじめに
Ruby on RailsからAction Mailerを使用してSendGrid経由でメールを送信する処理を実装したのでその手順をまとめます。
前提と環境
以下の通りです。
- Ruby on Rails : 5.2.2
- Send Gridアカウントは作成済とする
- Rails側で
email
、name
をカラムとして持つUser
モデルを作成済とする
基本的な手順は以下のSend Gridの公式ドキュメントに従って行いました。公式ドキュメントには、Ruby on Rails以外にもCake PHP、Djangoなどのフレームワークについての手順も記載されています。
以下の例ではユーザのサインアップのためにメールを利用する方法を示します。より高度な機能を実現するためにこちらのgem を利用することも可能です。
Action Mailerを設定する
メール送信処理実装に必要なファイルを作成してくれるAction Mailerのジェネレータを実行します。
$ bundle exec rails generate mailer UserNotifier
上記を実行すると以下のように表示されいくつかのファイルとディレクトリが作成されることを確認できます。
$ bundle exec rails generate mailer UserNotifier
create app/mailers/user_notifier_mailer.rb
invoke erb
create app/views/user_notifier_mailer
invoke test_unit
create test/mailers/user_notifier_mailer_test.rb
create test/mailers/previews/user_notifier_mailer_preview.rb
作成されたファイルを以降で修正していきます。
メール送信を実行する処理を書く
ジェネレータによって作成されたapp/mailers/user_notifier_mailer.rb
を以下のように内容を変更します。
app/mailers/user_notifier_mailer.rbclass UserNotifierMailer < ApplicationMailer
default :from => 'notify@yourdomain' # 送信元アドレスの指定
# サインアップ時(ユーザ新規登録時)にメール送信するためのアクション
def send_signup_email(user)
@user = user
mail( :to => @user.email, # 送信先アドレスの指定
:subject => 'ご登録ありがとうございます!' # 送信メールの件名
)
end
end
上記は、例としてRailsによって構築されているアプリがユーザーサインインが必要なものとし、サインアップした時にその旨を通知するためのアクションをsend_signup_email
という名前で定義しています。
このsend_signup_email
を以降でユーザのコントローラ内でサインインした時の処理に追加します。
メールのテンプレートファイルを作成する
続いてユーザに送信するメールのテンプレートファイルをHTML表示用とテキスト用の2種類作成します。
ディレクトリapp/views/user_notifier_mailer
が作成されているので、その中にsend_signup_email.html.erb
というファイルをHTML用に、send_signup_email.text.erb
をテキスト用にそれぞれ作成します。ここで作成するテンプレートファイル名はapp/mailers/user_notifier_mailer.rb
内で定義したアクション名と同じにして対応付けます。
app/views/user_notifier_mailer/send_signup_email.html.erb<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Welcome <%= @user.name %></h1>
<p>ご登録ありがとうございます。</p>
</body>
</html>
以下はテキスト表示用です。
app/views/user_notifier_mailer/send_signup_email.text.erbWelcome <%= @user.name %>
ご登録ありがとうございます。
send_signup_email
が実行されると上記のテンプレートファイルのメールが送信されます。HTML用とテキスト用の表示分けについてはメールを受信するメーラーによって自動でわけられます。
なお、HTML用のメールの見た目を確認したい場合は、冒頭でのジェネレータによって作成されたtest/mailers/previews/user_notifier_mailer_preview.rb
の中身にプレビュー用のURLがあるのでこれにブラウザからアクセスして確認できます。具体的には、test/mailers/previews/user_notifier_mailer_preview.rb
は以下のようになっており、
test/mailers/previews/user_notifier_mailer_preview.rb# Preview all emails at http://localhost:3000/rails/mailers/user_notifier_mailer
class UserNotifierMailerPreview < ActionMailer::Preview
end
Railsサーバが起動している状態でhttp://localhost:3000/rails/mailers/user_notifier_mailer
にブラウザからアクセスするとプレビュー表示を確認できます。
テストにRSpecを使用している場合は、spec/mailers/previews/user_notifier_mailer_preview.rb
となっていると思いますので各自読み替えてください。
コントローラにメール送信用のアクションを追記する
冒頭に記載したように、ここではemail
、name
をフィールド?としてもつUser
モデルを前提としています。そしてUser
モデルに対応するコントローラは、Railsのお作法に従うとapp/controllers/users_controller.rb
となります。app/controllers/users_controller.rb
の中のサインアップ時の処理(create
)にメール送信処理を追記します。
app/controllers/users_controller.rbclass UsersController < ApplicationController
# (...省略...)
def create
@user = User.new(user_params)
if @user.save
# メール送信処理
UserNotifierMailer.send_signup_email(@user).deliver
redirect_to(@user, :notice => '新規登録が完了しました。')
else
render :action => 'new'
end
end
# (...省略...)
end
最後に、Send Grid経由でメール送信を行うための設定を記述します。
Send Grid経由でメール送信するための設定を記述する
以下の内容をconfig/initializers/mailer.rb
というファイルを新しく作成して保存します。
config/initializers/mailer.rbActionMailer::Base.smtp_settings = {
:user_name => 'your_username@kke.com', # Send Gridから送られてきているユーザ名
:password => 'your_password', # ユーザ名に対応するパスワード
:domain => 'yourdomain.com', # Send Grid登録時に設定した各自のドメイン名
:address => 'smtp.sendgrid.net',
:port => 587,
:authentication => :plain,
:enable_starttls_auto => true
}
なお、上記の内容をconfig/environment.rb
などに追記してもOKです。各自わかりやすいところに記述してください。
まとめ
Action Mailerを使うことでとても簡単にメール送信処理を実装できます。Send Gridもアカウントを作成すれば特別な設定必要なく使用できるのでとても便利です。
SPONSORED LINK