メール
トランザクションメールの配信プロバイダーとテンプレートを設定します。
メール
ObjectOS は、アプリケーションが必要とする場面(パスワードリセット、招待、承認通知、スケジュールされたレポート)で、フレームワークのメールプラグインを通じてトランザクションメールを送信します。このプラグインには 3 つのトランスポートが同梱されています。
トランスポート
| プロバイダー | 使用する場面 | 必要な環境変数 |
|---|---|---|
log | ローカル開発。メールを送信する代わりに stdout に出力します | なし |
resend | Resend による SaaS 配信 | OS_EMAIL_API_KEY |
postmark | Postmark による SaaS 配信 | OS_EMAIL_API_KEY |
デフォルトは log です。実際のプロバイダーが設定されていても API キーが指定されていない場合、ObjectOS は log トランスポートにフォールバックします。これは非本番環境が誤ってメールを送信してしまうのを防ぐのに役立ちます。
SMTP については?
ネイティブの SMTP トランスポートは、現時点ではランタイムに組み込まれていません。環境で SMTP が必要な場合(企業のリレー、オンプレミスのメール、エアギャップ環境へのデプロイ)には、本番グレードの選択肢が 2 つあります。
- SMTP-to-API リレーを ObjectOS の前段で実行する。 Resend、Postmark、およびセルフホスト型の代替手段(Postal、Cuttlefish)はいずれも SMTP の受信を受け付け、HTTP API 経由で再送信します。ObjectOS は通常どおり HTTPS でこれらと通信します。
- カスタムメールプラグインでランタイムを実行する。 メールプラグインの API は小さく(
send(message)関数が 1 つ)、nodemailerをラップするプロジェクトプラグインをrequiresリスト経由で組み込めます。spec リポジトリのプラグイン作成ガイドを参照してください。
ネイティブの SMTP トランスポートはロードマップに含まれています。進捗は github.com/objectstack-ai/objectos/issues で確認できます。
環境変数
| 変数 | 目的 |
|---|---|
OS_EMAIL_PROVIDER | log、resend、または postmark |
OS_EMAIL_API_KEY | プロバイダーの API キー(Resend または Postmark) |
OS_EMAIL_FROM | デフォルトの送信元アドレス。addr@x と Name <addr@x> の両方の形式をサポートします |
OS_EMAIL_RETRIES | 送信失敗時のトランスポート再試行回数(デフォルトは 0) |
環境変数はアーティファクトの email 設定ブロック内の対応する値を上書きするため、運用担当者はアーティファクトを再ビルドすることなく配信先を変更できます。
テンプレート
再利用可能なテンプレートは sys_email_template に格納されます。テンプレートは、フレームワークのテンプレートエンジンによって評価される変数の補間をサポートします。アプリケーションコード(またはフロー)は、テンプレート ID と変数バンドルを指定してメールサービスを呼び出します。サービスは件名と本文を生成し、設定されたトランスポートに引き渡します。
配信の検証
Resend / Postmark の場合は、送信ドメインがプロバイダーのダッシュボードで設定されていること(SPF、DKIM、必要に応じて DMARC)を確認してください。最も手早いエンドツーエンドの確認方法は、メール設定ページにある Console のテストメール送信アクションです。これはライブのトランスポートを使用し、トランスポートエラーをインラインで表示します。
運用上のガイダンス
- API キーはシークレットとして扱ってください。顧客のシークレットマネージャーに保存し、アーティファクトには決して含めないでください。
- トランスポートエラーのログを監視してください。プロバイダーのレート制限、抑制(suppression)、バウンスはすべてそこに表示されます。
- 監査上重要なトランザクションメール(パスワードリセット、MFA チャレンジ)は、顧客のポリシーに従って保持する必要があります。保持期間はトランスポートではなく監査ログに設定してください。
- 送信メールは業務トランザクションをブロックしません。送信失敗はエラーとして表示されますが、発端となったレコードの変更をロールバックすることはありません。