大まかな流れ
- Dockerを使用した環境構築
- artisanコマンドでMailableクラスを作成(メール送信機能もついでに作成)
- artisanコマンドでCommandsクラスを作成(コマンドの実処理も作成)
- Karner.phpのscheduleメソッドに1日1回3番で作成したコマンドを実行するように作成
- cronの設定(開発環境で確認できるようにする)
注意点
タスク多重防止機能等細かいことについては今回書いておりませんので下記の記事を一読して自身に合った設定を追加していってください
手順1. Dockerの環境構築にはMailHogについてはかかれておりませんので(多分)
ご自身でdocker-compose.ymlに追記してください。
その際は.envも修正が必要になると思います。
実装手順
手順1. Dockerを使用した環境構築
下記の方の環境構築がわかりやすいです。
私はよく参考にして開発環境をつくっておりますので、もし開発環境の作成に時間がかかるようでしたら参考にしてください
手順2. artisanコマンドでMailableクラスを作成(メール送信機能もついでに作成)
appコンテナ内のシェルに入った後に
php artisan make:mail SendMail
app/mail/SendMail.phpが作成されますので
初期の内容から変更した箇所を下記に貼ります。
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'メールを送信しました',
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'send.mail',
);
}
メールの本文をresorcesディレクトリの直下にsendディレクトリとmail.blade.phpファイルを作成し、テストメールと記入してください。
手順3. artisanコマンドでCommandsクラスを作成(コマンドの実処理も作成)
php artisan make:command SendMailCommand
app/Console/Commands/SendMailCommand.phpが作成されますので
初期の内容から変更した箇所を下記に貼ります。
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'send-mail';
/**
* The console command description.
*
* @var string
*/
protected $description = 'メール送信機能';
/**
* Execute the console command.
*/
public function handle(Mailer $mailer): void
{
$mailer->to('sample@gmail.com')
->send(new \App\Mail\SendMail());
}
手順4. Karner.phpのscheduleメソッドに1日1回3番で作成したコマンドを実行するように作成
app/Console/Karner.phpのscheduleメソッドの内容を編集
/**
* Define the application's command schedule.
*/
protected function schedule(Schedule $schedule): void
{
$schedule->command('send-mail')->everyFiveMinutes();
}
php artisan schedule:runでmailHogにメールが送信されることを確認してください
手順5. cronの設定
下記のコマンドをappコンテナ内のシェルに打ってください。
cronコマンドやvimコマンドが使用できずエラーが表示される場合があります。
vim と cronをインストールして再ビルドしてください。
crontab -e
一番下に下記のCronコマンドを追記し、保存してエディタを閉じます。
/path-to-your-project → Dockerコンテナ内のLaravelプロジェクトディレクトリをフルパスで指定
/usr/local/bin/php → Dockerコンテナ内のphp実行ファイルがあるディレクトリをフルパスで指定
* * * * * cd /path-to-your-project && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
cronが起動しているかを確認し、起動していれば5分に1回メールが送られるようになります。