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();
これで直接操作することもできます。詳細は以下のドキュメントをご覧ください。