Trigger Emailでサブコレクション（サブディレクトリ ）から発火させたい

firebaseからメール送信したい。
フォームからの送信をfirebaseでやりたい。
そんな時に公式の拡張機能としてベータ版ではありますが
TriggerEmailというものができていました。
その中で情報が見つけられなかったもので
「fire storeのサブコレクション追加からメール送信を発火させたい」
というものがあり自己解決できたのでまとめてみます。
※インストールなどセッティングは下の方に公式ドキュメントを貼ってますのでみてみてください。

まずは結論から

# Trigger EmailのEmail documents collection設定方法
firebaseコンソール
↓
左メニューのExtensions
↓
Trigger Email管理
↓
拡張機能の構成のEmail documents collectionを以下のように設定します。


```setting.console

users/{userId}/mail

```

これはfire storeの構造が以下のようになっており

```firestore.json

{
    "users": {
        "userID": {
            "mail": {
                "mailID": {
                    "to": "example@example.com",
                    "message": {
                        "subject": "メールの題名です",
                        "text": "メール本文ですメール本文ですメール本文です"
                },
                "mailID2": {
                    "to": "example2@example2.com",
                    "message": {
                        "subject": "メールの題名2です",
                        "text": "メール本文2ですメール本文2ですメール本文2です"
                }
            }
        }
    }
}

```

mailIDが追加されたタイミングで発火させたい時の設定になります。
最初users/*/mailと書いてみたのですが動かず、firestore.rulesに合わせて書いてみたら動きました。

# 公式で説明されているシンプルなやり方
まず動かしたいという方はシンプルにやってみるのが良いと思います。
[公式サイト](https://firebase.google.com/products/extensions/firestore-send-email)

単純にルートのコレクションにmailというコレクションを作って送信する例が出ています。
最初テストしたときは以下の設定で
Trigger EmailのEmail documents collectionを設定し


```setting.console

mail

```

firestoreの構造は以下のような形

```firestoremail.json

{
    "mail": {
        "mailID": {
            "to": "example@example.com",
            "message": {
                "subject": "メールの題名です",
                "text": "メール本文です"
        }
    }
}

```

で動きました。

# fromを変更する
メールを送った際の送信元（from）を変更するには
sendgrid側の設定画面とfirebase設定画面での設定が必要でした。

### firebase管理画面
1.左メニューのExtensionsをクリック
2.Default FROM addressを変更
※反映までに数分かかります。
※また返信先のアドレスも同じ場所にDefault REPLY-TO addressという項目があるのでそこで設定できます。

### sendgrid設定画面
1.左メニューのAccount Detailsをクリック
2.Personal Infoに設定しているメールアドレスをfirebaseで設定したものと同じものを設定します。
※これで動かない場合は左メニューのMarketingをクリック
　プルダウンで出てきたSendersをクリック
ここでFROMとREPLYにfirebaseで設定したものと同じものを設定してみて下さい。
（Marketingがない場合はアカウント設定が完了していない可能性があります）

以上２箇所を設定したら当方の環境では動きました。

最初firestoreに送るデータの中に以下のように
fromを加えて書いてみましたが動かず
調べて前述の方法で解決しました。

```error.json

{
    to: sendToMailAddress,
    from: fromAddress,
    updated_at: timestamp,
    message: {
        subject: 'タイトル',
        text: '本文'
    }
}

```

もし他にもっと良さそうな方法がありましたら
コメント欄で教えていただければ嬉しいです。


# 注意点
まだベータ版でメジャーバージョンが０なので後方互換性を無視した大幅な変更がある可能性があります。
データベース構造については各々でご検討ください。前述のものはユーザーに依存している形ですので
後々メールをユーザーから分離したいなどの要件発生の可能性がある場合は別途検討する必要があると思います。

# 参考サイト
[github|firebaseExtensions](https://github.com/firebase/extensions/tree/master/firestore-send-email)
機能追加の予定、質問なども載っていて助かりました。

[nodemailerのオプションページ](https://nodemailer.com/message/attachments/)
nodemailerのオプションページがgithubで紹介されていたので基本的なパラメータはnodemailerと同じになっていくのではないでしょうか。ラッパーな拡張機能なのかな。この辺り詳しい人いたらコメントください。

# 所感
個人的にはsend gridというメール送信サービスが公式に書いてあったので使用しましたが
firebase functionsも書かずにメール送信機能を実現できてしまいました。
（コンソールではfunctionsが自動生成され動いていて、to,messageなどのパラメータも
nodemailerのページが紹介されていたので仕組み的には従来のやり方を拡張機能にまとめている印象です）
send gridも2021年1月現在12,000通/月までは無料とのことでした。
色々な拡張機能が出てきたら少しずつ楽になりそうですね。