Laravel4、メールの送信
タグ: Laravel4
メール送信です。Laravel4から、メールはフレームワークに取り込まれました。
メールを送信するには、まず設定ファイルのapp/config/mail.phpを変更してください。
お手軽にGmailをSMTPサーバーとして利用する場合は、以下のように設定します。
<?php return array( 'driver' => 'smtp', 'host' => 'smtp.gmail.com', 'port' => 587, 'from' => array('address' => 'お好みで!', 'name' => 'お好みで!'), 'encryption' => 'tls', 'username' => 'ユーザー名@gmail.com', 'password' => '自分のアドレスのパスワード', );
これで準備は完了です。(私の場合OSをアップデートするため入れ替えたのを忘れていてPHPのopenssl拡張を有効にしておらず、数時間悩みました。)
送信するメールの内容はビューとして作成します。既にemailsフォルダーが存在していますので、その中に作成するのがお手軽です。例えば、app/views/emails/test.blade.phpを作成してみましょう。
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="utf-8"> </head> <body> <h2>テストメール</h2> <div> こんばんは{{ $user }}さん。 HTMLメールです。<br><br> </div> </body> </html>
ビューですから、変数を渡し、その内容を含めることができます。
あとは、メールを送信するだけです。
Mail::send( 'emails.test', array('user'=>'ミスター'), function ($e) { $e->to( 'hiro.soft@gmail.com', '川瀬さん' ) ->from( 'admin@kore1server.com', '管理者' ) ->subject( '日本語タイトル' ); } );
UTF-8で送信の場合、これだけです。
ISO-2202-JPでの送信
さて、消えてしまった以前の記事ではSwiftmailerを使用し、ISO-2202−JPで送信する方法を紹介しました。ちょうど、Swiftmailerに日本人の方のコミットが取り込まれた直後に書いたものです。
その時の最新版を使用しても、公式ドキュメントおよび方法の紹介記事通りに行なっても、本文だけは正しく送信されていましたが、タイトルと送信者のエンコードが指定されていないため、文字化けしていました。たぶん、紹介記事は開発版を基に書かれたものだったのでしょう。
現在、Laravelに取り込まれているものも、最新開発板のようです。試したところ、タイトルと送信者のエンコード指定もきちんとされており、使用できるようになっています。
方法を紹介しておきます。まあ、ガラゲー対策なんでしょうね。私は今のところ使用する予定はありません。:D
まず、準備のためのコードをフレームワークに書きましょう。場所は、セットアップにサービスプロバイダーを使用している方は、そのサービスプロバイダーに書いてください。小さいアプリで使用されない方は、start/global.phpが適しているかと思います。
// Swiftmailer ISO-2022-JP対応 \Swift::init( function () { \Swift_DependencyContainer::getInstance() ->register( 'mime.qpheaderencoder' ) ->asAliasOf( 'mime.base64headerencoder' ); \Swift_Preferences::getInstance()->setCharset( 'iso-2022-jp' ); } );
サービスプロバイダーに記述する前提で、クラス名の先頭にバックスラッシュ/円記号がついています。
あとは、送信する時にエンコードを指定します。
Mail::send( 'emails.test', array( 'user' => 'ミスター' ), function ($e) { $e->to( 'hiro.soft@gmail.com', '川瀬さん' ) ->subject( '日本語タイトル' ) ->setCharset( 'iso-2022-jp' ) ->setEncoder( new \Swift_Mime_ContentEncoder_PlainContentEncoder( '7bit' ) ); } );
ビューは通常通りUTF-8のまま作成してください。Swiftmailerがコード変換を行います。ただし、HTMLメールの場合はcharsetで指定するコードをISO-2202-JPへ変更しましょう。
Laravelのメッセージクラスは、SwiftmailerのSwift_Messageを使用しています。実際、LaravelのMailクラスは関数名をキャメル記法にするための、ラッパークラスのようなものです。
Swift_Messageクラスインスタンスの獲得は以下の方法です。
$message = getSwiftMessage();
これで直接操作することもできます。詳細は以下のドキュメントをご覧ください。