SendGridの利用手順2021年3月
ここ最近でSendGridの仕様がもろもろ変わってるっぽい。現時点での使い方をまとめておく。
まず日本の代理店(構造計画研究所)を通して契約すると、いろいろ制約ができる。確かサービス提供者のドメインのメールアドレスから申し込まないといけなくて、受託開発とかだと面倒だった記憶。
本家(sendgrid.com)から直接契約した方が良さげ。
アカウント登録するとこの画面が表示される。
確認メールのリンクも踏んでverifyしておく。
sender identity(差出人情報)の登録から進める。
「Create a single sender」「Authenticate a domain」の2つの方法があるけど、前者が推奨とのこと。
- From Name
- 受信者に表示される差出人名
- From Email Address
- メール送信者のメールアドレスとして表示される
- このアドレスの持ち主かチェックするため、登録後このアドレスに確認メールが届く
- リンク踏めばログインしなくてもverifyできる
- Reply to
- 受信者が返信する時の宛先にセットされるアドレス
- Nickname
- 差出人情報を一意に識別するための名前
- この名前がメール受信者に表示されることはない
このページを再度表示したい時は
Marketing Campaigns > Senders
からアクセスできる。
Senderを登録した後に
app.sendgrid.com/guide
に戻ると、以下のように表示されている。
「Integrate using our Web API or SMTP Relay」>「Web API」>「Ruby」を選択
APIを使う方法だと、ActionMailerを使って送信できない?
SMTPだといけそうだけど。
sendgrid-actionmailerってgemがある。
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までしか対応してないっぽい。
こういう記事もあった。読んでみる。
この記事のやり方でいけそうだな
いけそうだけど、普通にSMTPで送ればよくない?
SMTP接続では余分な「おしゃべり」が必要になるので、もし可能であればWeb APIのご利用をお勧めいたします。具体的な理由は以下のとおりです。
・SMTPリレーでは複数の潜在的な障害点ができてしまい、送信者とSendGrid間で異常コードが発生し得る場所が増えてしまいます。
・Web APIの方が高速です。SMTPの余分なやり取りのせいで、インバウンドデータセンターから遠い場所からリクエストする場合は(ごく僅かではありますが)遅延が生じる可能性があります。
・SMTPリレーと同様にWeb APIでもAPIキーを利用することができるので、あなたのプログラムにもう一段高いセキュリティ設定を付加することがきます。APIキーを使うとユーザ名とパスワードのセットとは独立した認証情報を生成でき、あなたのアカウントが乗っ取られて迷惑メールやフィッシングメールを送信されてしまう可能性が極めて低くなります。
とは言うものの、SMTPはメールの業界標準ですし、全世界で用いられています。Web APIはSendGridの創業者がSendGridのシステムに効率よくアクセスするために作ったもので、すべてのユーザに適した方法とは言えないかもしれません。SMTPリレーはまた、既存のCRMシステムやOutlookのようなメールクライアントから利用できます。Web APIは、多くの場合、自身のプロダクトを開発する開発者に利用されています。
SendGridがWeb APIを推奨してるならそれにしたがっておくかー。
TechRachoのやり方で実装しよ。
「Integrate using our Web API or SMTP Relay」>「Web API」>「Ruby」を選択
APIキーを作成
SENDGRID_WEB_API_KEY="SG.V7t_Z8LmThogehogehoeerrt4rr"
gem 'sendgrid-ruby'
$ bundle install
$ touch config/initializers/sendgrid.rb
ActionMailer::Base.add_delivery_method :sendgrid, Mail::SendGrid,
api_key: ENV['SENDGRID_WEB_API_KEY']
config.action_mailer.delivery_method = :sendgrid
$ mkdir lib/mail
$ 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
class TestMailer < ApplicationMailer
def test_mail
mail(from: 'from@example.com', to: 'to@example.com', subject: 'テストメール')
end
end
SendGrid送信テスト
$ rails c
TestMailer.test_mail.deliver_now
rails c
するとuninitialized constant Mail::SendGrid (NameError)
のエラーが出るなー
techrachoはrails5で、俺はrails6だからその辺の問題かなあ
とりあえずうまくいったやり方
「Integrate using our Web API or SMTP Relay」>「Web API」>「Ruby」を選択
APIキーを作成
SENDGRID_WEB_API_KEY="SG.V7t_Z8LmThogehogehoeerrt4rr"
gem 'sendgrid-ruby'
$ bundle install
$ touch 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"]
メールが届いた。
オプションとかは以下に書いてある。htmlメールとかも送れる。