メール
はじめに
メールの送信は複雑である必要はありません。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
メーラブルの記述
メーラブルクラスを生成したら、その内容を調べるために開いてみましょう。メーラブルクラスの構成は、envelope
、content
、attachments
メソッドを含む複数のメソッドで行われます。
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
インスタンスを返す必要があります。このクラスは messageId
、references
、text
パラメータを受け入れます。もちろん、特定のメッセージに必要なパラメータのみを提供することもできます:
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つの 引数を受け入れます。サポートされる色はprimary
、success
、error
です。メッセージに複数のボタンコンポーネントを追加することができます:
<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
facadeのto
メソッドを使用します。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));