Laravelで通知(メール)を試す。
laravel でコマンドを作ってメールを送信する。
必要なもの
- SMTP/S接続情報
作るもの
- Notification クラス
- 通知を送信するコンソール・コマンド
laravel 通知の流れ
laravel 通知では、Notification
を実装したクラスをapp/notification
に設置し、通知内容を設定する。
同じ通知内容をmail/slack/sms など複数経路で通知するためであり、Userモデルごとに通知先をチョイスするなどを決めるためクラスに分割されている。
通知を通知経路・通知先・通知内容でわけて抽象化してある。
通知はEvent発生で実行されるため、通知とイベントは不可分の関係にある。通知ごとにクラスを作ってどこにどれだけ送信するかをクラスに書いておくわけだ。
artisan コマンドで作成
通知を実装するMyFirstNotification
と、通知を送るコード記述場所(今回はコマンド SendNotifyMailSample )を作成する。
php artisan make:notification MyFirstNotification php artisan make:command SendNotifyMailSample
コマンドのソースコード
このソースコードで、artisan notify:mail
を実行時に takuya@example.com
宛にメールを送信する。
/app/Console/Commands/SendNotifyMailSample.php
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Notification; use App\Notifications\MyFirstNotification; class SendNotifyMailSample extends Command { protected $signature = 'notify:mail';// コマンド名を指定 public function handle () { // コマンドの中身を書く Notification::route('mail','takuya@example.com') ->notify(new MyFirstNotification() ); return 0; } }
通知内容と通知先
通知クラスを作り、通知クラスがどこへ送信されるかを定義する
app/Notifications/MyFirstNotification.php
namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Messages\MailMessage; class MyFirstNotification extends Notification { use Queueable; public function via ( $notifiable ) {//通知先を指定 return ['mail']; } public function toMail($notifiable){// 通知先がmail時に実行される $msg = new MailMessage(); $msg->subject('Hello from laravel.') ->greeting('Hello') ->line('sample mail'); return $msg; } }
メール設定をする
メール設定をする。
メールに付いてのSMTP設定は .env
ファイルに記載する。
.env
MAIL_MAILER=smtp MAIL_HOST=mailcow.exmaple.com MAIL_PORT=465 MAIL_USERNAME=servie@example.com MAIL_PASSWORD=xxxP@assWroooORDxxx MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="service@example.com" MAIL_FROM_NAME="${APP_NAME}"
メールを送信する。
php artisan notify:mail
これで無事にメールが届くはずである。
メールが届かないとき
SMTPの設定が正しいかチェックする
どこでも使えるcurl コマンドなどでSMTPとの接続をテストしてから再トライ。
echo 'To: takuya@example.com From: takuya@mydomain.tld Subject: this is a test from 465 this is a test using smtps ' \ | curl -v --ssl --url 'smtps://mailcow.mydomain.tld:465' \ --mail-from service@mydomain.tld \ --mail-rcpt takuya@example.com \ --user "account@mydomain.tld:XXX_PASS_XXX" \ -T -
通知の送信ができたら
Laravel では、通知を単体で使うことはない。
通知はイベントリスナ・イベントハンドラと組み合わせ、何かが起きたときに通知する。イベント機能とあわせて使っていく。
また、その場で通知を送信するとブロッキングIOになり、レスポンス性能が悪くなるので、キューにためておいて別サーバーでワーカから送信する。キュー機能とあわせて使う。
いろんな機能があるので、組み合わせて使っていく。