Laravelのswiftmailerでメール送信

Laravelでメールを送信するには、Bundle版を使用する必要があります。Laravel4からは標準で装備されるみたいですが、現状ではBundel版を使用する必要があります。今日は数あるBundel版の中でもLaravelの開発者でもあるTaylor氏が作成したswiftmailerの設定方法を調べてみたいと思います。

ZIPファイルでダウンロード

1. まず下記のサイトへ行き、右上のGitHubのリンク文字をクリックします。

http://bundles.laravel.com/bundle/swiftmailer

2. ZIPボタンをクリックして、Zipファイルをダウンロードします。

3. 解凍したフォルダswiftmailer-masterの名称をswiftmailerに変更します。

4. 名称変更したswiftmailerのフォルダごとlaravel/buldlesフォルダの中にコピー又は移動します。

Artisanコマンドによるインストール

5. LaravelのArtisanコマンドを利用すると上記のインストールを簡単にすることが出来ます。

6. Artisanコマンドを使ったXamppでのインストール例を記述しておきます。

7. まずコマンドプロンプトを立ち上げます。phpへのパスは通っている(Windowsの環境変数に登録されている)ものとして説明いたします。パスの通し方が分からない方は、『CakePHP2.0でbakeによるアプリケーションの作成』の20)以下を参照して下さい。

8. ローカルのartisanファイルがあるフォルダまで移動します。

cd c:\xampp\htdocs\laravel

9. そして下記のコマンドを入力するだけです。

php artisan bundle:install swiftmailer

10. 上記の1~4迄の作業が簡単に終了します。

バンドルの登録

11. 次にバンドルを自動スタートするように登録します。application/bundles.phpファイルを開き、下記のように登録します。4行目が今回の追加登録分です。

laravel/application/bundles.php

return array(
'docs' => array('handles' => 'docs'),
 'admin' => array('handles' => 'admin'),
 'swiftmailer'=>array('auto'=>true),
);

Gmailでメール送信設定

12. swiftmailerはデフォルトでPHPmailerに設定されていますので、Gmailでメール送信するように変更してみましょう。bundles/swiftmailerフォルダのstart.phpの38行目から41行目の部分が送信手段です。

laravel/bundles/swiftmailer/start.php

Laravel\IoC::register('mailer.transport', function()
{
 return Swift_MailTransport::newInstance();
});

13. 上記の3行目(実際のファイルの40行目)を下記のように変更します。

//メール送信をGmaiに設定
 return Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
 ->setUsername(' winroad@gmail.com')
 ->setPassword('winroad1234');

setUsernameにご自身が取得しているGmailアドレス、setPasswordにGmailアドレスのパスワードを指定します。

14. それでは、実際にメールを送信するためのプログラムを作成してみましょう。メール送信用のビューファイルを下記のように作成します(テストですのでhelloフォルダの中に作成します)。

laravel/application/views/hello/sendmail.blade.php

@layout('layouts.master')
@section('content')
{{ Form::open(URL::current(),'POST',array('class'=>'form-horizontal')) }}
<fieldset>
<div class="control-group">
{{ Form::label('name','送信先名',array('class'=>'control-label')) }}
<div class="controls">
 {{ Form::text('name',Input::old('name')) }}
 {{ $errors->has('name') ? $errors->first('name','<p><span class="label label-important">:message</span></p>') : '' }}
</div>
</div>
<div class="control-group">
{{ Form::label('email','送信先Eメール',array('class'=>'control-label')) }}
<div class="controls">
 {{ Form::text('email',Input::old('email')) }}
 {{ $errors->has('email') ? $errors->first('email','<p><span class="label label-important">:message</span></p>') : '' }}
</div>
</div>
<div class="control-group">
{{ Form::label('subject','件名',array('class'=>'control-label')) }}
<div class="controls">
 {{ Form::text('subject',Input::old('subject')) }}
 {{ $errors->has('subject') ? $errors->first('subject','<p><span class="label label-important">:message</span></p>') : '' }}
</div>
</div>
<div class="control-group">
{{ Form::label('body','本文',array('class'=>'control-label')) }}
<div class="controls">
{{ Form::textarea('body','',array('rows'=>'3','class'=>'span6','placeholder'=>'メール本文を記述して下さい')) }}
 {{ $errors->has('body') ? $errors->first('body','<p><span class="label label-important">:message</span></p>') : '' }}
</div>
</div>
<div class="form-actions">
{{ Form::submit('メール送信',array('class'=>'btn btn-primary')) }}
</div>
</fieldset>
{{ Form::close() }}
@endsection

15. helloコントローラにsendmailアクションを作成します。

 laravel/application/controllers/hello.php

//Gメールでメール送信
 public function action_sendmail(){
 if($inputs=Input::all()){
 //バリデーションルールの定義
 $rules=array(
 'name'=>'required|max:100',
 'email'=>'required|email',
 'subject'=>'required',
 'body'=>'required',
 );
 //バリデーションのインスタンス化
 $val=Validator::make($inputs,$rules);
 //バリデーションNGなら
 if($val->fails()){
 //セッションにエラーと入力値を退避する
 return Redirect::back()
 ->with_errors($val)
 ->with_input();
 }else{
 //IoCコンテナの取得
 $mailer=IoC::resolve('mailer');
 //swiftmailerのインスタンス化
 $message=Swift_Message::newInstance()
 //メール送信元のセット
 ->setFrom(array(
 'nakada@winroad.info'=>'WinRoad徒然草'))
 //メール送信先のセット
 ->setTo(array(
 Input::get('email')=>Input::get('name')))
 //件名のセット
 ->setSubject(Input::get('subject'))
 //メール本文のセット
 ->setBody(Input::get('body'),'text/html');
 //メッセージの送信
 $mailer->send($message);
 }
 }
 return View::make('hello/sendmail');
 }

16. それでは、実際にメールを送信してみましょう。

http://localhost/laravel/public/hello/sendmail

17. 下記のようなメールが届きました。

Gmailはネットに繋がっている状態なら、どこからでもメール送信できますので、便利ですね。ローカルでメールサーバーを設定していない状態でも簡単にメールが送信できます。Google様々です。

sendmailでメール送信

18. sendmailでメール送信するには、7.の箇所を下記のように変更します。

//メールをsendmailに設定
 return Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

sendmailのパスは各レンタルサーバーによって若干異なりますので、各自のレンタルサーバーでパスを調べて下さい。

19. レンタルサーバーからsendmailを使ってメールを送信してみましょう。

http://laravel.trial.jp/hello/sendmail

20. 心配した文字化けもなくメールが送信されました。

本日はLaravel公式サイト翻訳者の川瀬氏のブログコレ1Serverの情報を元にswiftmailerでメール送信の設定を致しました。川瀬氏のブログには他にも詳しい情報が掲載されていますので、ぜひ立ち寄ってみて下さい。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

トラックバック

  1. […] 参考サイト:Laravelのswiftmailerでメール送信 [↩] […]

コメント

  1. HiroKws より:

    紹介有り難うございました。

    ちょっとしたヒントですが、登録の確認などの定形メールの場合、本文をビューで用意しておき、render(ビュー名, $data)で文字列に変換するとごちゃごちゃしなくて便利です。まあ、他のフレームワークでもおなじみな手法ですね。Laravel4でもっと進化することを願っています。

    Laravel4で標準装備されるのもSwiftmailerですので、今回の知識は役に立ちそうですね。

    • nakada より:

      コメントありがとうございます。

      機会があったら定型メール送信の実践例などもブログで取り上げたいと思います。
      これからもよろしくお願いいたします。


コメントをどうぞ

このページの先頭へ