Laravelでメール送信機能を実装する方法【Gmailを利用】
Laravelでメール送信機能を実装する方法をまとめました。
コードはgithubに公開しているので自由にご利用ください。
manabubannai/Laravel_Mailers
LaravelでGmailを使ってメール送信するための初期設定
編集ファイル:app/config/mail.php
'host' => 'smtp.gmail.com',
'from' => array('address' => 'あなたのメールアドレス', 'name' => 'あなたの名前'),
'username' => 'あなたのGmail',
'password' => 'パスワード',
以上でセットアップが終了です。
Laravelでメールを送信してみましょう。
Laravelでメール送信機能を使ってみる
メール送信関数の文法はつぎの通りです
Mail('ビュー', 'ビューにわたすデータ','送信先の情報');
では、routes.php
で実験をしてみます。
編集ファイル:app/routes.php
Route::get('/', function(){
// 現状はわたすデータがないのでエンプティーアレイをわたします
$data = [];
Mail::send('emails.welcome', $data, function($message){
$message->to('[email protected]')
->subject('ここがタイトルです');
});
});
つぎにビューを作ります。
新規作成ファイル:app/views/emails/welcome.blade.php
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>Laravelでメール送信</title>
</head>
<body>
メール送信しました( ◜◡‾)
</body>
</html>
Laravelのメール送信機能を拡張性のあるコードに作り直していく
現状のままではハードコーディングが多すぎて拡張性がありませんね。
なので、コードを修正していきます。
まず、Mailer.php
を作成します。
新規作成ファイル:app/mailers/Mailer.php
<?php namespace AcmeMailers;
class Mailer{
public function sendTo(){
Mail::send('emails.welcome', $data, function($message){
$message->to('[email protected]')
->subject('ここがタイトルです');
});
}
}
このままではハードコーディングが多いので、つぎのとおりに作り替えます。
public function sendTo( $user, $subject, $view, $data =[] ){
Mail::send($view, $data, function($message) use($user, $subject){
$message->to($user->email)
->subject($subject);
});
}
コードの見栄えがよくなりました。
では、このメソッドを呼び出せるようにします。
編集ファイル:app/routes.php
<?php
Route::resource('users', 'UsersController');
// Route::get('/', function(){
// // 現状はわたすデータがないのでエンプティーアレイをわたします
// $data = [];
// Mail::send('emails.welcome', $data, function($message){
// $message->to('[email protected]')
// ->subject('ここがタイトルです');
// });
// });
UsersControllerをscaffoldします。
$ php artisan controller:make UsersController
出来上がったUsersControllerをつぎのとおりに編集します。
まずは、Mailerクラスを参照できるようにします。
<?php
use AcmeMailersMailer;
class UsersController extends BaseController {
protected $mailer;
public function __construct(Mailer $mailer){
$this->mailer = $mailer;
}
その後、storeメソッドで実行処理を書きます。
public function store(){
$user = []; //わたすデータがないのでエンプティーアレイ
$this->mailer->sendTo($user, 'ここがタイトルです', 'emails.welcome', []);
}
このままでも十分使えますが、さらに拡張性を高めていきます。
Laravelのメール送信機能に抽象クラスを使う
まず、UserMailer.php
を作成してください
つぎに、Mailer.php
にネームスペースとabstractとを追加します。
<?php namespace AcmeMailers;
Use User;
class UserMailer extends Mailer{
public function welcome(User $user){
$view = 'emails.welcome';
$data = [];
$subject = 'メールのタイトルです';
return $this->sendTo($user, $subject, $view, $data);
}
}
つづいてにUserMailer.php
をつぎのように作成します。
<?php namespace AcmeMailers;
Use User;
class UserMailer extends Mailer{
public function welcome(User $user){
$view = 'emails.welcome';
$data = [];
$subject = 'メールのタイトルです';
return $this->sendTo($user, $subject, $view, $data);
}
}
さいごにcomposer.php
をつぎのように書き換えます
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/mailers"
]
その後、コンポーザーをダンプします。
$ composer dump
それでは、上記設定を実行できるようにUsersControllerを書き換えていきましょう。
<?php
use AcmeMailersUserMailer as Mailer;
public function store(){
$user = User::find(1);
$this->mailer->welcome($user);
}
上記のままでは、User::find(1);
でエラーが発生します。
User::find(1);
動作させるために、ユーザーDBを作ります。
$ php artisan migrate:make create_users_table --create=users
生成されたファイルにつぎのように記述します。
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('email')->unique();;
$table->string('password');
$table->timestamps();
});
}
public function down()
{
Schema::drop('users');
}
マイグレートします( ◜◡ ̄)
$ php artisan migrate
tinkerでDBにユーザーを追加します。
$ php artisan tinker
>$user = new User;
>$user->email = 'あなたのEmail';
>$user->password = Hash::make('1234');
>$user->save();
>dd(User::first()->toArray());
array(4) {
["id"]=>
string(1) "1"
["email"]=>
string(20) "あなたのEmail"
["created_at"]=>
string(19) "2014-10-13 10:36:37"
["updated_at"]=>
string(19) "2014-10-13 10:36:37"
}
これで、ユーザーテーブルと情報の挿入が完了しました。
さいごにroutes.php
を書き換えておわりです。
Route::get('users/store', 'UsersController@store');
Route::resource('users', 'UsersController');
以上となります。
参考になれば幸いです。
※コード:manabubannai/Laravel_Mailers
※参考:Mailers
photo credit: kevin dooley via photopin cc
※P.S:無料メルマガで発信中:過去の僕は「ブログ発信で5億円」を稼ぎました。次は「30億円」を目指します。挑戦しつつ、裏側の思考を「メルマガ」から発信します。不満足なら1秒で解約できます。無料登録は「こちら」です。