🗂

Action Mailer を試す

2022/02/09に公開

Action Mailer (+Sendgrid) を試してみる

Sendgridとは

  • 多機能メール送信代行
  • 最初に(最初じゃなくても)見ておくべき動画はこちらです。
    はじめてのSendGrid

下準備

rails new action_mailer -d mysql -B --skip-test
rails webpacker:install
bundle install
bin/rails generate mailer User
rails generate scaffold user name email login
rails db:create
rails db:migrate
rails s

mail 送信

app / controllers / users_controller.rb

  • user 作成時にメールを送信する
  • 入力された @user 情報を利用して、 UserMail を呼び出すと変数渡しができる
  def create
    @user = User.new(user_params)
    UserMailer.with(user: @user).first.deliver_now
  end

app / mailers / user_mailser.rb

  • 他 Controller から呼び出された時には params として受け取る
  • mail ごとに固定値を定義したい場合にはインスタンス変数として定義する
class UserMailer < ApplicationMailer
  def first
    @user = params[:user]
    @url = 'http://localhost:3000/login'
    mail(to: @user.email, subject:'action_mailer test')
  end
end

app / views / user_mailer / first.html.erb, first.text.erb

でも、いまいち html / text の使い分けの方法がわからん。

  • html として送信する場合
<!DOCTYPE html>
<html>
<head>
  <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
</head>
<body>
<h1> First mail. To <%= @user.name %></h1>
<p>
  login id「 <%= @user.login %> 」
  login url <%= @url %>
</p>
</body>
</html>
  • text として送信する場合
First mail. To <%= @user.name %>
  login id「 <%= @user.login %> 」
  login url <%= @url %>

送信してみる

ユーザ登録 http://127.0.0.1:3000/users/new

  • まぁ、着信しないですね...。(それはそう)
  • 自分の gamil を利用して、見ず知らずのPC(IP)からいきなり from gmail を語られて送信しても通る可能性なんて一ミリもないですよね。

SendGrid で API key を生成する

秘匿情報を登録する

  • 秘匿情報なので enc されるところに。
EDITOR=vi rails credentials:edit
  • 何のKeyかわかりやすい感じで
SENDGRID_API_KEY: SG.先ほど発行した SendGrid の API key
  • 実際には発行されたAPI Keyをそのまま登録してます。

rails c 確認

[1] pry(main)> Rails.application.credentials.dig(:SENDGRID_API_KEY)
=> "SG.先ほど発行した SendGrid の API key"
[2] pry(main)> 

config ( environment/development.rb )

  ActionMailer::Base.smtp_settings = {
    :user_name => 'apikey',
    :password => Rails.application.credentials.dig(:SENDGRID_API_KEY),
    :domain => 'gmail.com',
    :address => 'smtp.sendgrid.net',
    :port => 587,
    :authentication => :plain,
    :enable_starttls_auto => true
  }

改めて新規ユーザ登録...! http://127.0.0.1:3000/users/new

  • 色々と酷い言われようですが、届きはしましたよ...!
    • けどテストとはいえバンバン投げてたら蹴られそう。

所感

  • 便利なんだけど不安(もっと複雑だと思ってた思いから)
  • セーフティ機能周りを深掘りしたい(Sidekiq含め、運用部分をもっと)
  • SendGrid のAPI送信でも Template 管理ができるらしいので試したい
    なので、まぁ... 他も覚えたら改めて深掘りしたいですね...!

商用利用

  • 警告でたり届かなかったりするので、 spf, DKIM, DMARC をちゃんと設定しようね。
    • SendGrid を使うなら Sender 設定もね
  • job を永続化する仕組みが必要よう。 (Sidekiq 周りを調べた後に改めて追記予定)
    • 全部 SendGrid 経由するなら別に?だそうだけど、どちらかというと非同期にメール送信処理をしたい場合には Sidekiq を使うそうな
  • Bounce 時の処理についても確認する
    • 配信停止かなぁ、フラグもっといたほうが良さそうだけど、他に影響ないから後からAddColumnでもいいんかな。
    • SendGrid さんならよろしく bounce 先には再度送信しないようにしてくれる(強制?)
    • 都度確認する手間があるので、SendgridからSlackに通知とかほしい
  • 開封率とか取ってたりするけど、どうやるんだろうな。
    • SendGrid で確認できるけども...けども?
    • そもそもそこまで興味なかった()

参考

Discussion