Open20

SendGridの利用手順2021年3月

ダン@HyperFormダン@HyperForm

ここ最近でSendGridの仕様がもろもろ変わってるっぽい。現時点での使い方をまとめておく。

ダン@HyperFormダン@HyperForm

まず日本の代理店(構造計画研究所)を通して契約すると、いろいろ制約ができる。確かサービス提供者のドメインのメールアドレスから申し込まないといけなくて、受託開発とかだと面倒だった記憶。

本家(sendgrid.com)から直接契約した方が良さげ。

ダン@HyperFormダン@HyperForm

sender identity(差出人情報)の登録から進める。

「Create a single sender」「Authenticate a domain」の2つの方法があるけど、前者が推奨とのこと。

ダン@HyperFormダン@HyperForm

  • From Name
    • 受信者に表示される差出人名
  • From Email Address
    • メール送信者のメールアドレスとして表示される
    • このアドレスの持ち主かチェックするため、登録後このアドレスに確認メールが届く
      • リンク踏めばログインしなくてもverifyできる
  • Reply to
    • 受信者が返信する時の宛先にセットされるアドレス
  • Nickname
    • 差出人情報を一意に識別するための名前
    • この名前がメール受信者に表示されることはない

このページを再度表示したい時は
Marketing Campaigns > Senders
からアクセスできる。

https://sendgrid.kke.co.jp/docs/Tutorials/B_Marketing_Mail/marketing_campaigns1.html

ダン@HyperFormダン@HyperForm

APIを使う方法だと、ActionMailerを使って送信できない?
SMTPだといけそうだけど。

ダン@HyperFormダン@HyperForm

sendgrid-actionmailerってgemがある。

https://github.com/eddiezane/sendgrid-actionmailer

An ActionMailer adapter to send email using SendGrid's HTTPS Web API (instead of SMTP). Compatible with Rails 5 and Sendgrid API v3.

SMTPじゃなくてWeb APIを使って、ActionMailer経由でメールを送信できるようにするよ

って書いてある。ってことはやっぱデフォルトだとAPI使う場合はActionMailer使えないんだ。
自分で頑張ってコード書けば送れるだろうけど。

ちなみにこのgemは2021年3月時点で、Rails5までしか対応してないっぽい。

ダン@HyperFormダン@HyperForm

https://sendgrid.kke.co.jp/blog/?p=5009

SMTP接続では余分な「おしゃべり」が必要になるので、もし可能であればWeb APIのご利用をお勧めいたします。具体的な理由は以下のとおりです。

・SMTPリレーでは複数の潜在的な障害点ができてしまい、送信者とSendGrid間で異常コードが発生し得る場所が増えてしまいます。
・Web APIの方が高速です。SMTPの余分なやり取りのせいで、インバウンドデータセンターから遠い場所からリクエストする場合は(ごく僅かではありますが)遅延が生じる可能性があります。
・SMTPリレーと同様にWeb APIでもAPIキーを利用することができるので、あなたのプログラムにもう一段高いセキュリティ設定を付加することがきます。APIキーを使うとユーザ名とパスワードのセットとは独立した認証情報を生成でき、あなたのアカウントが乗っ取られて迷惑メールやフィッシングメールを送信されてしまう可能性が極めて低くなります。

とは言うものの、SMTPはメールの業界標準ですし、全世界で用いられています。Web APIはSendGridの創業者がSendGridのシステムに効率よくアクセスするために作ったもので、すべてのユーザに適した方法とは言えないかもしれません。SMTPリレーはまた、既存のCRMシステムやOutlookのようなメールクライアントから利用できます。Web APIは、多くの場合、自身のプロダクトを開発する開発者に利用されています。

ダン@HyperFormダン@HyperForm

「Integrate using our Web API or SMTP Relay」>「Web API」>「Ruby」を選択

APIキーを作成

.env
SENDGRID_WEB_API_KEY="SG.V7t_Z8LmThogehogehoeerrt4rr"
Gemfile
gem 'sendgrid-ruby'
$ bundle install
$ touch config/initializers/sendgrid.rb
config/initializers/sendgrid.rb
ActionMailer::Base.add_delivery_method :sendgrid, Mail::SendGrid,
                                       api_key: ENV['SENDGRID_WEB_API_KEY']
config/application.rb
config.action_mailer.delivery_method = :sendgrid
$ mkdir lib/mail
$ touch lib/mail/send_grid.rb
touch lib/mail/send_grid.rb
class Mail::SendGrid
  def initialize(settings)
    @settings = settings
  end

  def deliver!(mail)
    from = SendGrid::Email.new(email: mail.from.first)
    to = SendGrid::Email.new(email: mail.to.first)
    subject = mail.subject
    content = SendGrid::Content.new(type: 'text/plain', value: mail.body.raw_source)
    sg_mail = SendGrid::Mail.new(from, subject, to, content)

    sg = SendGrid::API.new(api_key: @settings[:api_key])
    response = sg.client.mail._('send').post(request_body: sg_mail.to_json)
    puts response.status_code
  end
end
$ touch app/mailers/test_mailer.rb
$ mkdir app/views/test_mailer
$ touch app/views/test_mailer/test_mail.text.erb
app/mailers/test_mailer.rb
class TestMailer < ApplicationMailer
  def test_mail
    mail(from: 'from@example.com', to: 'to@example.com', subject: 'テストメール')     
  end
end
app/views/test_mailer/test_mail.text.erb
SendGrid送信テスト
$ rails c
TestMailer.test_mail.deliver_now
ダン@HyperFormダン@HyperForm

とりあえずうまくいったやり方

「Integrate using our Web API or SMTP Relay」>「Web API」>「Ruby」を選択

APIキーを作成

.env
SENDGRID_WEB_API_KEY="SG.V7t_Z8LmThogehogehoeerrt4rr"
Gemfile
gem 'sendgrid-ruby'
$ bundle install
$ touch app/models/send_email.rb
app/models/send_email.rb
class SendEmail
  require 'sendgrid-ruby'
  include SendGrid

  def self.test_email
    from = Email.new(email: 'dev@example.jp') # SendGridの管理画面でSenderに登録したアドレス
    to = Email.new(email: 'hogehoge@gmail.com') # 送信したいアドレス
    subject = 'テストホゲホゲ'
    content = Content.new(type: 'text/plain', value: 'ハローハロー')
    mail = Mail.new(from, subject, to, content)

    sg = SendGrid::API.new(api_key: ENV['SENDGRID_WEB_API_KEY'])
    response = sg.client.mail._('send').post(request_body: mail.to_json)
  end
end
$ rails c
> SendEmail.test_email
=> #<SendGrid::Response:0x00erererc9650
 @body="",
 @headers=
  {"server"=>["nginx"],
   "date"=>["Mon, 29 Mar 2021 02:47:15 GMT"],
   "content-length"=>["0"],
   "connection"=>["close"]

メールが届いた。