これはよく見るとドキュメントに載っているのだけど、 結構見落としがちだったので、記載しておく。
ドキュメントの内容
SendGridのMailSendAPIを使えばOKな感じです。
Rubyのコード
これで終了だとあまりにもつまらないので、 SendGrid公式でRubyのGem(SDK)が提供されているので、それを使った際のサンプルを載せておく。 Rubyのコードにするとざっくりこんな感じだろう。
def mail_send
sendgrid = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
sendgrid.client.mail._("send").post(request_body: params)
end
def params
param = {
"custom_args" => {
"test_mode" => true
},
"from" => {
"email" => 'example@example.com',
"name" => 'サイト名'
},
"content" => [
{
"type" => 'text/html',
"value" => 'テスト'
}
],
"mail_settings" => {
"sandbox_mode" => {
"enable" => false
}
}
}
param["personalizations"] = User.all.find_each do |user|
{
"to" => [
{
"email" => user.email,
"name" => user.name
}
],
"substitutions" => {
"[USER_NAME]" => user.name,
"[USER_EMAIL]" => user.email,
},
"subject" => 'メールタイトル',
"custom_args" => {
"site_user_id" => user.id.to_s,
}
}
end
param
end
mail_send
この方法で運用すれば1000つの宛先へのメール送信をまとめることができる。 配信メールアドレスが30000件なら、30回のリクエストに分割してメール配信リクエストをSidekiqやDelayedJob等でWorkerの数を調整して処理してやれば送信リクエストはサクッと完了するだろう。 ただ、流石に30,000件とかのユーザーへの一斉送信はMarketing Campaigns API Overview - ドキュメント | SendGrid を使うべきでは…? と思ってしまっています。*1
テンプレートに変数をアサイン
他にもMailAPIでは、テンプレートを変数を定義しておき、送信時に変数を展開することができる。(コードのsubstitutionsあたりを参照してください。) それぞれのユーザーでメールアドレスだけでなく、ユーザー名や宛名なんかも異なるだろうし、メールの文章中にそういった動的な文言も含めることができる。
まさにSendGridさまさまである。