Ruby on Rails

以下の例ではユーザのサインアップのためにメールを利用する方法を示します。より高度な機能を実現するためにこちらのgem を利用することも可能です。

ActionMailerのセットアップ

mailerクラスを生成します。mailerクラスはメールViewのコントローラとして機能します。

1
$ rails generate mailer UserNotifierMailer

先ほど作成したmailerの app/mailers/user_notifier_mailer.rb を開き、サインアップ用メールを送信する以下のmailerアクションを追加します。

1
2
3
4
5
6
7
8
9
10
class UserNotifierMailer < ApplicationMailer::Base
  default :from => 'any_from_address@example.com'

  # send a signup email to the user, pass in the user object that   contains the user's email address
  def send_signup_email(user)
    @user = user
    mail( :to => @user.email,
    :subject => 'Thanks for signing up for our amazing app' )
  end
end

次にアクションとHTML出力に対応したViewが必要です。 app/views/User_notifier_mailer/send_signup_email.html.erb ファイルを以下の内容で作成します:

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Thanks for signing up, <%= @user.name %>!</h1>
    <p>Thanks for joining and have a great day! Now sign in and do
awesome things!</p>
  </body>
</html>

userモデルがまだ無い場合、以下のように生成することができます:

1
2
$ rails generate scaffold user name email login
$ rake db:migrate

userモデルのコントローラは app/controllers/users_controller.rb となります。 userが作成されたときにUserNotifierMailer.send_signup_emailをコールするよう追記します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class UsersController < ApplicationController
  def create
    # Create the user from params
    @user = User.new(user_params[:user])
    if @user.save
      # Deliver the signup email
      UserNotifierMailer.send_signup_email(@user).deliver
      redirect_to(@user, :notice => 'User created')
    else
      render :action => 'new'
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :login)
  end
end

これで完了です。次はSendGridを通じて送信されるように設定を行います。

SendGridを使用するためのActionMailerの設定

config/environment.rb でActionMailerがSendGridサーバを指し示すよう以下のように設定します。

1
2
3
4
5
6
7
8
9
ActionMailer::Base.smtp_settings = {
  :user_name => 'apikey', # This is the string literal 'apikey', NOT the ID of your API key
  :password => '<SENDGRID_API_KEY>', # This is the secret sendgrid API key which was issued during API key creation
  :domain => 'yourdomain.com',
  :address => 'smtp.sendgrid.net',
  :port => 587,
  :authentication => :plain,
  :enable_starttls_auto => true
}

以上です。新しいuserが作成されるとSendGridを通じてメールが送信されます。

認証情報をソースコードに直接埋め込むべきではありません。代わりに設定ファイルや環境変数に保存することを推奨します。チュートリアルRails Environment Variablesを参照してください。Rails Versions 5.2+の場合はSecurely storing custom credentials in Railsを参照してください。