メール送信ログをDBに保存するCakePHPプラグイン
はじめに
またCakePHP3のプラグインつくりました。
つくったもの
tsyama/cakephp-send-mail-logger
これです。Packagistにも登録済み。
アプリケーションから送信したメールの概要をDBに登録するプラグインです。 アプリケーション内で管理者ユーザーにメールログを提供したり、開発環境でメール送信切ってるときに使えたりするでしょうか。
やったこと
プラグインのmigration
CakePHPでプラグインの中にmigrationを含められることをはじめて知りました。
bin/cake bake migration CreateSendMailLogs to_address:string?[255] from_address:string?[255] cc_address:string?[1000] bcc_address:string?[1000] subject:string?[1000] message:text? created modified -p SendMailLogger
migrationをbakeするときに-p
オプションを付けると、開発中の既存のプラグインに対してmigrationファイルを生成することができます。
プラグインのmigrationを実行するときはこうです。
bin/cake migrations migrate -p SendMailLogger
プラグインに紐づくmigrationにすることで、アプリケーションのmigrateに影響を与えずにプラグインのmigrate/rollbackができます。
はじめはBakeタスクを作成してアプリケーションの方のconfig/Migration
ディレクトリに都度ファイルを生成してもらうようにしようかと考えていましたが、こっちの方が単純ですね。
このmigrationにより、DBにsend_mail_logs
テーブルが作られます。
独自Emailクラス
CakePHPからEmailを送る際はCake\Mailer\Email
クラスを使いますが、SendMailLoggerプラグインではこのクラスを継承したSendMailLogger\Email
クラスを提供しています。
このEmailクラスはもとのCake\Mailer\Email
クラスと概ね同じものですが、send()
メソッド実行後にsend_mail_logs
テーブルにデータを登録する処理を噛ませました。
class Email extends \Cake\Mailer\Email { public function send($content = null) { $content = parent::send($content); $sendMailLogsTable = TableRegistry::get('SendMailLogs'); $mailLog = $sendMailLogsTable->newEntity(); $mailLog->to_address = implode($this->getTo()); $mailLog->from_address = implode($this->getFrom()); $mailLog->cc_address = implode($this->getCc()); $mailLog->bcc_address = implode($this->getBcc()); $mailLog->subject = mb_decode_mimeheader($this->getSubject()); $mailLog->message = implode("\n", $this->_message); $mailLog->created = date('Y-m-d H:i:s', time()); $sendMailLogsTable->save($mailLog); return $content; } }
メールログデータを使う
SendMailLogger\Model\Entity\SendMailLog
クラスおよびSendMailLogger\Model\Table\SendMailLogsTable
クラスを作ってあるので勝手に使ってください。
特に気の利いたメソッドは用意していないので、そういうのが欲しい場合は継承して自分で実装するようにしましょう。
おわりに
最近、自分の性格が長い時間をかけて個人開発をするのに向いていないことに気づき、くだらないプラグインをたくさん手元に用意してお茶を濁す方針を執ろうとしています。