Written by Manabu Bannai

Laravelでメール送信機能を実装する方法【Gmailを利用】

Laravel PROGRAMMING

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>

これでメールが送信されました( ◜◡‾)b
Laravelでメール送信機能を実装する方法

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秒で解約できます。無料登録は「こちら」です。