Laravel 5.2 メール

イントロダクション

Laravelは人気の高いSwiftMailerライブラリーのクリーンでシンプルなAPIを提供しています。SMTP、Mailgun、Mandrill、SparkPost、Amazon SES、PHPのmail機能、sendmailドライバーを提供しており、選択したローカルやクラウドベースのサービスを使い、素早くメール送信が開始できるようにしています。

ドライバの動作要件

MailgunとMandrillなどAPIベースドライバはシンプルでSMTPサーバーよりも高速です。APIドライバは全てGuzzle HTTPライブラリーをアプリケーションにインストールする必要があります。以下の行をcomposer.jsonファイルに追加し、Guzzle 5をプロジェクトに追加してください。

"guzzlehttp/guzzle": "~5.3|~6.0"

Mailgunドライバ

Mailgunドライバを使用する場合、最初にGuzzleをインストールしてください。それからconfig/mail.php設定ファイル中のdriverオプションをmailgunに設定してください。次にconfig/services.php設定ファイルが以下のオプションを含んでいるか確認してください。

'mailgun' => [
    'domain' => 'your-mailgun-domain',
    'secret' => 'your-mailgun-key',
],

Mandrillドライバ

Mandrillドライバを使用するには、最初にGuzzleをインストールし、次にconfig/mail.php設定ファイル中のdriverオプションをmandrillに設定してください。それからconfig/services.php設定ファイルに以下のオプションが含まれているか確認してください。

'mandrill' => [
    'secret' => 'your-mandrill-key',
],

SparkPostドライバ

SparkPostドライバを使用するには、最初にGuzzleをインストールし、次にconfig/mail.php設定ファイル中のdriverオプションをsparkpostに設定してください。config/services.php設定ファイルに以下のオプションが含まれているか確認してください。

'sparkpost' => [
    'secret' => 'your-sparkpost-key',
],

SESドライバ

Amazon SESドライバを使う場合、Amazon AWS SDK for PHPをインストールしてください。composer.jsonファイルのrequireセクションに以下の行を追加し、このライブラリーをインストールします。

"aws/aws-sdk-php": "~3.0"

次にconfig/mail.php設定ファイルのdriverオプションをsesに設定します。それからconfig/services設定ファイルが以下の内容になっているか確認してください。

'ses' => [
    'key' => 'your-ses-key',
    'secret' => 'your-ses-secret',
    'region' => 'ses-region',  // e.g. us-east-1
],

メール送信

Laravelではメールのメッセージをビューとして保存します。たとえばメールを系統立てて利用するためにresources/viewsディレクトリにemailsディレクトリを作成することができます。

メッセージを送るにはMailファサードsendメソッドを使います。sendメソッドは3つの引数を取ります。第1引数はメールの内容を含んでいるビューの名前です。第2引数はビューに渡すデータの配列です。第3引数はメッセージインスタンスを受け取る「クロージャ」のコールバックで、受信者や主題、もしくは他のメールの項目をカスタマイズできます。

<?php

namespace App\Http\Controllers;

use Mail;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * ユーザーにメールでリマインダーを送信
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function sendEmailReminder(Request $request, $id)
    {
        $user = User::findOrFail($id);

        Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
            $m->from('hello@app.com', 'Your Application');

            $m->to($user->email, $user->name)->subject('Your Reminder!');
        });
    }
}

上の例ではuserキーを含んだ配列を渡していますので、以下のPHPコードにより、メールの中にユーザ名を挿入することができます。

<?php echo $user->name; ?>

注目: $message変数はいつもメールのビューに渡され、添付のインライン埋め込みが行えます。そのためビュー本体にmessage変数を渡す必要はありません。

メッセージの組み立て

前述の通り、sendメソッドの第3引数は「クロージャ」で、メールの様々なオプションを指定できます。このクロージャを使用しCCやBCCなどメッセージの他の属性を指定することもできます。

Mail::send('emails.welcome', $data, function ($message) {
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com')->cc('bar@example.com');
});

$messageメッセージビルダで使用できるメソッドの一覧です。

$message->from($address, $name = null);
$message->sender($address, $name = null);
$message->to($address, $name = null);
$message->cc($address, $name = null);
$message->bcc($address, $name = null);
$message->replyTo($address, $name = null);
$message->subject($subject);
$message->priority($level);
$message->attach($pathToFile, array $options = []);

// $data文字列をそのまま付属ファイルへ
$message->attachData($data, $name, array $options = []);

// 裏で動作するSwiftMailerメッセージインスタンスの取得
$message->getSwiftMessage();

注目: Mail::sendクロージャに渡されるメッセージインスタンスは、SwiftMailerメッセージクラスを拡張していますので、メールメッセージを構築するためにこのクラスのメソッドを呼び出すことができます。

平文のメール

デフォルトでsendメッソッドに指定するビューはHTMLで構成されているでしょう。しかしsendメソッドの第1引数として配列を指定すると、HTMLビューに加えて平文テキストビューを指定できます。

Mail::send(['html.view', 'text.view'], $data, $callback);

もしくは平文テキストメールだけを送る必要があるなら、配列でtextキーを指定することもできます。

Mail::send(['text' => 'view'], $data, $callback);

ロウ(raw)文字列

文字列を直接そのままメールしたい場合は、rawメソッドを使ってください。

Mail::raw('Text to e-mail', function ($message) {
    //
});

添付

メールに添付する場合は、クロージャに渡される$messageオブジェクトのattachメソッドを使用します。attachメソッドでは最初の引数としてファイルの完全パスを指定します。

Mail::send('emails.welcome', $data, function ($message) {
    //

    $message->attach($pathToFile);
});

ファイルをメッセージ添付する場合、attachメソッドの第2引数として配列を渡し、表示名やMIMEタイプを指定することもできます。

$message->attach($pathToFile, ['as' => $display, 'mime' => $mime]);

attachDataメソッドははロウ文字列のバイトを添付するために使用します。たとえば、PDFをメモリ上で生成し、ディスクに書き出さすに添付したい場合に利用できます。

$message->attachData($pdf, 'invoice.pdf');

$message->attachData($pdf, 'invoice.pdf', ['mime' => $mime]);

インライン添付

メールのビューに画像を埋め込む

メールに画像をインラインで埋め込むことは典型的な厄介事です。しかしLaravelは画像をメールに付け、最適なCIDを得る便利な方法を提供しています。インラインイメージを埋め込むには、メールビューの中で$message変数のembedメソッドを使ってください。Laravelは全メールビューで自動的に$message変数を使用できるようにしていることを思い出してください。

<body>
    ここに画像:

    <img src="<?php echo $message->embed($pathToFile); ?>">
</body>

メールのビューにロウ(raw)データーを埋め込む

メールメッセージへ埋め込む生データ文字列を既に用意してある場合は、$messageembedDataメソッドを使ってください。

<body>
    ここにロウデータからの画像:

    <img src="<?php echo $message->embedData($data, $name); ?>">
</body>

キュー使用メール

メールメッセージのキューイング

メール送信はアプリケーションのレスポンスをとても遅くしてしまうため、多くの開発者はメールメッセージをバックグラウンドでキュー送信するようにしています。Laravelでは組み込みの共通キューAPIを使用することで、簡単に取り扱えるようになっています。メールメッセージをキューに投入するには、Mailファサードのqueueメソッドを使用するだけです。

Mail::queue('emails.welcome', $data, function ($message) {
    //
});

このメソッドはバックグラウンドでメールを送信するため、自動的にジョブをキューに投入する面倒を見ます。もちろんこの機能を使用する前にキューの設定を行う必要があります。

遅延メッセージキュー

キューに投入したメールメッセージを送らせて配信したい場合はlaterメソッドを使用してください。メソッドの最初の引数として、メッセージ送信を遅らせたい秒数を指定するだけです。

Mail::later(5, 'emails.welcome', $data, function ($message) {
    //
});

特定のキューに投入

メッセージを投入するキューを指定したい場合、queueOnlaterOnメソッドを使用します。

Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) {
    //
});

Mail::laterOn('queue-name', 5, 'emails.welcome', $data, function ($message) {
    //
});

メールとローカル開発

メールを送信するアプリケーションを開発している間は、実際のメールアドレスにメールを送信したくはありません。Laravelはメールメッセージを実際に送信することを「無効」にする、様々な方法を用意しています。

Logドライバ

一つの解決方法は、ローカルでの開発期間中にlogメールドライバを使用することです。このドライバは確認できるように全メールメッセージをログに書き込みます。環境ごとのアプリケーションの設定についての情報は、設定のドキュメントで確認してください。

全メールの送信先指定

Laravelが提供するもう一つの解決策は、フレームワークが送信する全メールの共通受け取り先を設定する方法です。この方法を使うと送信メッセージに指定した実際のアドレスの代わりに、アプリケーションが送る全メールを特定のアドレスに送信します。この方法を使用する場合、config/mail.php設定ファイルでtoオプションを指定します。

'to' => [
    'address' => 'dev@domain.com',
    'name' => 'Dev Example'
],

Mailtrap

最後の方法はMailtrapのようなサービスを使い、smtpドライバで本当のメールクライアントにより内容を確認できる「ダミー」のメールボックスへメールメッセージを送る方法です。このアプローチの利点は最終的なメールをMailtrapのメッセージビュアーで実際に確認できることです。

イベント

Laravelはメールメッセージを送信する直前に、イベントを発行します。このイベントは、メールが送られる場合に発行されますが、キューイングされる場合には発行されないことに留意してください。EventServiceProviderへ、イベントリスナーを登録します。

/**
 * アプリケーションへマッピングするイベントリスナー
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Mail\Events\MessageSending' => [
        'App\Listeners\LogSentMessage',
    ],
];

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる