LaravelってAPIで利用しがちなので、そうなるとメール送信機能とかも普通に作ると思うんです。
なので、一個サンプルがあると、なんかいいよね。
ってことで今回は、LaravelでMail送信のサンプルを作成してみました。
僕のプロフィールはこちら
ソースコード
ソースコードは以下にあります。
本記事執筆後、リファクタリングをしたので内容に乖離があります。
参考までに。
■GitHub
URL:「https://github.com/izumin0401/laravel-app」
Mail送信サンプル作成手順、の前に
今回は実際のメール送信まではやりません(あくまでロジックを作成するだけ)。
メールサーバもないですし、Laravelはメールドライバを「log」に設定するとメールの内容をログに出力してくれるので、ログ上で確認もできますんで。
Mail送信サンプル作成手順
早速作っていきます。
まず、メールの設定ですが、基本的には「.env」と「config/mail.php」で設定されています。
で、ソースコードを書いていく前に、.envに必要な設定を書いておきます。
.envの設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:O6KzNSTcrd9b/I1a0LTkOETCSXAW0oPGMsVJ8QlWJT4= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=pgsql DB_HOST=postgres DB_PORT=5432 DB_DATABASE=test_db DB_USERNAME=test_user DB_PASSWORD=secret BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file SESSION_LIFETIME=120 QUEUE_DRIVER=sync REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=kohei.izumi@sample.com MAIL_FROM_NAME=K.Izumi PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 |
「MAIL_FROM_ADDRESS」「MAIL_FROM_NAME」の設定を追記しました。
正味、「MAIL_FROM_NAME」はいらないんですけど、一応セットみたいなもんなんで。
平文メールの作成
Laravelでは平文メールとHTMLメールの2種類を作成できますが、HTMLみたいにこだわる理由もないので今回は平文メールを作成します。
1 2 3 |
メールが来たよーーー。 {{ $text }} |
↑が平文メールの内容になります。
メールはbladeで作成するので、当然変数の展開も可能です。
クラスの作成
Laravelには「Mailable」クラスという、メールを扱うクラスがあります。
これもphp artisanコマンドで作成できるのでサクッと作っていきます。
1 |
php artisan make:mail SampleMail |
↑で「SampleMail」というクラスを作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class SampleMail extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public function __construct() { // } /** * Build the message. * * @return $this */ public function build() { return $this->view('sample_mail') ->from(config('mail.from.address')) ->subject('メール') ->with([ 'text' => 'ぽえぽえー', ]); } } |
まあまあ適当ですが、build関数内を少し修正しました。
コントローラの作成
本来ならロジックなどはサービスに書きたいところですが、説明の便宜上、コントローラにロジックを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use App\Mail\SampleMail; class MailController extends Controller { public function __construct() { } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function store() { Mail::to('<あなたのTOアドレス>')->send( new SampleMail() ); } } |
ルーティングの設定
1 |
Route::resource('mail', 'MailController', ['only' => ['store']]); |
POSTされた時にコントーローラを呼ぶように追記しました。
1 2 3 4 5 6 7 8 |
laradock@166d6d4773e7:/var/www$ php artisan route:list +--------+----------+----------+------------+-------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+----------+------------+-------------------------------------------+------------+ | | GET|HEAD | / | | Closure | web | | | POST | api/mail | mail.store | App\Http\Controllers\MailController@store | api | | | GET|HEAD | api/user | user.index | App\Http\Controllers\UserController@index | api | +--------+----------+----------+------------+-------------------------------------------+------------+ |
こんな感じでルーティングが追加されています。
メール送信の前に
ログに出力するように設定を変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:O6KzNSTcrd9b/I1a0LTkOETCSXAW0oPGMsVJ8QlWJT4= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=pgsql DB_HOST=postgres DB_PORT=5432 DB_DATABASE=test_db DB_USERNAME=test_user DB_PASSWORD=secret BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file SESSION_LIFETIME=120 QUEUE_DRIVER=sync REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=log MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=kohei.izumi@sample.com MAIL_FROM_NAME=K.Izumi PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 |
「MAIL_DRIVER」を「log」にすることで、ログにメールの内容が出力されます。
メール送信
上記のようにPOSTで送信したら、200が返ってきました。
1 2 3 4 5 6 7 8 9 10 11 12 |
[2020-03-08 04:39:15] local.DEBUG: Message-ID: <d122227a234ec3002a03f65170e6eb85@localhost> Date: Sun, 08 Mar 2020 04:39:13 +0000 Subject: =?utf-8?Q?=E3=83=A1=E3=83=BC=E3=83=AB?= From: kohei.izumi@sample.com To: <あなたのTOアドレス> MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable メールが来たよーーー。 ぽえぽえー |
ログにも正しく出力されていますね。
完璧!
おすすめ書籍
僕はLaravelの勉強をするのに以下の書籍を購入しました。おすすめですよ!
まとめ
Laravelでメールの機能作るのって簡単ですね。
何よりドライバを「log」にすると、ログにメールの内容が出力されるっていうのが素敵ですね。
ではさいなら。