📨
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