Firestoreへのデータ追加をトリガーに自動メール送信を行う機能を実装したい場合、Firebase Extensionsの「Trigger Email from Firestore」が非常に便利です。この記事では、ロリポップのメールサーバーを使用した設定方法と、実際のコード例を解説します。
1. 拡張機能の概要
Firebase Extensions「Trigger Email from Firestore」は、Firestoreの特定コレクションにドキュメントを追加するだけで、自動的にメール送信ができる機能です。ユーザーからの問い合わせや通知メールの自動送信などに活用できます。
2. SMTPサーバー情報の準備
ロリポップのSMTPサーバー設定情報は以下のとおりです:
SMTPサーバー: smtp.lolipop.jp
ポート: 465
ユーザー名: (メールアドレス)
パスワード: (パスワード)
セキュリティ: SSL/TLS
※ ユーザー名、パスワードはロリポップ!公式サイトのメールタブから確認することが可能です。
SMTP URIの形式は次のようになります:
smtps://(メールアドレス):(パスワード)@smtp.lolipop.jp:465
3. 拡張機能のインストールと設定
Firebaseコンソールから「Extensions」メニューを開き、「Trigger Email」(firestore-send-email)を選択してインストールします。
以下は、Firebase Extensions「Trigger Email from Firestore」をインストールする際に表示されるすべての設定項目です。必須項目には(必須)と明記しています。
設定項目 | 必須/任意 | 説明 | 推奨値(ロリポップメール使用時) |
---|---|---|---|
Cloud Functions location | (必須) | 関数を実行するリージョン | asia-northeast1(Firestoreと同じリージョン) |
Firestore Instance ID | (必須) | 使用するFirestoreインスタンスのID | (default) |
Firestore Instance Location | (必須) | Firestoreインスタンスのロケーション | (自動検出される) |
Authentication Type | (必須) | SMTP認証タイプ | Username & Password |
SMTP connection URI | (必須) | SMTP接続URI | smtps://(メールアドレス):(パスワード)@smtp.lolipop.jp:465 |
SMTP password | 任意 | SMTPパスワード | (空欄可。URI内に含める場合) |
OAuth2 SMTP Host | 任意 | OAuth2 SMTPホスト | (空欄。ロリポップでは不要) |
OAuth2 SMTP Port | 任意 | OAuth2 SMTPポート | (空欄。ロリポップでは不要) |
Use secure OAuth2 connection? | 任意 | OAuth2接続をセキュアにするか | (空欄。ロリポップでは不要) |
OAuth2 Client ID | 任意 | OAuth2クライアントID | (空欄。ロリポップでは不要) |
OAuth2 Client Secret | 任意 | OAuth2クライアントシークレット | (空欄。ロリポップでは不要) |
OAuth2 Refresh Token | 任意 | OAuth2リフレッシュトークン | (空欄。ロリポップでは不要) |
OAuth2 SMTP User | 任意 | OAuth2 SMTPユーザー | (空欄。ロリポップでは不要) |
Email documents collection | (必須) | メール送信トリガーとなるコレクション名 | |
Default FROM address | (必須) | デフォルトの送信元アドレス | (送信元メールアドレス) |
Default REPLY-TO address | 任意 | デフォルトの返信先アドレス | (任意。返信先を固定したい場合のみ) |
Users collection | 任意 | ユーザーコレクション | (空欄可。UIDでメール送信する場合のみ必要) |
Templates collection | 任意 | テンプレートコレクション | (空欄可。メールテンプレート機能を使う場合のみ) |
Firestore TTL type | (必須) | Firestoreのデータ保持期間タイプ | Never(自動削除しない場合) |
Firestore TTL value | (必須) | Firestoreのデータ保持期間値 | 1(TTL typeがNeverの場合は関係なし) |
TLS Options | 任意 | TLS接続オプション | (空欄可。特別な理由がない限り不要) |
必須項目の詳細解説
1. Cloud Functions location(必須)
- これはFirestoreのリージョンと必ず一致させる必要があります
- 日本のユーザー向けのサービスなら「asia-northeast1」がおすすめ
- 誤ったリージョンを選択すると「Database does not exist in region…」エラーが発生します
2. SMTP connection URI(必須)
- ロリポップメールを使用する場合の形式:
smtps://(メールアドレス):(パスワード)@smtp.lolipop.jp:465
- パスワードに特殊文字が含まれる場合はURLエンコードする必要があります
- 認証情報を含むため、セキュリティに注意してください
- SMTP_PassWordにパスワードを入力することも可能です。その場合は、入力後にシークレットキーを生成と表示されるのでシークレットキーを作成しましょう。
また、SMTP connection URlは『smtps://(メールアドレス):smtp_password@smtp.lolipop.jp:465』となります。
3. Email documents collection(必須)
- メール送信を指示するドキュメントを保存するコレクション名
- 一般的には「mail」が使われますが、任意の名前でOK
- この名前は後でFirestoreにドキュメントを追加する際に使用します
4. Default FROM address(必須)
- デフォルトの送信元アドレス(ロリポップのメールアドレス)
- 重要: このアドレスはSMTP認証に使用するアドレスと一致させる必要があります
- ドキュメント内で
from
を指定しても、多くの場合このデフォルト値が使用されます
実装上の注意点
- リージョン一致の重要性:
- deploy.shなどのデプロイスクリプトと、この拡張機能の両方でリージョンをFirestoreと一致させてください注意点: Firestoreのリージョンと一致させることが重要です。不一致の場合、次のようなエラーが発生します:Database ‘(default)’ does not exist in region ‘us-central1’. Did you mean region ‘asia-northeast1’?
- 送信元アドレスの制限:
// ユーザーのメールアドレスを送信元(from)にはできませんが、
// 以下のようにreplyToを設定することで返信先として機能します
await addDoc(collection(db, 'mail'), {
to: '(管理者メールアドレス)',
message: { subject: '件名', html: 'メール本文' },
replyTo: userEmail // ユーザーのメールアドレスを返信先に設定
});
- データ保持期間の設定:
Firestore TTL type
とFirestore TTL value
の設定により、送信済みメールのデータを自動削除できます- 長期保存が不要な場合は、
days
やhours
に設定してストレージコスト削減を検討してください
これらの設定を正しく行うことで、Firebase Extensions「Trigger Email from Firestore」を使った自動メール送信機能を効果的に実装できます。
4. リージョン設定の確認と修正
deploy.shなどのデプロイスクリプトがある場合、そこでのリージョン設定もFirestoreのリージョンと一致させる必要があります:
bash
# 例:deploy.shの修正
PROJECT_ID="your-project-id"
REGION="asia-northeast1" # Firestoreのリージョンと一致させる
BUCKET_NAME="${PROJECT_ID}.firebasestorage.app"
5. Firestoreのメールドキュメント形式
メール送信用のドキュメント形式は以下のようになります:
javascript
{
"to": "送信先メールアドレス", // 配列も可能
"message": {
"subject": "メールの件名",
"text": "メール本文(プレーンテキスト)", // textかhtml、または両方
"html": "メール本文(HTML)"
},
"replyTo": "返信先メールアドレス" // 任意
}
6. 実装例:問い合わせフォームからのメール送信
以下は、ユーザーからの問い合わせをFirestoreに保存し、自動的に管理者宛にメールを送信する実装例です:
typescript
// 問い合わせのインターフェース
export interface Inquiry {
user_id: string | null;
category: string;
subject: string;
message: string;
email: string;
}
// お問い合わせを送信する関数
export const submitInquiry = async (inquiry: Inquiry): Promise<void> => {
try {
// ユーザーIDを設定(認証されている場合)
const currentUser = auth.currentUser;
const userId = currentUser ? currentUser.uid : null;
// ドキュメントID生成(user-id_date形式)
const date = new Date().toISOString().replace(/[:.]/g, '-');
const inquiryId = `${userId || 'anonymous'}_${date}`;
// inquiries/service/items/{inquiryId}へのリファレンス
const inquiryRef = doc(db, 'inquiries', 'service', 'items', inquiryId);
// サービス問い合わせを追加
await setDoc(inquiryRef, {
...inquiry,
user_id: userId,
type: 'inquiry',
status: 'new',
created_at: serverTimestamp(),
updated_at: serverTimestamp()
});
// メール通知のドキュメントを作成
await addDoc(collection(db, 'mail'), {
to: '(管理者メールアドレス)',
message: {
subject: `【アプリ名】問い合わせ: ${inquiry.subject}`,
html: `
<h2>お問い合わせ内容</h2>
<p><strong>カテゴリ:</strong> ${inquiry.category}</p>
<p><strong>件名:</strong> ${inquiry.subject}</p>
<p><strong>メッセージ:</strong></p>
<p>${inquiry.message.replace(/\n/g, '<br>')}</p>
<p><strong>ユーザーメールアドレス:</strong> ${inquiry.email}</p>
<p><strong>ユーザーID:</strong> ${userId || 'anonymous'}</p>
`
},
replyTo: inquiry.email // 返信先を設定
});
console.log('問い合わせが正常に送信されました');
} catch (error) {
console.error('問い合わせの送信に失敗しました:', error);
throw error;
}
};
7. 注意点と制限事項
送信元アドレスについて
ロリポップなどの一般的なSMTPサーバーでは、認証したアカウント以外のメールアドレスを送信元として使用することはできません。つまり:
from
フィールドを指定しても、実際の送信元は拡張機能で設定した「Default FROM address」になります- ユーザーのメールアドレスを送信元にはできませんが、
replyTo
に設定することで返信先として機能させることが可能です - 送信元アドレスを動的に変更したい場合は、SendGridやMailgunなどの外部SMTPサービスの利用を検討する必要があります
セキュリティ対策
- Firestoreセキュリティルールを適切に設定し、不正なメール送信を防止しましょう
- メールの送信履歴を長期保存する場合は、自動削除(TTL)の設定も検討してください
まとめ
Firebase Extensions「Trigger Email from Firestore」を使えば、サーバーサイドのコード実装なしで自動メール送信機能を簡単に実装できます。特にロリポップのようなレンタルサーバーのメールアドレスと組み合わせることで、独自ドメインでのメール送信も可能になります。
実装時には:
- Firestoreとのリージョン一致を必ず確認
- 送信元アドレスの制限を理解し、replyToを活用
- セキュリティルールの設定も忘れずに
これらのポイントに注意して、効果的な自動メール送信機能を実装しましょう。