RailsとSendGridでメール送信処理を実装する
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
を以下のように内容を変更します。
class 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
内で定義したアクション名と同じにして対応付けます。
<!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>
以下はテキスト表示用です。
Welcome <%= @user.name %>
ご登録ありがとうございます。
send_signup_email
が実行されると上記のテンプレートファイルのメールが送信されます。HTML用とテキスト用の表示分けについてはメールを受信するメーラーによって自動でわけられます。
なお、HTML用のメールの見た目を確認したい場合は、冒頭でのジェネレータによって作成されたtest/mailers/previews/user_notifier_mailer_preview.rb
の中身にプレビュー用のURLがあるのでこれにブラウザからアクセスして確認できます。具体的には、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
)にメール送信処理を追記します。
class 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
というファイルを新しく作成して保存します。
ActionMailer::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もアカウントを作成すれば特別な設定必要なく使用できるのでとても便利です。
関連記事
- 公開日:2016/01/10 更新日:2016/01/10
Railsでwickedpdfを使ってPDF出力する
Ruby on RailsでPDF出力させるのに便利なgemはたくさんありますが、htmlをそのままPDF化してくれる「wickedpdf」が一番お手軽で楽でした。wickedpdfの導入手順と使用方法をメモします。
- 公開日:2015/07/06 更新日:2015/07/06
Ruby on Railsでパンくずリストを表示するGem gretelの使い方メモ
Ruby on Railsで作成したWebアプリにパンくずリストを表示したい時に便利なのがgretelというgemです。gretelを使うと、gretelの設定ファイルとviewファイルに記述を追加するだけでパンくずリストを簡単に表示できます。使い方をメモします。
- 公開日:2015/07/03 更新日:2015/07/03
Ruby on Railsで動的に追加・削除可能な入力フォームの実装手順
Railsで作成したWebアプリで動的に入力フォームを追加したり削除したりできるようにしたのでその手順をメモします。ここではテーブルの各セルに入力フォームがあるような場合に、新しい入力フォームとなる行を動的に追加したり、削除したりできるようにしています。また、親モデルと子モデルにはhas_may関係があります。
- 公開日:2015/04/06 更新日:2015/04/06
Railsで並べ替え可能なテーブルの実装手順
Railsで作成したWebアプリにて、テーブルの中身を各カラムによって並べ替え可能にするために必要な手順をメモしておきます。テーブルの各カラム名をクリックすることで、並べ替えできるようになります。