箱のプログラミング日記。

えんじにあ奮闘記

RailsでSendGridのAPIを使用する(3)【sendgrid-ruby】

f:id:y_hakoiri:20191102134313j:plain

※この記事は何回かに分けてRailsでセンドグリッドAPIを使用する方法をまとめたものです。

アカウント発行〜有料プラン契約までの導入編はこちら

RailsでSendGridのAPIを使用する(1)〜導入〜 - 箱のプログラミング日記。

APIキーの発行やDNSへのレコード登録など準備編はこちら

RailsでSendGridのAPIを使用する(2)〜準備〜 - 箱のプログラミング日記。

今回は実装編ということでgemのインストール〜APIでメール送信までを実現していきます。

ライブラリに関して

前回の記事までで、SendGridを使用してメールを送信する際はSMTPによる方法APIによる方法があることは説明しました。

私の場合はAPIを使用して実現する方法で解説してきているのですが、その中でも自分でイチから組み立てていく方法と、各言語ごとに用意されているライブラリを使用して簡単にAPIによるメール送信を実現する方法に分かれます。

図を用意するのがめんどくさいのでちょっと見辛いですが以下の通りMarkdownで表現。

  • SMTPにより実現
  • APIにより実現
    • 自力で組み立てる
    • 各言語ごとのライブラリ
      • C#
      • Go
      • Java
      • NodeJS
      • PHP
      • Python
      • Ruby

(この構造を理解するまでに数時間かかりました。笑)

Rubyのライブラリというともちろんgemのことで、gemを使用するとわざわざイチから書かなくてもオブジェクト単位でメールの送信ができて楽なので今回はgemを使っていきます。

ちなみにAPIにもバージョンがいくつかあるのですが、各ライブラリがサポートしているのは最新のv3のみで、それ以前のバージョンは対応していないようなのでご注意。

gemのインストール

公式はこちら

github.com

gem install sendgrid-ruby

Gemfile.lock

sendgrid-ruby (6.1.1)
      ruby_http_client (~> 3.4.0)

依存関係にあるRuby-HTTP-Clientも一緒にインストールされる模様。

サンプルコード

あとはサンプルコードをコピペして実行するだけ。簡単、、

class MailMagazine < ActiveRecord::Base
  require 'sendgrid-ruby'
  include SendGrid

  def self.deliver_mail_magazine
    from = SendGrid::Email.new(email: '送信元アドレス')
    to = SendGrid::Email.new(email: '送信先アドレス')
    subject = '件名'
    content = SendGrid::Content.new(type: 'text/plain', value: 'テスト配信です')
    mail = SendGrid::Mail.new(from, subject, to, content)

    sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
    response = sg.client.mail._('send').post(request_body: mail.to_json)
  end
end

(ちなみにクラスメソッドなのでselfを忘れずに)

ヘッダーにAPIキーを含めないと認証エラーが返ってくるので忘れずに。

環境変数はDotenv使って.envに書いておくのが良さそう。

Dotenv公式は以下↓

https://github.com/bkeepers/dotenv

準備が整ったらコンソールで実行してみる

[1] pry(main)> MailMagazine.deliver_mail_magazine

レスポンスはこちら

=> #<SendGrid::Response:0x00007fe49dd7bcf0
 @body="",
 @headers=
  {"server"=>["nginx"],
   "date"=>["Sat, 21 Mar 2020 13:56:09 GMT"],
   "content-length"=>["0"],
   "connection"=>["close"],
   "x-message-id"=>["wiDzZfcvS_6Myi-4xQd0kw"],
   "access-control-allow-origin"=>["https://sendgrid.api-docs.io"],
   "access-control-allow-methods"=>["POST"],
   "access-control-allow-headers"=>["Authorization, Content-Type, On-behalf-of, x-sg-elas-acl"],
   "access-control-max-age"=>["600"],
   "x-no-cors-reason"=>["https://sendgrid.com/docs/Classroom/Basics/API/cors.html"]},
 @status_code="202">

ステータスコード202が返ってきているのでリクエストに成功していることがわかる。

キャプチャないけどちゃんと指定したアドレス宛に届いてました。

ちなみに↑はREADMEのサンプルコードをそのまま貼ったのだけど、送信元にnameを指定することもできる。

from = SendGrid::Email.new(email: '送信元アドレス', name: '運営チーム')

こうすると送信元アドレスのほかにこちらが誰なのかを明確に明記することができて良い感じ。

ちなみにnameのほかにも指定できるパラメータ一覧は以下を参照。(死ぬほどある)

v3 Mail Send API概要 - ドキュメント | SendGrid

次回予告

今回は短めでしたが、これで一応APIを使用してメールを送信することはできました。

ただ実運用で使うにはもっと便利な機能がセンドグリッドにはたくさんあって、そちらをきちんと使ってこそやはりAPIの醍醐味なような気がする、、

ということで、次回はセンドグリッド側で登録することができるテンプレートについてまとめたい。。

SendGridシリーズ完結までの道は長くなりそうです。