※この記事は何回かに分けて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のインストール
公式はこちら
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シリーズ完結までの道は長くなりそうです。