はじめに
また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クラスを作ってあるので勝手に使ってください。
特に気の利いたメソッドは用意していないので、そういうのが欲しい場合は継承して自分で実装するようにしましょう。
おわりに
最近、自分の性格が長い時間をかけて個人開発をするのに向いていないことに気づき、くだらないプラグインをたくさん手元に用意してお茶を濁す方針を執ろうとしています。