Laravel4、メールの送信

Tags : 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();

これで直接操作することもできます。詳細は以下のドキュメントをご覧ください。