📨

SendGridに関する調査メモ

に公開

開発エンジニア視点のサマリー

Laravel + Docker開発の前提。

メリット

  • Postfix不要
  • WebAPIでJSONレスポンス取得テストコードを書きやすい
  • Webhookでバウンススパムイベントを受信し自動リトライ実装が容易
  • DockerComposeにサービス追加するだけでチーム全員が即メール検証
  • GUIテンプレート編集で非エンジニアに文面変更を委譲可能

デメリット

  • 無料枠100通/日を超えると従量課金運用コスト監視が必要
  • 大量配信用途では専用IP月額25USDや上位プランでコスト増
  • APIレートリミット600req/分に合わせてキューやバックオフ実装要
  • 日本リージョンIPが共有なので到達率向上にはDNS認証設定必須

SendGrid概要

  • Twilio傘下クラウドメール配信SaaS
  • SMTPリレーとWeb API両対応
  • 開封クリック計測テンプレートABテストをGUI操作
  • 無料枠100通/日で試験開始可能

他との比較

通常のSMTP

  • 単一IP配信で到達率変動
  • 統計取得はログ解析が必要
  • TLS設定失敗やブラックリスト管理が自己責任

AWS SES

  • SMTPとWebAPI(v1/v2)両対応 SigV4署名必須で実装手順が長い
  • 低価格0.10USD/1000通
  • テンプレート編集はAPIかS3アップロード GUIは限定的
  • CloudWatch QuickSight連携で統計可視化設定が追加工数

SendGrid優位点

  • ダッシュボード即時可視化
  • 専用IP自動ウォームアップ
  • GUIテンプレートマーケ機能内蔵
  • APIキー1つで導入完了

送信方式選定

  • SMTP方式: 既存Postfix置換やレガシー連携向け
  • Web API方式: 新規サービス大量バッチ向け
  • Laravel: sendgridドライバでAPI方式を標準実装

WebAPI方式が嬉しい理由

  • ポート443のみ許可ファイアウォール設定が簡単
  • HTTPクライアント(fetch axios curl等)で実装完結追加ライブラリ不要
  • サーバレス環境LambdaCloudFunctionsでコールドスタート高速
  • ステータスコードとJSONで詳細エラー取得自動リトライ実装容易
  • template_idやpersonalizationsを1リクエスト指定GUI側だけで文面更新
  • Promise.allやgoroutine並列化で水平スケール簡単(コネクションプール不要)
  • E2Eテストがしやすい

Docker導入手順

# docker-compose.yml
version: "3.9"
services:
  app:
    build: .
    env_file:
      - .env
    environment:
      - SENDGRID_API_KEY=${SENDGRID_API_KEY}
# .env
MAIL_MAILER=sendgrid
SENDGRID_API_KEY=SG.xxxxxx
SENDGRID_SENDER=info@example.com
SENDGRID_TEMPLATE_WELCOME=d-xxxxxxxxxxxxxxxxxxxx

Laravel実装

  • composer require sendgrid/sendgrid
  • config/mail.phpにsendgrid mailer追加
  • Mailableで->template(env('SENDGRID_TEMPLATE_WELCOME'))使用
  • artisan tinkerでテスト送信
// config/mail.php
' mailers' => [
    'sendgrid' => [
        'transport' => 'sendgrid',
    ],
],
// app/Mail/WelcomeMail.php
class WelcomeMail extends Mailable
{
    public function build()
    {
        return $this
            ->template(env('SENDGRID_TEMPLATE_WELCOME'))
            ->subject('ようこそ')
            ->with(['name' => $this->user->name]);
    }
}

テンプレート運用

  • GUIで文面編集バージョン管理
  • Handlebarsで差し込み{{name}}
  • マーケ機能でABテストセグメント配信
  • SMTPリレーではDynamicTransactionalTemplate使用不可(APIのみ対応)
  • LegacyTemplate+X-SMTPAPIヘッダーで暫定送信は可能だが非推奨

よくあるQA

  • 無料枠超過時は自動課金停止可
  • 専用IPは月額25USD
  • DKIMSPF設定は画面誘導に従いDNS追加

まとめ

  • SendGridは高到達率と可視化を低工数で実現
  • Docker統合でチーム全員が即テスト可能
  • SMTPからの段階移行もdriver一行変更で完了

Discussion