Laravel3 を WebMatrix3 で開発しロリポップで公開する no.16 【メールの送信 <- コレ重要】

今回は Laravel3 でのメール送信を試みてみようと思います。

Laravel3 はそのままではメール送信を行うために快適な仕組みは用意されていません。しかし、有志の方々が用意してくれているバンドルという仕組みがあります。これは Laravel3 版の pear のようなもので、便利な機能が既に色々と用意されています。ちなみに コントローラなどを配置している application 自体もバンドルの一つで、デフォルトで呼び出される特別なバンドルとなっています。

ここではメール送信に swiftmailer を使ってみようと思います。 Laravel の開発者でもある Taylor氏が作成した1らしいです。まずコマンドプロンプトで、現在のプロジェクト内の artisan ファイルが有るところまで移動します。そして下記のコマンドを実行してください。

~\\laravel3> php artisan bundle:install swiftmailer

下記のようなメッセージが表示されれば成功です。

Fetching [swiftmailer]...done! Bundle installed.

それでは、このバンドルを使ってユーザー登録時に、登録完了メールを送信して見ましょう。

application/bundles.php を編集します。最後のほうで、配列をリターンしてます。要素に下記の内容を追加してください。

\'swiftmailer\' => array(\'auto\' => true),

signup.php コントローラを以下のように修正しました。

<?php

class Signup_Controller extends Base_Controller
{
    public $restful = TRUE;

    public function __construct()
    {
        parent::__construct();
        $this->filter(\'before\', \'csrf\')->on(\'post\');
    }

    public function get_index()
    {
        return View::make(\'signup/index\');
    }

    public function post_index()
    {
        $rules = array(
            \'email\'    => \'required|email|unique:authentication\',
            \'password\' => \'required|confirmed\',
        );

        $v = Validator::make(Input::get(), $rules);
        if ($v->fails())
        {
            return Redirect::to(\'signup\')->with(\'signup_errors\', true);
        }
        else
        {
            $data = array(
                \'email\' => Input::get(\'email\'),
                \'password\' => Input::get(\'password\'),
                \'role\' => 1,
            );
            
            $message = \'\';
            try
            {
                $auth = Authentication::create($data);
                $message = \'登録完了\';

                $body = View::make(\'template_of_mails.signup\')->with(\'email\', Input::get(\'email\'))->render();

                $mailer = IoC::resolve(\'mailer\');
                $messages = Swift_Message::newInstance(\'Laravel3 テストサイトへのご登録ありがとうございます!\')
                                ->setFrom(array(\'info@laravel3.issuy.net\'=>\'Laravel3 管理事務局\'))
                                ->setTo(array(Input::get(\'email\')))
                                ->setBody($body,\'text/plain\');

                $mailer->send($messages);
            }
            catch (Exception $e)
            {
                $message = \'登録失敗\';
            }

            return Redirect::to(\'signup/finish\')->with(\'message\', $message);
        }
    }

    public function get_finish()
    {
        return View::make(\'signup/finish\');
    }
}

メール用のビューを新たに用意し、それを render() することでテキストとして取得します。これをメッセージの本文として扱います。

Swift Mailer のオートロードを有効にしてますので、起動時に IoC コンテナに Swift Mailer が mailer として登録されているので取得します。Swift_Message クラスに各種メールの設定項目を入力してメーラーオブジェクトの send() の引数として渡せばメールが送信されます。

今回新たに作成した template_of_mails/signup.blade.php の内容は下記のとおりです。

 

やあ {{ $email }} さん

登録してくれてありがとう!
是非とも下記の URL からログインしてくれたまえ!

{{ url(\'login\') }}


それでは待ってます!

url(‘login’) でログインページのアドレスを表示させたかったのですが、本番環境でも URL に index.php が含まれてしまったので、 config/applications.php の index の項目を空文字に変更しました。

メールの送信についてですが、Windows 環境では送信されません(少なくとも現在の設定では)。確認はロリポップ環境上でご確認ください。

それでは今回はここまで。

  1. 参考サイト:Laravelのswiftmailerでメール送信 []
カテゴリー: Laravel3, Web, WebMatrix, ロリポップ タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です