--- tags: cookbiz --- # toCメール配信について ## 参考資料 [CRM施策管理](https://docs.google.com/spreadsheets/d/1eLgzFvCJx5tgnuel0-uhqaWGdBqIccBoP6O5-Bj1A7Q/edit#gid=0) ## 現状の環境 ```plantuml cloud AWS { folder RDS { database cookbiz note right: 求職者・求人データ database cookbiz_api note bottom: 求人データ(検索用) } folder EC2 { database サーバ { usecase "cakephp-batch-app" usecase "corp2" usecase "cookbiz-orm" } note right of サーバ: バッチ・兼管理画面用サーバ } } ``` ### cakephp-batch-app バッチ用リポジトリ。もろもろ整備されてる方。 利用技術 | 内容 | バージョン | 備考 | |---|---|---| | PHP | 7.2 | EOL | | CakePHP | 3.8 | EOL | ### cookbiz-orm データベースを扱うリポジトリ。CakePHPのORM部分を抜き出したもの。 (故にCakePHP上でしか動かない) 利用技術 | 内容 | バージョン | 備考 | |---|---|---| | CakePHP | 3.8 | EOL | ### redis 環境設定のデータが入ってる。既存のサービスに最適化されたデータになっているので、他の箇所では使えないことで有名。 ### DB cookbizには求人、求職者などのデータが蓄積されている。cookbiz_apiには公開された求人の情報が入っており、検索に利用される。現状、cookbiz側の求人データで検索はできるが抜群に遅い。cookbiz-ormはほとんどのテーブルに対応しているが、一部ないものもある。 利用技術 | 内容 | バージョン | 備考 | |---|---|---| | MySQL | 5.7? | 2023.10 EOL | ### Salesforce 求人、求職者などのデータが蓄積されている。既存サービスはDBのデータだけを使う。サービス上でのデータ更新はSalesforceにも送信されている(箇所もある)。困ったことにSalesforceにあってDBにない求人・求職者データ、その逆があったりする。歴史が古く、いろいろな人が触ってはいなくなっていったので、把握しきれない状況。 ### Marketo (主に)CRMとして利用。メール配信やアンケートフォームなどで利用される。SalesforceやDBからデータをインポートしてるが、ここにしかないデータもある。誰も仕様がわからない魔境。 ## 現在のMarketoでのメール配信について Marketoでは、内容によってメール配信で使うデータの場所が違うっぽい。 Marketo上のデータを使っているものもあれば、DBやSalesforceのデータ(をTreasureData経由でMarketoに移して)使っていたりする。 ## おおよその開発イメージ ```plantuml actor 配信設定者 actor ユーザ cloud AWS { folder S3 { file 配信設定ファイル file 配信リスト } database RDS usecase 配信リスト作成 queue Crontab 配信設定ファイル --> 配信リスト作成 RDS --> 配信リスト作成 Crontab -left-> 配信リスト作成: 定期実行 配信リスト作成 --> 配信リスト: 配信リストの作成 usecase メール配信 Crontab --> メール配信: 定期実行 メール配信 <-- 配信リスト usecase 配信キュー メール配信 --> 配信キュー: 依頼 配信キュー --> ユーザ: メール受信 } 配信設定者 --> 配信設定ファイル: 配信設定ファイルアップロード ``` ```plantuml actor 配信設定者 queue Crontab participant 配信リスト作成 participant メール配信 participant 配信キュー collections S3 database RDS participant メールサービス actor ユーザ 配信設定者 -> S3: 配信設定ファイルアップロード == 配信リスト作成 == autonumber Crontab -> 配信リスト作成: 実行 activate 配信リスト作成 配信リスト作成 -> S3: 配信設定ファイル取得 S3 ---> 配信リスト作成 配信リスト作成 -> RDS: 求職者、求人データ検索 RDS ---> 配信リスト作成 配信リスト作成 -> S3: 配信リストアップロード return success == メール配信 == autonumber Crontab -> メール配信: 実行 activate メール配信 メール配信 -> S3: 配信リスト取得 S3 ---> メール配信 loop メール配信リスト分 loop 行分 メール配信 -> 配信キュー: メール送信依頼 activate 配信キュー 配信キュー -> メールサービス: メール配信 メールサービス -> ユーザ: メール deactivate end end return success ``` ## 実現に向けて ### 雑感 バッチに関しては既存のcakephp-batch-appを利用して、作っていくのが一番早い。なまじCakePHPに特化しているので、他のフレームワークや言語で開発しようとすると、工数が倍加してしまう。 当初の感想では、配信リスト作成部分だけcakephp-batch-appにして、配信部分は別環境で。。と考えていたが、上記の通りなのと社内開発メンバーの反発が大きいと予想されるので、全部cakephp-batch-appに寄せてしまった方が良いかもしれない。 ### 実現案 #### 配信リスト作成 配信対象の抽出し、どのメール内容を送るかリスト化したファイル( or DBデータ)を作成する。配信内容に付随する情報(求人データなど)はここでは取得しない。 実行間隔は1日1回程度でも良いかなと。 #### 配信 配信リストから、メール配信に必要な情報(求人データなど)を使って配信。配信依頼は(CakePHPの)キューを作成して、そちらに任す。 実行感覚は10分, 30分おきなど比較的短いスパン。 #### 配信キュー 配信。キューの情報から必要なメールテンプレートを使って配信。バウンスについては要相談。 キューが実行されるタイミングは任意(基本は即時発火) ### 気になる点 - メール配信設定でどこまで設定できるか - 求人・ユーザの配信可否はどのタイミングで決めるか - 独自すぎるメール配信がある場合どうするか(例:新着求人ランキング) - CakePHPだと、メールテンプレートは**必ず** `templates`ディレクトリ内のものしか使えない ## クラス図たたき ```plantuml package CrmToc { package Console { class DeliveryEmailCommand { execute(): void } } package Task { class DeliveryTask { + candidate: CtcDeliveryTargetCandidate + jobs: CtcDeliveryJob[] + preference: CtcDeliveryPreference invoke(): void } } package Model { class CtcDeliveryPreference { + id + setting_file_path } class CtcDeliveryReservation { + id + preference_id + schedule_datetime + executed_at } class CtcDeliveryTargetCandidate { + id + reservation_id + candidate_id } class CtcDeliveryJob { + id + reservation_id + job_id } CtcDeliveryPreference "1" - "*" CtcDeliveryReservation CtcDeliveryReservation "1" -- "*" CtcDeliveryTargetCandidate CtcDeliveryReservation "1" -- "*" CtcDeliveryJob } } ``` ### メール配信シーケンス ```plantuml actor System as a participant DeliveryEmailCommand as b participant DeliveryTask as キュー entity CtcDeliveryPreference as c entity CtcDeliveryReservation as d entity CtcDeliveryTargetCandidate as e entity CtcDeliveryJob as f autonumber a -> b:実行 activate b b -> d:対象の時間の配信予約を取得 d --> b loop 配信予約分 b -> f:対象求人取得 f --> b b -> c:配信設定取得 c --> b b -> e:配信対象者取得 e --> b loop 配信対象者分 b -> キュー:配信依頼 キュー --> b end end ``` ### TODO - [ ] メール配信設定内容をきめる - [ ] 配信可否のタイミングを決める - [ ] 既存のメール配信内容の確認(方城さんにヒアリング?) - [ ] 実行環境・実現方法の確認&決定 - [ ] バウンスどうするか決める