今回は、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
これでスケジュール通りに動くと思います。