Firebase「Trigger Email from Firestore」拡張機能のセットアップ方法 (ロリポップメール編)

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接続URIsmtps://(メールアドレス):(パスワード)@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(必須)メール送信トリガーとなるコレクション名mail
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を指定しても、多くの場合このデフォルト値が使用されます

実装上の注意点

  1. リージョン一致の重要性:
    • deploy.shなどのデプロイスクリプトと、この拡張機能の両方でリージョンをFirestoreと一致させてください注意点: Firestoreのリージョンと一致させることが重要です。不一致の場合、次のようなエラーが発生します:Database ‘(default)’ does not exist in region ‘us-central1’. Did you mean region ‘asia-northeast1’?
  2. 送信元アドレスの制限:

    // ユーザーのメールアドレスを送信元(from)にはできませんが、
    // 以下のようにreplyToを設定することで返信先として機能します
    await addDoc(collection(db, 'mail'), {
    to: '(管理者メールアドレス)',
    message: { subject: '件名', html: 'メール本文' },
    replyTo: userEmail // ユーザーのメールアドレスを返信先に設定
    });
  3. データ保持期間の設定:
    • Firestore TTL typeFirestore TTL valueの設定により、送信済みメールのデータを自動削除できます
    • 長期保存が不要な場合は、dayshoursに設定してストレージコスト削減を検討してください

これらの設定を正しく行うことで、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」を使えば、サーバーサイドのコード実装なしで自動メール送信機能を簡単に実装できます。特にロリポップのようなレンタルサーバーのメールアドレスと組み合わせることで、独自ドメインでのメール送信も可能になります。

実装時には:

  1. Firestoreとのリージョン一致を必ず確認
  2. 送信元アドレスの制限を理解し、replyToを活用
  3. セキュリティルールの設定も忘れずに

これらのポイントに注意して、効果的な自動メール送信機能を実装しましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です