Laravelで、メッセージ未読ユーザーに定期的にメールを送信する方法

今回は、Laravelでメールを送信する方法を解説していきます。
即時的に、メール送信するだけではなくて、特定の条件(メッセージが未読)を定期的に判断して、メール送信を処理していく方法です。

大きく分けて下記のステップがあります。
1:Mailを送信するクラスを作成する
2:Mailのメッセージ内容を作成する
3:コマンドをMail送付する
4: cronを用いてスケジュール通りにコマンドを実行

これらのステップです。

1:Mailを送信するクラスを作成する

まずは、Mailを送信するクラスを作成していきます。

まずはclassを作成します。

$ php artisan make:mail MessageSend (class名称)

APP/Mailの配下にMessageSend が生成されます。

何のためのクラスかというと、主にメールの各プロパティを決定します。

     public function build()
    {
       return $this
       ->view('emails.message') // views > emails > message.blade.php
       ->from('info@oshimen.net','Oshimen')
       ->subject('メッセージが届いております。');
    } 

view → メールの文面(これは、viewsで記述しております。)
from → メールの送り主
subject → 件名

を決めることが出来ます。

2: Mailのメッセージ内容を作成する

viewsにメールの文章を記述します。

views > emails > message.blade.php を用意します。
このmessage.blade.phpの中に文章を作成ます。

<p>
    メッセージを未読の方に通知しております。
</p>

<p>
    サービスへアクセスしてみましょう。
</p> 

例えば、こんな感じです。

3:コマンドでMail送付する

Laravelでは、最初から様々なコマンドが用意されいますが、自らコマンドを生成することも可能です。

 php artisan list 

こちらで、使用可能な全Artisanコマンドを確認することが出来ます。

それでは、コマンドを生成していきます。

php artisan make:command sendNotificationMail (コマンド名)

app > Console > Commands の配下に
sendNotificationMail が生成されています。

コマンドで処理されるべき内容・設定情報を追記していきます。

1つ目、コマンド名称を設定

$signature を設定

 protected $signature = 'app:send_notification_mail'; 

public function handle()の中に設定方法を書いていきます。

 Mail::to($to)->send(new MessageSend()); 

Mailファザードで、メール送信の実行となります。
$to:宛先です。
情報構造としては、emailとnameを設定します。
下記です。

[
 'email' => $readChatRoom->users->email, 
 'name' => $readChatRoom->users->name, 
]

sendの中身は送信する内容です。
「2:Mailのメッセージ内容を作成する」で作成したメッセージ内容となります。
※classは継承して

4: cronを用いてスケジュール通りにコマンドを実行

cronを用いて、コマンドを実行していきます。

app > Console > Commandsの配下で
コマンドが実行されるスケジュールを設定します。

 protected function schedule(Schedule $schedule)
 { 
 $schedule->command('app:send_notification_mail')->hourly();
 }

command(‘app:send_notification_mail’) 
 → 作成した、コマンドの名称を設定します。

hourly()
 → コマンドが実行される周期を設定します。
   この場合1時間おきに実行されます。

周期の設定は色々とできます。

https://readouble.com/laravel/5.7/ja/scheduling.html

で、これで動くわけではなくて、cronを設定しないといけないのです。

使っているWebサーバーのOSバージョンにもよるらしいですが
Amazon Linux 2 の場合は、

 crontab -e 

下記を追記して下さい。

 * * * * * cd /opt/www/xxx artisanまでのパス xxx/ && php artisan schedule:run >> /dev/null 2>&1 

これでスケジュール通りに動くと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です