メインコンテンツまでスキップ

メール

はじめに

メールの送信は複雑である必要はありません。Laravel は、人気のある Symfony Mailer コンポーネントを利用したクリーンでシンプルなメール API を提供しています。Laravel と Symfony Mailer は、SMTP、Mailgun、Postmark、Resend、Amazon SES、および sendmail を介してメールを送信するためのドライバーを提供しており、選択したローカルまたはクラウドベースのサービスを通じて迅速にメールの送信を開始できます。

構成

Laravelのメールサービスは、アプリケーションの config/mail.php 構成ファイルを介して設定することができます。このファイル内で構成された各メーラーは、独自の構成や独自の "トランスポート" を持つことができ、アプリケーションは特定のメールメッセージを送信するために異なるメールサービスを使用することができます。たとえば、アプリケーションは、トランザクションメールを送信するために Postmark を使用し、一方で大量のメールを送信するために Amazon SES を使用するかもしれません。

mail 構成ファイル内には、mailers 構成配列が含まれています。この配列には、Laravel でサポートされている主要なメールドライバー/トランスポートの各サンプル構成エントリが含まれており、default 構成値は、アプリケーションがメールメッセージを送信する必要があるときにデフォルトで使用されるメーラーを決定します。

ドライバー/トランスポートの前提条件

Mailgun、Postmark、Resend、MailerSend などの API ベースのドライバーは、SMTP サーバー経由でメールを送信するよりも簡単で高速です。可能な限り、これらのドライバーのいずれかを使用することをお勧めします。

Mailgun ドライバー

Mailgun ドライバーを使用するには、Composer を介して Symfony の Mailgun Mailer トランスポートをインストールしてください:

composer require symfony/mailgun-mailer symfony/http-client

次に、アプリケーションの config/mail.php 構成ファイルで default オプションを mailgun に設定し、次の構成配列を mailers 配列に追加してください:

    'mailgun' => [
'transport' => 'mailgun',
// 'client' => [
// 'timeout' => 5,
// ],
],

アプリケーションのデフォルトメーラーを構成した後、config/services.php 構成ファイルに次のオプションを追加してください:

    'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
'scheme' => 'https',
],

米国の Mailgun リージョン を使用していない場合は、services 構成ファイルでリージョンのエンドポイントを定義することができます:

    'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.eu.mailgun.net'),
'scheme' => 'https',
],

Postmark ドライバー

Postmark ドライバーを使用するには、Composer を介して Symfony の Postmark Mailer トランスポートをインストールしてください:

composer require symfony/postmark-mailer symfony/http-client

次に、アプリケーションの config/mail.php 設定ファイルで default オプションを postmark に設定します。アプリケーションのデフォルトメーラーを設定した後、config/services.php 設定ファイルに次のオプションが含まれていることを確認してください:

    'postmark' => [
'token' => env('POSTMARK_TOKEN'),
],

特定のメーラーで使用する Postmark メッセージストリームを指定する場合は、メーラーの設定配列に message_stream_id 構成オプションを追加できます。この構成配列は、アプリケーションの config/mail.php 設定ファイルで見つけることができます:

    'postmark' => [
'transport' => 'postmark',
'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
// 'client' => [
// 'timeout' => 5,
// ],
],

これにより、異なるメッセージストリームを持つ複数の Postmark メーラーを設定できます。

Resend ドライバー

Resend ドライバーを使用するには、Composer を介して Resend の PHP SDK をインストールしてください:

composer require resend/resend-php

次に、アプリケーションの config/mail.php 設定ファイルで default オプションを resend に設定します。アプリケーションのデフォルトメーラーを設定した後、config/services.php 設定ファイルに次のオプションが含まれていることを確認してください:

    'resend' => [
'key' => env('RESEND_KEY'),
],

SES ドライバー

Amazon SES ドライバーを使用するには、まず Amazon AWS SDK for PHP をインストールする必要があります。このライブラリは Composer パッケージマネージャを介してインストールできます:

composer require aws/aws-sdk-php

次に、config/mail.php 設定ファイルで default オプションを ses に設定し、config/services.php 設定ファイルに次のオプションが含まれていることを確認してください:

    'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],

AWS の 一時的な資格情報 をセッショントークンを介して利用するには、SES 構成の token キーをアプリケーションの SES 構成に追加できます:

    'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'token' => env('AWS_SESSION_TOKEN'),
],

SES の 購読管理機能 とやり取りするには、メールメッセージの headers メソッドで返される配列に X-Ses-List-Management-Options ヘッダーを返すことができます。

/**
* Get the message headers.
*/
public function headers(): Headers
{
return new Headers(
text: [
'X-Ses-List-Management-Options' => 'contactListName=MyContactList;topicName=MyTopic',
],
);
}

電子メールを送信する際にLaravelがAWS SDKのSendEmailメソッドに渡す追加オプションを定義したい場合は、ses構成内にoptions配列を定義することができます:

    'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'options' => [
'ConfigurationSetName' => 'MyConfigurationSet',
'EmailTags' => [
['Name' => 'foo', 'Value' => 'bar'],
],
],
],

MailerSend ドライバ

MailerSendは、トランザクションメールおよびSMSサービスで、Laravel用のAPIベースのメールドライバを提供しています。このドライバを含むパッケージはComposerパッケージマネージャを介してインストールできます:

composer require mailersend/laravel-driver

パッケージをインストールしたら、アプリケーションの.envファイルにMAILERSEND_API_KEY環境変数を追加してください。さらに、MAIL_MAILER環境変数をmailersendと定義する必要があります:

MAIL_MAILER=mailersend
MAIL_FROM_ADDRESS=app@yourdomain.com
MAIL_FROM_NAME="App Name"

MAILERSEND_API_KEY=your-api-key

最後に、アプリケーションのconfig/mail.php構成ファイルにMailerSendをmailers配列に追加してください:

'mailersend' => [
'transport' => 'mailersend',
],

MailerSendの詳細やホストされたテンプレートの使用方法などについては、MailerSendドライバのドキュメントを参照してください。

フェイルオーバー構成

時々、アプリケーションのメールを送信するために構成した外部サービスがダウンすることがあります。このような場合、プライマリデリバリードライバがダウンした場合に使用される1つ以上のバックアップメール配信構成を定義すると便利です。

これを実現するために、アプリケーションのmail構成ファイル内で、failoverトランスポートを使用するメーラーを定義する必要があります。アプリケーションのfailoverメーラーの構成配列には、配信に選択される構成されたメーラーの順序を参照するmailersの配列を含める必要があります:

    'mailers' => [
'failover' => [
'transport' => 'failover',
'mailers' => [
'postmark',
'mailgun',
'sendmail',
],
],

// ...
],

フェイルオーバーメーラーを定義したら、アプリケーションで使用するデフォルトメーラーとしてこのメーラーを設定するために、アプリケーションのmail構成ファイル内のdefault構成キーの値としてその名前を指定する必要があります:

    'default' => env('MAIL_MAILER', 'failover'),

ラウンドロビン構成

roundrobin トランスポートを使用すると、メーリングの作業負荷を複数のメーラーに分散することができます。始めるには、アプリケーションの mail 構成ファイル内で roundrobin トランスポートを使用するメーラーを定義します。アプリケーションの roundrobin メーラーの構成配列には、配信に使用する構成済みメーラーを参照する mailers 配列が含まれている必要があります:

    'mailers' => [
'roundrobin' => [
'transport' => 'roundrobin',
'mailers' => [
'ses',
'postmark',
],
],

// ...
],

ラウンドロビンメーラーが定義されたら、アプリケーションでこのメーラーをデフォルトのメーラーとして設定する必要があります。これは、アプリケーションの mail 構成ファイル内の default 構成キーの値としてその名前を指定することで行います:

    'default' => env('MAIL_MAILER', 'roundrobin'),

ラウンドロビントランスポートは、構成されたメーラーのリストからランダムにメーラーを選択し、その後の各メールで次の利用可能なメーラーに切り替えます。failover トランスポートとは対照的に、高可用性 を実現するのに役立つ roundrobin トランスポートは、負荷分散 を提供します。

メーラブルの生成

Laravel アプリケーションを構築する際、アプリケーションが送信する各種のメールは "mailable" クラスとして表されます。これらのクラスは app/Mail ディレクトリに保存されます。アプリケーションにこのディレクトリが表示されない場合でも心配しないでください。make:mail Artisan コマンドを使用して最初の mailable クラスを作成すると、このディレクトリが自動的に生成されます:

php artisan make:mail OrderShipped

メーラブルの記述

メーラブルクラスを生成したら、その内容を調べるために開いてみましょう。メーラブルクラスの構成は、envelopecontentattachments メソッドを含む複数のメソッドで行われます。

envelope メソッドは、メッセージの件名と、場合によっては受信者を定義する Illuminate\Mail\Mailables\Envelope オブジェクトを返します。content メソッドは、メッセージのコンテンツを生成するために使用される Blade テンプレート を定義する Illuminate\Mail\Mailables\Content オブジェクトを返します。```

送信者の設定

封筒の使用

まず、メールの送信者を設定する方法を探ってみましょう。つまり、メールがどこから来たかを指定します。送信者を設定する方法は2つあります。まず、メッセージの封筒に「from」アドレスを指定することができます:

    use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Envelope;

/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
from: new Address('jeffrey@example.com', 'Jeffrey Way'),
subject: 'Order Shipped',
);
}

必要であれば、replyTo アドレスも指定できます:

    return new Envelope(
from: new Address('jeffrey@example.com', 'Jeffrey Way'),
replyTo: [
new Address('taylor@example.com', 'Taylor Otwell'),
],
subject: 'Order Shipped',
);

グローバル from アドレスの使用

ただし、アプリケーションがすべてのメールで同じ「from」アドレスを使用する場合、生成する各メーラブルクラスにそれを追加するのは煩雑になる可能性があります。代わりに、config/mail.php 構成ファイルでグローバルな「from」アドレスを指定できます。このアドレスは、メーラブルクラス内で他の「from」アドレスが指定されていない場合に使用されます:

    'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],

さらに、config/mail.php 構成ファイル内でグローバルな「reply_to」アドレスを定義することもできます:

    'reply_to' => ['address' => 'example@example.com', 'name' => 'App Name'],

ビューの設定

メーラブルクラスの content メソッド内で、メールの内容をレンダリングする際に使用するテンプレートである view を定義できます。通常、各メールはその内容をレンダリングするために Blade テンプレート を使用するため、メールの HTML を構築する際に Blade テンプレートエンジンの全機能と利便性を利用できます:

    /**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
);
}

注記

すべてのメールテンプレートを保持するために resources/views/emails ディレクトリを作成することをお勧めしますが、resources/views ディレクトリ内の任意の場所に配置することもできます。

プレーンテキストメール

メールのプレーンテキストバージョンを定義したい場合は、メッセージの Content 定義を作成する際にプレーンテキストテンプレートを指定できます。view パラメータと同様に、text パラメータは、メールの内容をレンダリングするために使用されるテンプレート名である必要があります。メッセージの内容の HTML とプレーンテキストの両方を定義することができます。

    /**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
text: 'mail.orders.shipped-text'
);
}

明確にするために、html パラメータは view パラメータのエイリアスとして使用できます:

    return new Content(
html: 'mail.orders.shipped',
text: 'mail.orders.shipped-text'
);

ビューデータ

パブリックプロパティを介して

通常、メールの HTML をレンダリングする際に使用できるビューにデータを渡したいと思うでしょう。ビューでデータを利用可能にする方法は2つあります。まず、メーラブルクラスで定義された任意のパブリックプロパティは、自動的にビューで利用可能になります。つまり、例えば、メーラブルクラスのコンストラクタにデータを渡し、そのデータをクラスで定義されたパブリックプロパティに設定することができます:

    <?php

namespace App\Mail;

use App\Models\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
use Queueable, SerializesModels;

/**
* Create a new message instance.
*/
public function __construct(
public Order $order,
) {}

/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
);
}
}

データがパブリックプロパティに設定されると、ビューで自動的に利用できるようになります。そのため、Blade テンプレート内の他のデータにアクセスするようにアクセスできます:

    <div>
Price: {{ $order->price }}
</div>

with パラメータを介して:

テンプレートに送信される前にメールのデータのフォーマットをカスタマイズしたい場合は、Content 定義の with パラメータを介してデータを手動でビューに渡すことができます。通常、メーラブルクラスのコンストラクタを介してデータを渡しますが、このデータを protected または private プロパティに設定しておく必要があります。これにより、データが自動的にテンプレートで利用可能になることはありません:

    <?php

namespace App\Mail;

use App\Models\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
use Queueable, SerializesModels;

/**
* Create a new message instance.
*/
public function __construct(
protected Order $order,
) {}

/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
with: [
'orderName' => $this->order->name,
'orderPrice' => $this->order->price,
],
);
}
}

データが with メソッドに渡されると、ビューで自動的に利用できるようになります。そのため、Blade テンプレート内の他のデータにアクセスするようにアクセスできます:

    <div>
Price: {{ $orderPrice }}
</div>

添付ファイル

メールに添付ファイルを追加するには、メッセージの attachments メソッドによって返される配列に添付ファイルを追加します。まず、Attachment クラスが提供する fromPath メソッドにファイルパスを指定して添付ファイルを追加できます:

    use Illuminate\Mail\Mailables\Attachment;

/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromPath('/path/to/file'),
];
}

メッセージにファイルを添付する際には、as メソッドと withMime メソッドを使用して添付ファイルの表示名と MIME タイプを指定することもできます:

    /**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromPath('/path/to/file')
->as('name.pdf')
->withMime('application/pdf'),
];
}

ディスクからファイルを添付する

ファイルシステムディスクの1つにファイルを保存している場合、fromStorage 添付メソッドを使用してそのファイルをメールに添付することができます:

    /**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromStorage('/path/to/file'),
];
}

もちろん、添付ファイルの名前やMIMEタイプを指定することもできます:

    /**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromStorage('/path/to/file')
->as('name.pdf')
->withMime('application/pdf'),
];
}

デフォルトのディスク以外を指定する必要がある場合は、fromStorageDisk メソッドを使用できます:

    /**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromStorageDisk('s3', '/path/to/file')
->as('name.pdf')
->withMime('application/pdf'),
];
}

生データの添付

fromData 添付メソッドを使用して、生のバイト文字列を添付ファイルとして添付することができます。たとえば、メモリ内でPDFを生成し、それをディスクに書き込まずにメールに添付したい場合にこのメソッドを使用するかもしれません。fromData メソッドは、生データバイトを解決するクロージャと、添付ファイルに割り当てる名前を受け入れます:

    /**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromData(fn () => $this->pdf, 'Report.pdf')
->withMime('application/pdf'),
];
}

インライン添付

メールにインライン画像を埋め込むことは通常面倒ですが、Laravelはメールに画像を添付する便利な方法を提供しています。インライン画像を埋め込むには、メールテンプレート内の$message変数にembedメソッドを使用します。Laravelは自動的に$message変数をすべてのメールテンプレートで利用可能にし、手動で渡す必要はありません:

<body>
Here is an image:

<img src="{{ $message->embed($pathToImage) }}">
</body>
警告

プレーンテキストメッセージテンプレートでは、インライン添付を使用しないため、$message変数は利用できません。

生データの埋め込み添付

メールテンプレートに埋め込みたい生の画像データ文字列がすでにある場合は、embedData メソッドを$message変数に対して呼び出すことができます。embedData メソッドを呼び出す際には、埋め込まれる画像に割り当てるファイル名を指定する必要があります:

<body>
Here is an image from raw data:

<img src="{{ $message->embedData($data, 'example-image.jpg') }}">
</body>

アタッチ可能なオブジェクト

メッセージにファイルを単純な文字列パスを介して添付することはしばしば十分ですが、多くの場合、アプリケーション内のアタッチ可能なエンティティはクラスで表されます。たとえば、アプリケーションがメッセージに写真を添付する場合、その写真を表す Photo モデルを持っているかもしれません。そのような場合、Photo モデルを単純に attach メソッドに渡すことが便利ではないでしょうか。アタッチ可能なオブジェクトを使用すると、それが可能になります。

始めるには、メッセージにアタッチ可能なオブジェクトを実装します。このインターフェースは、クラスが Illuminate\Mail\Attachment インスタンスを返す toMailAttachment メソッドを定義することを要求します:

    <?php

namespace App\Models;

use Illuminate\Contracts\Mail\Attachable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Mail\Attachment;

class Photo extends Model implements Attachable
{
/**
* Get the attachable representation of the model.
*/
public function toMailAttachment(): Attachment
{
return Attachment::fromPath('/path/to/file');
}
}

アタッチ可能なオブジェクトを定義したら、電子メールメッセージを構築する際に attachments メソッドからそのオブジェクトのインスタンスを返すことができます:

    /**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [$this->photo];
}

もちろん、添付データはAmazon S3などのリモートファイルストレージサービスに保存される場合があります。そのため、Laravelではアプリケーションの ファイルシステムディスク の1つに保存されているデータから添付インスタンスを生成することもできます:

    // Create an attachment from a file on your default disk...
return Attachment::fromStorage($this->path);

// Create an attachment from a file on a specific disk...
return Attachment::fromStorageDisk('backblaze', $this->path);

さらに、メモリ内にあるデータから添付インスタンスを作成することもできます。これを行うには、fromData メソッドにクロージャを提供します。クロージャは、添付を表す生データを返す必要があります:

    return Attachment::fromData(fn () => $this->content, 'Photo Name');

Laravelには、添付ファイルをカスタマイズするために使用できる追加のメソッドも提供されています。たとえば、ファイルの名前とMIMEタイプをカスタマイズするために as メソッドと withMime メソッドを使用できます:

    return Attachment::fromPath('/path/to/file')
->as('Photo Name')
->withMime('image/jpeg');

ヘッダー

時には、送信メッセージに追加のヘッダーを添付する必要がある場合があります。たとえば、カスタムの Message-Id を設定したり、他の任意のテキストヘッダーを設定する必要があるかもしれません。

これを行うには、メーラブルに headers メソッドを定義します。headers メソッドは Illuminate\Mail\Mailables\Headers インスタンスを返す必要があります。このクラスは messageIdreferencestext パラメータを受け入れます。もちろん、特定のメッセージに必要なパラメータのみを提供することもできます:

    use Illuminate\Mail\Mailables\Headers;

/**
* Get the message headers.
*/
public function headers(): Headers
{
return new Headers(
messageId: 'custom-message-id@example.com',
references: ['previous-message@example.com'],
text: [
'X-Custom-Header' => 'Custom Value',
],
);
}

タグとメタデータ

MailgunやPostmarkなどのサードパーティのメールプロバイダは、メッセージの「タグ」と「メタデータ」をサポートしており、これらを使用してアプリケーションから送信されたメールをグループ化および追跡することができます。Envelope 定義を介してメールメッセージにタグとメタデータを追加することができます:

    use Illuminate\Mail\Mailables\Envelope;

/**
* Get the message envelope.
*
* @return \Illuminate\Mail\Mailables\Envelope
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Order Shipped',
tags: ['shipment'],
metadata: [
'order_id' => $this->order->id,
],
);
}

アプリケーションがMailgunドライバを使用している場合は、tags および metadata に関する詳細情報について、Mailgunのドキュメントを参照できます。同様に、Postmarkのドキュメントも、tags および metadata に関するサポート情報を参照できます。

アプリケーションがAmazon SESを使用してメールを送信している場合は、metadata メソッドを使用してメッセージにSES "tags" を添付する必要があります。

Symfonyメッセージのカスタマイズ

Laravelのメール機能はSymfony Mailerによって提供されています。Laravelでは、メッセージを送信する前にSymfony Message インスタンスで呼び出されるカスタムコールバックを登録することができます。これにより、メッセージを送信する前にメッセージを深くカスタマイズする機会が得られます。これを実現するために、Envelope 定義に using パラメータを定義します:

    use Illuminate\Mail\Mailables\Envelope;
use Symfony\Component\Mime\Email;

/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Order Shipped',
using: [
function (Email $message) {
// ...
},
]
);
}

Markdown Mailables

Markdownメールメッセージを使用すると、メール通知 の事前構築されたテンプレートとコンポーネントを mailables で利用できます。メッセージはMarkdownで記述されているため、Laravelはメッセージ用に美しい、レスポンシブなHTMLテンプレートをレンダリングし、同時に自動的にプレーンテキストの対応部分を生成します。

Markdown Mailablesの生成


Markdownテンプレートに対応するメールを生成するには、`make:mail` Artisanコマンドの`--markdown`オプションを使用します:

```shell
php artisan make:mail OrderShipped --markdown=mail.orders.shipped

次に、メールのContent定義をcontentメソッド内で構成する際に、viewパラメータの代わりにmarkdownパラメータを使用します:

    use Illuminate\Mail\Mailables\Content;

/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'mail.orders.shipped',
with: [
'url' => $this->orderUrl,
],
);
}

Markdownメッセージの記述

Markdownメールは、BladeコンポーネントとMarkdown構文の組み合わせを使用して、Laravelの事前構築されたメールUIコンポーネントを活用しながら、簡単にメールメッセージを構築できます:

<x-mail::message>
# Order Shipped

Your order has been shipped!

<x-mail::button :url="$url">
View Order
</x-mail::button>

Thanks,<br>
{{ config('app.name') }}
</x-mail::message>
注記

Markdownメールを記述する際には、余分なインデントを使用しないでください。Markdownの標準に従い、インデントされたコンテンツはコードブロックとしてレンダリングされます。

ボタンコンポーネント

ボタンコンポーネントは、中央に配置されたボタンリンクをレンダリングします。このコンポーネントは、urlとオプションのcolorの2つの引数を受け入れます。サポートされる色はprimarysuccesserrorです。メッセージに複数のボタンコンポーネントを追加することができます:

<x-mail::button :url="$url" color="success">
View Order
</x-mail::button>

パネルコンポーネント

パネルコンポーネントは、指定されたテキストブロックをメッセージの他の部分とは異なる背景色のパネルにレンダリングします。これにより、特定のテキストブロックに注意を引くことができます:

<x-mail::panel>
This is the panel content.
</x-mail::panel>

テーブルコンポーネント

テーブルコンポーネントを使用すると、MarkdownテーブルをHTMLテーブルに変換できます。このコンポーネントはMarkdownテーブルをそのコンテンツとして受け入れます。テーブルの列の配置は、デフォルトのMarkdownテーブルの配置構文を使用してサポートされています:

<x-mail::table>
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
</x-mail::table>

コンポーネントのカスタマイズ

Markdownメールコンポーネントを独自のアプリケーションにエクスポートしてカスタマイズすることができます。コンポーネントをエクスポートするには、vendor:publish Artisanコマンドを使用してlaravel-mailアセットタグを公開します:

php artisan vendor:publish --tag=laravel-mail

このコマンドは、Markdownメールコンポーネントをresources/views/vendor/mailディレクトリに公開します。mailディレクトリには、それぞれ利用可能なコンポーネントの表現を含むhtmlディレクトリとtextディレクトリが含まれます。これらのコンポーネントを自由にカスタマイズすることができます。

CSSのカスタマイズ

コンポーネントをエクスポートした後、resources/views/vendor/mail/html/themesディレクトリにdefault.cssファイルが含まれています。このファイルのCSSをカスタマイズすることができ、スタイルは自動的にMarkdownメールメッセージのHTML表現内でインラインCSSスタイルに変換されます。

LaravelのMarkdownコンポーネントの完全に新しいテーマを構築したい場合は、html/themesディレクトリにCSSファイルを配置することができます。CSSファイルを命名して保存した後、アプリケーションのconfig/mail.php構成ファイルのthemeオプションを新しいテーマの名前に一致させて更新してください。

個々のメーラブルのテーマをカスタマイズするには、メーラブルクラスの$themeプロパティを送信時に使用するテーマの名前に設定することができます。

メールの送信

メッセージを送信するには、Mail facadetoメソッドを使用します。toメソッドは、メールアドレス、ユーザーインスタンス、またはユーザーのコレクションを受け入れます。オブジェクトまたはオブジェクトのコレクションを渡すと、メーラは自動的にそのメールの受信者を決定する際にそれらのemailおよびnameプロパティを使用しますので、これらの属性がオブジェクトに利用可能であることを確認してください。受信者を指定した後、メーラブルクラスのインスタンスをsendメソッドに渡すことができます:

    <?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Mail\OrderShipped;
use App\Models\Order;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class OrderShipmentController extends Controller
{
/**
* Ship the given order.
*/
public function store(Request $request): RedirectResponse
{
$order = Order::findOrFail($request->order_id);

// Ship the order...

Mail::to($request->user())->send(new OrderShipped($order));

return redirect('/orders');
}
}

メッセージを送信する際に「to」受信者のみを指定することに制限されていません。メッセージを送信する際に「to」、 「cc」、および「bcc」受信者をそれぞれのメソッドを連結して設定することができます:

    Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->send(new OrderShipped($order));

受信者の繰り返し処理

時々、受信者のリストにメーラブルを送信する必要がある場合があります。その際は、受信者/メールアドレスの配列を反復処理する必要があります。ただし、to メソッドはメーラブルの受信者リストにメールアドレスを追加するため、ループを通過するたびに以前の受信者全員に対して別のメールが送信されます。したがって、各受信者ごとにメーラブルインスタンスを常に再作成する必要があります:

    foreach (['taylor@example.com', 'dries@example.com'] as $recipient) {
Mail::to($recipient)->send(new OrderShipped($order));
}

特定のメーラを使用してメールを送信する

デフォルトでは、Laravel はアプリケーションの mail 構成ファイルで default メーラとして構成されたメーラを使用してメールを送信します。ただし、mailer メソッドを使用して特定のメーラ構成を使用してメッセージを送信することができます:

    Mail::mailer('postmark')
->to($request->user())
->send(new OrderShipped($order));

メールのキューイング

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

メールメッセージの送信はアプリケーションの応答時間に悪影響を及ぼす可能性があるため、多くの開発者はメールメッセージをバックグラウンドで送信するためにキューに入れることを選択します。Laravel は組み込みの統一されたキュー APIを使用してこれを簡単に行うことができます。メールメッセージをキューに入れるには、メッセージの受信者を指定した後、Mail ファサード上の queue メソッドを使用します:

    Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue(new OrderShipped($order));

このメソッドは、ジョブをキューにプッシュしてメッセージをバックグラウンドで送信する処理を自動的に行います。この機能を使用する前に、キューを構成する必要があります。

遅延メッセージのキューイング

キューに入れたメールメッセージの配信を遅らせたい場合は、later メソッドを使用できます。later メソッドの最初の引数として、メッセージを送信する時刻を示す DateTime インスタンスを受け入れます:

    Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->later(now()->addMinutes(10), new OrderShipped($order));

特定のキューにプッシュする

make:mail コマンドを使用して生成されたすべてのメーラブルクラスは Illuminate\Bus\Queueable トレイトを使用しているため、任意のメーラブルクラスインスタンスで onQueue メソッドと onConnection メソッドを呼び出すことができ、メッセージの接続とキュー名を指定することができます。

    $message = (new OrderShipped($order))
->onConnection('sqs')
->onQueue('emails');

Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue($message);

デフォルトでのキューイング

常にキューに入れたいメールクラスがある場合は、そのクラスに ShouldQueue 契約を実装することができます。これにより、メール送信時に send メソッドを呼び出しても、契約を実装しているため、メールはキューに入れられます。

    use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
// ...
}

キューに入れられたメールとデータベーストランザクション

データベーストランザクション内でキューに入れられたメールがディスパッチされると、データベーストランザクションがコミットされる前にキューによって処理される可能性があります。これが発生すると、データベーストランザクション中にモデルやデータベースレコードに行った更新がまだデータベースに反映されていないかもしれません。さらに、トランザクション内で作成されたモデルやデータベースレコードがデータベースに存在しないかもしれません。もし、あなたのメールがこれらのモデルに依存している場合、キューに入れられたメールを処理するジョブが実行される際に予期しないエラーが発生する可能性があります。

キュー接続の after_commit 構成オプションが false に設定されている場合、メールメッセージを送信する際に afterCommit メソッドを呼び出すことで、特定のキューに入れられたメールが、すべてのオープンなデータベーストランザクションがコミットされた後にディスパッチされるように指定することができます。

    Mail::to($request->user())->send(
(new OrderShipped($order))->afterCommit()
);

または、メールクラスのコンストラクタから afterCommit メソッドを呼び出すこともできます。

    <?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;

/**
* Create a new message instance.
*/
public function __construct()
{
$this->afterCommit();
}
}

注記

これらの問題を回避する方法について詳しく学ぶには、キューに入れられたジョブとデータベーストランザクション に関するドキュメントを参照してください。

メールのレンダリング

時々、メールを送信せずにメールのHTMLコンテンツをキャプチャしたい場合があります。これを実現するために、メールの render メソッドを呼び出すことができます。このメソッドは、メールの評価されたHTMLコンテンツを文字列として返します。

    use App\Mail\InvoicePaid;
use App\Models\Invoice;

$invoice = Invoice::find(1);

return (new InvoicePaid($invoice))->render();

ブラウザでメールをプレビュー

メーラブルのテンプレートを設計する際には、通常のBladeテンプレートのようにブラウザでレンダリングされたメーラブルを素早くプレビューすることが便利です。そのため、Laravelでは、メーラブルを直接ルートクロージャやコントローラから返すことができます。メーラブルが返されると、ブラウザでレンダリングされ表示され、実際のメールアドレスに送信する必要なくデザインを素早くプレビューすることができます:

メーラブルのローカライズ

Laravelでは、リクエストの現在のロケール以外のロケールでメーラブルを送信することができ、メールがキューに入れられた場合でもこのロケールを覚えておきます。

これを実現するために、Mailファサードは、所望の言語を設定するlocaleメソッドを提供しています。メーラブルのテンプレートが評価される際にこのロケールに変更され、評価が完了すると以前のロケールに戻ります:


### ユーザーの優先ロケール

アプリケーションは、時には各ユーザーの優先ロケールを保存します。モデルの1つ以上に`HasLocalePreference`コントラクトを実装することで、Laravelにこの保存されたロケールを使用するよう指示することができます:

```php
インターフェースを実装すると、Laravelはモデルにメーラブルや通知を送信する際に自動的に優先ロケールを使用します。したがって、このインターフェースを使用する際に`locale`メソッドを呼び出す必要はありません:

テスト

メーラブルコンテンツのテスト

Laravelは、メーラブルの構造を検査するためのさまざまなメソッドを提供しています。さらに、Laravelは、メーラブルが期待するコンテンツを含んでいることをテストするための便利なメソッドをいくつか提供しています。これらのメソッドには、assertSeeInHtmlassertDontSeeInHtmlassertSeeInOrderInHtmlassertSeeInTextassertDontSeeInTextassertSeeInOrderInTextassertHasAttachmentassertHasAttachedDataassertHasAttachmentFromStorageassertHasAttachmentFromStorageDiskがあります。

use App\Mail\InvoicePaid;
use App\Models\User;

test('mailable content', function () {
$user = User::factory()->create();

$mailable = new InvoicePaid($user);

$mailable->assertFrom('jeffrey@example.com');
$mailable->assertTo('taylor@example.com');
$mailable->assertHasCc('abigail@example.com');
$mailable->assertHasBcc('victoria@example.com');
$mailable->assertHasReplyTo('tyler@example.com');
$mailable->assertHasSubject('Invoice Paid');
$mailable->assertHasTag('example-tag');
$mailable->assertHasMetadata('key', 'value');

$mailable->assertSeeInHtml($user->email);
$mailable->assertSeeInHtml('Invoice Paid');
$mailable->assertSeeInOrderInHtml(['Invoice Paid', 'Thanks']);

$mailable->assertSeeInText($user->email);
$mailable->assertSeeInOrderInText(['Invoice Paid', 'Thanks']);

$mailable->assertHasAttachment('/path/to/file');
$mailable->assertHasAttachment(Attachment::fromPath('/path/to/file'));
$mailable->assertHasAttachedData($pdfData, 'name.pdf', ['mime' => 'application/pdf']);
$mailable->assertHasAttachmentFromStorage('/path/to/file', 'name.pdf', ['mime' => 'application/pdf']);
$mailable->assertHasAttachmentFromStorageDisk('s3', '/path/to/file', 'name.pdf', ['mime' => 'application/pdf']);
});
use App\Mail\InvoicePaid;
use App\Models\User;

public function test_mailable_content(): void
{
$user = User::factory()->create();

$mailable = new InvoicePaid($user);

$mailable->assertFrom('jeffrey@example.com');
$mailable->assertTo('taylor@example.com');
$mailable->assertHasCc('abigail@example.com');
$mailable->assertHasBcc('victoria@example.com');
$mailable->assertHasReplyTo('tyler@example.com');
$mailable->assertHasSubject('Invoice Paid');
$mailable->assertHasTag('example-tag');
$mailable->assertHasMetadata('key', 'value');

$mailable->assertSeeInHtml($user->email);
$mailable->assertSeeInHtml('Invoice Paid');
$mailable->assertSeeInOrderInHtml(['Invoice Paid', 'Thanks']);

$mailable->assertSeeInText($user->email);
$mailable->assertSeeInOrderInText(['Invoice Paid', 'Thanks']);

$mailable->assertHasAttachment('/path/to/file');
$mailable->assertHasAttachment(Attachment::fromPath('/path/to/file'));
$mailable->assertHasAttachedData($pdfData, 'name.pdf', ['mime' => 'application/pdf']);
$mailable->assertHasAttachmentFromStorage('/path/to/file', 'name.pdf', ['mime' => 'application/pdf']);
$mailable->assertHasAttachmentFromStorageDisk('s3', '/path/to/file', 'name.pdf', ['mime' => 'application/pdf']);
}

メール送信のテスト

通常、メーラブルの内容をテストすることと、特定のユーザーに「送信」されたメーラブルをアサートするテストは別々に行うことをお勧めします。通常、メーラブルの内容はテストしているコードに関係ないため、Laravel が指示されたメーラブルを送信することを単にアサートするだけで十分です。

メールが送信されないようにするために、Mail ファサードの fake メソッドを使用することができます。Mail ファサードの fake メソッドを呼び出した後、メーラブルがユーザーに送信されるように指示されたことをアサートし、さらにメーラブルが受け取ったデータを検査することができます。

<?php

use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Mail;

test('orders can be shipped', function () {
Mail::fake();

// Perform order shipping...

// Assert that no mailables were sent...
Mail::assertNothingSent();

// Assert that a mailable was sent...
Mail::assertSent(OrderShipped::class);

// Assert a mailable was sent twice...
Mail::assertSent(OrderShipped::class, 2);

// Assert a mailable was not sent...
Mail::assertNotSent(AnotherMailable::class);

// Assert 3 total mailables were sent...
Mail::assertSentCount(3);
});
<?php

namespace Tests\Feature;

use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Mail;
use Tests\TestCase;

class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped(): void
{
Mail::fake();

// Perform order shipping...

// Assert that no mailables were sent...
Mail::assertNothingSent();

// Assert that a mailable was sent...
Mail::assertSent(OrderShipped::class);

// Assert a mailable was sent twice...
Mail::assertSent(OrderShipped::class, 2);

// Assert a mailable was not sent...
Mail::assertNotSent(AnotherMailable::class);

// Assert 3 total mailables were sent...
Mail::assertSentCount(3);
}
}

バックグラウンドでメーラブルを配信する場合は、assertSent の代わりに assertQueued メソッドを使用する必要があります。

    Mail::assertQueued(OrderShipped::class);
Mail::assertNotQueued(OrderShipped::class);
Mail::assertNothingQueued();
Mail::assertQueuedCount(3);

assertSentassertNotSentassertQueued、または assertNotQueued メソッドにクロージャを渡すことで、指定された「真理テスト」をパスするメーラブルが送信されたことをアサートすることができます。指定された真理テストをパスする少なくとも 1 つのメーラブルが送信された場合、アサーションは成功します。

    Mail::assertSent(function (OrderShipped $mail) use ($order) {
return $mail->order->id === $order->id;
});

Mail ファサードのアサーションメソッドを呼び出す際に、提供されたクロージャによって受け入れられたメーラブルインスタンスは、メーラブルを検査するための便利なメソッドを公開します。

    Mail::assertSent(OrderShipped::class, function (OrderShipped $mail) use ($user) {
return $mail->hasTo($user->email) &&
$mail->hasCc('...') &&
$mail->hasBcc('...') &&
$mail->hasReplyTo('...') &&
$mail->hasFrom('...') &&
$mail->hasSubject('...');
});

メーラブルインスタンスには、メーラブルの添付ファイルを検査するためのいくつかの便利なメソッドも含まれています。

    use Illuminate\Mail\Mailables\Attachment;

Mail::assertSent(OrderShipped::class, function (OrderShipped $mail) {
return $mail->hasAttachment(
Attachment::fromPath('/path/to/file')
->as('name.pdf')
->withMime('application/pdf')
);
});

Mail::assertSent(OrderShipped::class, function (OrderShipped $mail) {
return $mail->hasAttachment(
Attachment::fromStorageDisk('s3', '/path/to/file')
);
});

Mail::assertSent(OrderShipped::class, function (OrderShipped $mail) use ($pdfData) {
return $mail->hasAttachment(
Attachment::fromData(fn () => $pdfData, 'name.pdf')
);
});

メールが送信されなかったことをアサートするための 2 つのメソッド、assertNotSentassertNotQueued があることに気づいたかもしれません。時には、メールが送信されなかったこと または キューに入れられなかったことをアサートしたい場合があります。これを達成するために、assertNothingOutgoing および assertNotOutgoing メソッドを使用することができます。

    Mail::assertNothingOutgoing();

Mail::assertNotOutgoing(function (OrderShipped $mail) use ($order) {
return $mail->order->id === $order->id;
});

メールとローカル開発

メールを送信するアプリケーションを開発する際、実際にライブメールアドレスにメールを送信したくない場合があります。Laravel には、ローカル開発中に実際のメール送信を "無効" にするためのいくつかの方法が用意されています。

ログドライバ

メールを送信する代わりに、log メールドライバはすべてのメールメッセージをログファイルに書き込み、検査できるようにします。通常、このドライバはローカル開発中にのみ使用されます。環境ごとにアプリケーションを構成する詳細については、構成ドキュメントを参照してください。

HELO / Mailtrap / Mailpit

代替として、HELOMailtrap のようなサービスを使用し、smtp ドライバを使用してメールメッセージを "ダミー" メールボックスに送信し、実際のメールクライアントで表示できるようにします。この方法は、Mailtrap のメッセージビューアで最終的なメールを実際に検査できるという利点があります。

Laravel Sail を使用している場合、Mailpit を使用してメッセージをプレビューできます。Sail が実行されている場合、Mailpit インターフェースには http://localhost:8025 でアクセスできます。

グローバル to アドレスの使用

最後に、Mail ファサードが提供する alwaysTo メソッドを呼び出すことで、グローバルな "to" アドレスを指定できます。通常、このメソッドは、アプリケーションのサービスプロバイダの boot メソッドから呼び出すべきです。

    use Illuminate\Support\Facades\Mail;

/**
* Bootstrap any application services.
*/
public function boot(): void
{
if ($this->app->environment('local')) {
Mail::alwaysTo('taylor@example.com');
}
}

イベント

Laravel はメールメッセージを送信する際に 2 つのイベントをディスパッチします。MessageSending イベントはメッセージが送信される前にディスパッチされ、MessageSent イベントはメッセージが送信された後にディスパッチされます。これらのイベントはメールが 送信 されるときにディスパッチされることに注意してください。これらのイベントに対する イベントリスナー をアプリケーション内で作成することができます。

    use Illuminate\Mail\Events\MessageSending;
// use Illuminate\Mail\Events\MessageSent;

class LogMessage
{
/**
* Handle the given event.
*/
public function handle(MessageSending $event): void
{
// ...
}
}

カスタムトランスポート

Laravel にはさまざまなメールトランスポートが含まれていますが、Laravel がデフォルトでサポートしていない他のサービスを介してメールを配信するために独自のトランスポートを作成したい場合があります。始めるには、Symfony\Component\Mailer\Transport\AbstractTransport クラスを拡張するクラスを定義します。次に、トランスポートに doSend メソッドと __toString() メソッドを実装します:

    use MailchimpTransactional\ApiClient;
use Symfony\Component\Mailer\SentMessage;
use Symfony\Component\Mailer\Transport\AbstractTransport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\MessageConverter;

class MailchimpTransport extends AbstractTransport
{
/**
* Create a new Mailchimp transport instance.
*/
public function __construct(
protected ApiClient $client,
) {
parent::__construct();
}

/**
* {@inheritDoc}
*/
protected function doSend(SentMessage $message): void
{
$email = MessageConverter::toEmail($message->getOriginalMessage());

$this->client->messages->send(['message' => [
'from_email' => $email->getFrom(),
'to' => collect($email->getTo())->map(function (Address $email) {
return ['email' => $email->getAddress(), 'type' => 'to'];
})->all(),
'subject' => $email->getSubject(),
'text' => $email->getTextBody(),
]]);
}

/**
* Get the string representation of the transport.
*/
public function __toString(): string
{
return 'mailchimp';
}
}

独自のトランスポートを定義したら、Mail ファサードが提供する extend メソッドを使用して登録できます。通常、これはアプリケーションの AppServiceProvider サービスプロバイダーの boot メソッド内で行う必要があります。extend メソッドに提供されるクロージャには $config 引数が渡されます。この引数には、アプリケーションの config/mail.php 構成ファイルで定義されたメーラーの構成配列が含まれます:

    use App\Mail\MailchimpTransport;
use Illuminate\Support\Facades\Mail;

/**
* Bootstrap any application services.
*/
public function boot(): void
{
Mail::extend('mailchimp', function (array $config = []) {
return new MailchimpTransport(/* ... */);
});
}

独自のトランスポートを定義して登録した後は、新しいトランスポートを使用するアプリケーションの config/mail.php 構成ファイル内でメーラーの定義を作成できます:

    'mailchimp' => [
'transport' => 'mailchimp',
// ...
],

追加の Symfony トランスポート

Laravel には Mailgun や Postmark のような既存の Symfony メンテナンスメールトランスポートのサポートが含まれています。ただし、追加の Symfony メンテナンストランスポートのサポートを Laravel に拡張したい場合があります。Composer を介して必要な Symfony メーラーを要求し、Laravel にトランスポートを登録することができます。たとえば、"Brevo"(以前は "Sendinblue")Symfony メーラーをインストールして登録することができます:

composer require symfony/brevo-mailer symfony/http-client

Brevo メーラーパッケージをインストールしたら、アプリケーションの services 構成ファイルに Brevo API 資格情報のエントリを追加できます:

    'brevo' => [
'key' => 'your-api-key',
],

次に、Mail ファサードの extend メソッドを使用してトランスポートを Laravel に登録できます。通常、これはサービスプロバイダーの boot メソッド内で行う必要があります:

    use Illuminate\Support\Facades\Mail;
use Symfony\Component\Mailer\Bridge\Brevo\Transport\BrevoTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;

/**
* Bootstrap any application services.
*/
public function boot(): void
{
Mail::extend('brevo', function () {
return (new BrevoTransportFactory)->create(
new Dsn(
'brevo+api',
'default',
config('services.brevo.key')
)
);
});
}

トランスポートが登録されたら、新しいトランスポートを利用するアプリケーションのconfig/mail.php構成ファイル内でメーラー定義を作成できます:

    'brevo' => [
'transport' => 'brevo',
// ...
],