イントロダクションIntroduction
メール送信は複雑であってはいけません。Laravelは、人気のあるSymfony
Mailerコンポーネントを利用した、クリーンでシンプルなメールAPIを提供します。LaravelとSymfony
Mailerは、SMTP、Mailgun、Postmark、Amazon
SES、およびsendmail経由でメールを送信するためのドライバを提供し、ローカルまたはクラウドベースのお好みのサービスを通して、メールの送信をすぐに始められます。Sending email doesn't have to be
complicated. Laravel provides a clean, simple email
API powered by the popular Symfony
Mailer[https://symfony.com/doc/7.0/mailer.html]
component. Laravel and Symfony Mailer provide
drivers for sending email via SMTP, Mailgun,
Postmark, Amazon SES, and sendmail,
allowing you to quickly get started sending mail
through a local or cloud based service of your
choice.
設定Configuration
Laravelのメールサービスは、アプリケーションのconfig/mail.php設定ファイルを介して設定できます。このファイル内で設定された各メーラーには、独自の設定と独自の「トランスポート」があり、アプリケーションがさまざまな電子メールサービスを使用して特定の電子メールメッセージを送信できるようにします。たとえば、アプリケーションでPostmarkを使用してトランザクションメールを送信し、AmazonSESを使用して一括メールを送信するなどです。Laravel's email services may be
configured via your application's
config/mail.php configuration file.
Each mailer configured within this file may have its
own unique configuration and even its own unique
"transport", allowing your application to
use different email services to send certain email
messages. For example, your application might use
Postmark to send transactional emails while using
Amazon SES to send bulk emails.
mail設定ファイル内に、mailers設定配列があります。この配列には、Laravelがサポートしている主要なメールドライバ/トランスポートごとのサンプル設定エントリが含まれています。その中でdefault設定値は、アプリケーションが電子メールメッセージを送信する必要があるときにデフォルトで使用するメーラーを決定します。Within your mail
configuration file, you will find a
mailers configuration array. This array
contains a sample configuration entry for each of
the major mail drivers / transports supported by
Laravel, while the default
configuration value determines which mailer will be
used by default when your application needs to send
an email message.
ドライバ/トランスポートの前提条件Driver / Transport Prerequisites
Mailgun、Postmark、 MailerSendなどのAPIベースドライバは、SMTPサーバを経由してメールを送信するよりもシンプルで高速です。可能であれば、こうしたドライバのいずれかを使用することをお勧めします。The API based drivers such as Mailgun, Postmark, and MailerSend are often simpler and faster than sending mail via SMTP servers. Whenever possible, we recommend that you use one of these drivers.
MailgunドライバMailgun Driver
Mailgunドライバを使用する場合は、Composerで、SymfonyのMailgun Mailerトランスポートをインストールします。To use the Mailgun driver, install Symfony's Mailgun Mailer transport via Composer:
composer require symfony/mailgun-mailer symfony/http-client
次に、アプリケーションのconfig/mail.php設定ファイルのdefaultオプションをmailgunへ設定し、次の設定配列をmailers設定配列へ追加します:Next, set the
default option in your application's
config/mail.php configuration file to
mailgun and add the following
configuration array to your array of
mailers:
'mailgun' => [
'transport' => 'mailgun',
// 'client' => [
// 'timeout' => 5,
// ],
],
アプリケーションのデフォルトメーラーを設定したら、config/services.php設定ファイルへ以下のオプションを追加します。After configuring your
application's default mailer, add the following
options to your config/services.php
configuration file:
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
'scheme' => 'https',
],
米国のMailgunリージョンを使用していない場合は、services設定ファイルでリージョンのエンドポイントを定義できます。If you are not using the United
States Mailgun
region[https://documentation.mailgun.com/en/latest/api-intro.html#mailgun-regions],
you may define your region's endpoint in the
services configuration file:
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.eu.mailgun.net'),
'scheme' => 'https',
],
PostmarkドライバPostmark Driver
Postmarkドライバを使用する場合は、Composerを使い、SymfonyのPostmark Mailerトランスポートをインストールします。To use the Postmark driver, install Symfony's Postmark Mailer transport via Composer:
composer require symfony/postmark-mailer symfony/http-client
次に、アプリケーションのconfig/mail.php設定ファイルのdefaultオプションをpostmarkへ設定します。アプリケーションのデフォルトメーラーを設定したら、config/services.php設定ファイルへ以下のオプションを確実に含めてください。Next, set the
default option in your application's
config/mail.php configuration file to
postmark. After configuring your
application's default mailer, ensure that your
config/services.php configuration file
contains the following options:
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
],
特定のメーラで使用する必要があるPostmarkメッセージストリームを指定したい場合は、message_stream_id設定オプションをメーラの設定配列に追加してください。この設定配列は、アプリケーションのconfig/mail.php設定ファイルにあります。If you would like to specify the
Postmark message stream that should be used by a
given mailer, you may add the
message_stream_id configuration option
to the mailer's configuration array. This
configuration array can be found in your
application's config/mail.php
configuration file:
'postmark' => [
'transport' => 'postmark',
'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
// 'client' => [
// 'timeout' => 5,
// ],
],
この方法で、メッセージストリームが異なる複数のPostmarkメーラを設定することもできます。This way you are also able to set up multiple Postmark mailers with different message streams.
SESドライバSES Driver
Amazon SESドライバを使用するには、最初にAmazon AWS SDK for PHPをインストールする必要があります。このライブラリは、Composerパッケージマネージャを使用し、インストールできます。To use the Amazon SES driver you must first install the Amazon AWS SDK for PHP. You may install this library via the Composer package manager:
composer require aws/aws-sdk-php
次に、config/mail.php設定ファイルのdefaultオプションをsesに設定し、config/services.php設定ファイルに以下のオプションがあることを確認してください。Next, set the
default option in your
config/mail.php configuration file to
ses and verify that your
config/services.php configuration file
contains the following options:
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
AWSの一時的な認証情報をセッショントークン経由で利用するには、アプリケーションのSES設定へtokenキーを追加します。To utilize AWS temporary
credentials[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html]
via a session token, you may add a
token key to your application's SES
configuration:
'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ヘッダを返してください。To interact with SES's
subscription management
features[https://docs.aws.amazon.com/ses/latest/dg/sending-email-subscription-management.html],
you may return the
X-Ses-List-Management-Options header in
the array returned by the
headers[#headers] method of a
mail message:
/**
* メッセージヘッダの取得
*/
public function headers(): Headers
{
return new Headers(
text: [
'X-Ses-List-Management-Options' => 'contactListName=MyContactList;topicName=MyTopic',
],
);
}
Laravelがメール送信時に、AWS SDKのSendEmailメソッドへ渡す、追加オプションを定義したい場合は、ses設定にoptions配列を定義します。If you would like to define
additional
options[https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sesv2-2019-09-27.html#sendemail]
that Laravel should pass to the AWS SDK's
SendEmail method when sending an email,
you may define an options array within
your ses configuration:
'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 Driver
トランザクションメールとSMSサービスのMailerSendは、Laravel用の独自APIベースのメールドライバを保守しています。ドライバを含むパッケージは、Composerパッケージマネージャ経由でインストールできます。MailerSend[https://www.mailersend.com/], a transactional email and SMS service, maintains their own API based mail driver for Laravel. The package containing the driver may be installed via the Composer package manager:
composer require mailersend/laravel-driver
パッケージをインストールしたら、アプリケーションの.envファイルへMAILERSEND_API_KEY環境変数を追加します。さらに、MAIL_MAILER環境変数をmailersendと定義する必要があります。Once the package is installed,
add the MAILERSEND_API_KEY environment
variable to your application's .env
file. In addition, the MAIL_MAILER
environment variable should be defined as
mailersend:
MAIL_MAILER=mailersend
MAIL_FROM_ADDRESS=app@yourdomain.com
MAIL_FROM_NAME="App Name"
MAILERSEND_API_KEY=your-api-key
ホストしたテンプレートの使用方法など、MailerSendの詳細は、MailerSendドライバのドキュメントを参照してください。To learn more about MailerSend, including how to use hosted templates, consult the MailerSend driver documentation[https://github.com/mailersend/mailersend-laravel-driver#usage].
フェイルオーバー設定Failover Configuration
アプリケーションのメールを送信するように設定した外部サービスがダウンすることがあります。このような場合には、プライマリ配信ドライバがダウンした場合に使用する、1つ以上のバックアップメール配信設定を定義できると便利です。Sometimes, an external service you have configured to send your application's mail may be down. In these cases, it can be useful to define one or more backup mail delivery configurations that will be used in case your primary delivery driver is down.
これを実現するには、アプリケーションのmail設定ファイルで、failoverトランスポートを使用するメーラーを定義する必要があります。アプリケーションのfailoverメーラー設定配列に、配送に使う設定済みのメーラーを選択する順序を指定する、mailers配列を含める必要があります。To accomplish this, you should
define a mailer within your application's
mail configuration file that uses the
failover transport. The configuration
array for your application's failover
mailer should contain an array of
mailers that reference the order in
which configured mailers should be chosen for
delivery:
'mailers' => [
'failover' => [
'transport' => 'failover',
'mailers' => [
'postmark',
'mailgun',
'sendmail',
],
],
// ...
],
フェイルオーバーメーラーを定義したら、アプリケーションのmail設定ファイル内のdefault設定キーの値に、その名前を指定して、このメーラーをアプリケーションが使用するデフォルトメーラーとして設定する必要があります。Once your failover mailer has
been defined, you should set this mailer as the
default mailer used by your application by
specifying its name as the value of the
default configuration key within your
application's mail configuration
file:
'default' => env('MAIL_MAILER', 'failover'),
ラウンドロビン設定Round Robin Configuration
roundrobinトランスポートで、メール送信の作業負荷を複数のメーラーへ分散できます。まず、アプリケーションのmail設定ファイル内で、roundrobinトランスポートを使用するメーラーを定義します。アプリケーションのroundrobinメーラーの設定配列では、どの設定済みメーラーを送信に使用するかを指定するmailers配列を含める必要があります。The roundrobin
transport allows you to distribute your mailing
workload across multiple mailers. To get started,
define a mailer within your application's
mail configuration file that uses the
roundrobin transport. The configuration
array for your application's roundrobin
mailer should contain an array of
mailers that reference which configured
mailers should be used for delivery:
'mailers' => [
'roundrobin' => [
'transport' => 'roundrobin',
'mailers' => [
'ses',
'postmark',
],
],
// ...
],
ラウンドロビンメーラーを定義したら、アプリケーションのmail設定ファイル内のdefault設定キーの値に、その名前を指定し、このメーラーをアプリケーションで使用するデフォルトメーラーとして設定する必要があります。Once your round robin mailer has
been defined, you should set this mailer as the
default mailer used by your application by
specifying its name as the value of the
default configuration key within your
application's mail configuration
file:
'default' => env('MAIL_MAILER', 'roundrobin'),
ラウンドロビントランスポートは、設定済みのメーラーのリストの中からランダムにメーラーを選択し、その後のメールに対し、次に利用可能なメーラーに切り替えます。*高可用性を達成するのに役立つ、failoverトランスポートとは対照的に、roundrobinトランスポートは、負荷分散*を提供します。The round robin transport selects
a random mailer from the list of configured mailers
and then switches to the next available mailer for
each subsequent email. In contrast to
failover transport, which helps to
achieve high
availability[https://en.wikipedia.org/wiki/High_availability],
the roundrobin transport provides
load
balancing[https://en.wikipedia.org/wiki/Load_balancing_(computing)].
Mailableの生成Generating Mailables
Laravelアプリケーションを構築する場合、アプリケーションが送信する各タイプの電子メールは"Mailable"クラスとして表します。これらのクラスはapp/Mailディレクトリに保存されます。アプリケーションにこのディレクトリが存在しなくても心配ありません。make:mail
Artisanコマンドを使用して最初のメール可能なクラスを作成するときに、生成されます。When building Laravel
applications, each type of email sent by your
application is represented as a "mailable"
class. These classes are stored in the
app/Mail directory. Don't worry if you
don't see this directory in your application, since
it will be generated for you when you create your
first mailable class using the
make:mail Artisan command:
php artisan make:mail OrderShipped
Mailableの記述Writing Mailables
Mailableクラスを生成したら、その中身を調べるために開いてみましょう。Mailableクラスの設定は、envelope、content、attachmentsなどのメソッドで行います。Once you have generated a
mailable class, open it up so we can explore its
contents. Mailable class configuration is done in
several methods, including the
envelope, content, and
attachments methods.
envelopeメソッドは、メッセージのサブジェクトと、時折り受信者を定義する、Illuminate\Mail\Mailables\Envelopeオブジェクトを返します。contentメソッドは、メッセージの内容を生成するために使用するBladeテンプレートを定義する、Illuminate\Mail\Mailables\Contentオブジェクトを返します。The envelope method
returns an
Illuminate\Mail\Mailables\Envelope
object that defines the subject and, sometimes, the
recipients of the message. The content
method returns an
Illuminate\Mail\Mailables\Content
object that defines the Blade
template[/docs/{{version}}/blade] that will
be used to generate the message content.
Senderの設定Configuring the Sender
Envelopeの使用Using the Envelope
まず、メール送信者の設定を調べてみましょう。つまり、「誰から送られた」メールかということです。送信者の設定は、2つの方法があります。まず、メッセージのEnvelope(封筒)に"from"アドレスを指定する方法です。First, let's explore configuring the sender of the email. Or, in other words, who the email is going to be "from". There are two ways to configure the sender. First, you may specify the "from" address on your message's envelope:
use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Envelope;
/**
* メッセージEnvelopeを取得
*/
public function envelope(): Envelope
{
return new Envelope(
from: new Address('jeffrey@example.com', 'Jeffrey Way'),
subject: 'Order Shipped',
);
}
お望みであれば、replyToアドレスも指定できます。If you would like, you may also
specify a replyTo address:
return new Envelope(
from: new Address('jeffrey@example.com', 'Jeffrey Way'),
replyTo: [
new Address('taylor@example.com', 'Taylor Otwell'),
],
subject: 'Order Shipped',
);
グローバルfromアドレスの使用Using a Global from
Address
ただし、アプリケーションがすべての電子メールに同じ「送信者」アドレスを使用している場合、生成する各Mailableクラスへfromを追加するのは面倒です。代わりに、config/mail.php設定ファイルでグローバルな「送信者」アドレスを指定できます。このアドレスは、Mailableクラス内で「送信者」アドレスを指定しない場合に使用します。However, if your application uses
the same "from" address for all of its
emails, it can become cumbersome to add it to each
mailable class you generate. Instead, you may
specify a global "from" address in your
config/mail.php configuration file.
This address will be used if no other
"from" address is specified within the
mailable class:
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
また、config/mail.php設定ファイル内でグローバルな"reply_to"アドレスも定義できます。In addition, you may define a
global "reply_to" address within your
config/mail.php configuration
file:
'reply_to' => ['address' => 'example@example.com', 'name' => 'App Name'],
ビューの設定Configuring the View
Mailableクラスのcontentメソッド内でview、つまりメールのコンテンツをレンダリングするときどのテンプレートを使用するかを定義します。各メールは通常、Bladeテンプレートを使用してコンテンツをレンダするので、メールのHTML構築にBladeテンプレート・エンジンのパワーと利便性をフル活用できます。Within a mailable class's
content method, you may define the
view, or which template should be used
when rendering the email's contents. Since each
email typically uses a Blade
template[/docs/{{version}}/blade] to render
its contents, you have the full power and
convenience of the Blade templating engine when
building your email's HTML:
/**
* メッセージ内容の定義を取得
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
);
}
Note: すべてのメールテンプレートを格納するために
resources/views/emailsディレクトリを作成することを推奨します。ただし、resources/viewsディレクトリ内ならば好きな場所へ自由に配置できます。[!NOTE]
You may wish to create aresources/views/emailsdirectory to house all of your email templates; however, you are free to place them wherever you wish within yourresources/viewsdirectory.
平文テキストの電子メールPlain Text Emails
平文テキスト版のメールを定義したい場合は、メッセージのContent定義を作成するときに、平文テキストのテンプレートを指定してください。viewパラメータと同様、textパラメータにはメールの内容をレンダするために使用するテンプレートの名前を指定します。HTMLバージョンと平文テキストバージョンの両方を自由に定義できます。If you would like to define a
plain-text version of your email, you may specify
the plain-text template when creating the message's
Content definition. Like the
view parameter, the text
parameter should be a template name which will be
used to render the contents of the email. You are
free to define both an HTML and plain-text version
of your message:
/**
* メッセージ内容の定義を取得
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
text: 'mail.orders.shipped-text'
);
}
明確にするために、htmlパラメータをviewパラメータの別名として使用できます。For clarity, the
html parameter may be used as an alias
of the view parameter:
return new Content(
html: 'mail.orders.shipped',
text: 'mail.orders.shipped-text'
);
ビューデータView Data
Publicなプロパティ経由Via Public Properties
通常、電子メールのHTMLをレンダするときに使用するデータをビューへ渡す必要があります。ビューでデータを利用できるようにする方法は2つあります。まず、Mailableクラスで定義したパブリックプロパティは、自動的にビューで使用できるようになります。したがって、たとえばMailableクラスのコンストラクタにデータを渡し、そのデータをクラスで定義したパブリックプロパティに設定できます。Typically, you will want to pass some data to your view that you can utilize when rendering the email's HTML. There are two ways you may make data available to your view. First, any public property defined on your mailable class will automatically be made available to the view. So, for example, you may pass data into your mailable class's constructor and set that data to public properties defined on the class:
<?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;
/**
* 新しいメッセージインスタンスの生成
*/
public function __construct(
public Order $order,
) {}
/**
* メッセージ内容の定義を取得
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
);
}
}
データをパブリックプロパティへ設定すると、ビューで自動的に利用できるようになるため、Bladeテンプレートの他のデータにアクセスするのと同じようにアクセスできます。Once the data has been set to a public property, it will automatically be available in your view, so you may access it like you would access any other data in your Blade templates:
<div>
Price: {{ $order->price }}
</div>
withパラメータ経由Via the
with Parameter:
もし、テンプレートへ送る前にメールのデータフォーマットをカスタマイズしたい場合は、Content定義のwithパラメータを使用して、手作業でデータをビューに渡すこともできます。しかし、このデータをprotectedまたはprivateプロパティにセットすることで、データが自動的にテンプレートで利用されないようにする必要があります。If you would like to customize
the format of your email's data before it is sent to
the template, you may manually pass your data to the
view via the Content definition's
with parameter. Typically, you will
still pass data via the mailable class's
constructor; however, you should set this data to
protected or private
properties so the data is not automatically made
available to the template:
<?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;
/**
* 新しいメッセージインスタンスの生成
*/
public function __construct(
protected Order $order,
) {}
/**
* メッセージ内容の定義を取得
*/
public function content(): Content
{
return new Content(
view: 'mail.orders.shipped',
with: [
'orderName' => $this->order->name,
'orderPrice' => $this->order->price,
],
);
}
}
データがwithメソッドに渡されると、ビューで自動的に利用できるようになるため、Bladeテンプレートの他のデータにアクセスするのと同じようにアクセスできます。Once the data has been passed to
the with method, it will automatically
be available in your view, so you may access it like
you would access any other data in your Blade
templates:
<div>
Price: {{ $orderPrice }}
</div>
添付Attachments
メールに添付ファイルを追加するには、メッセージのattachmentsメソッドから返す配列に添付ファイルを追加します。最初に、Attachmentクラスが提供する、fromPathメソッドでファイルパスを指定して、添付ファイルを追加します。To add attachments to an email,
you will add attachments to the array returned by
the message's attachments method.
First, you may add an attachment by providing a file
path to the fromPath method provided by
the Attachment class:
use Illuminate\Mail\Mailables\Attachment;
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromPath('/path/to/file'),
];
}
メッセージへファイルを添付するときに、asとwithMimeメソッドを使い、添付ファイルの表示名とMIMEタイプを指定することもできます。When attaching files to a
message, you may also specify the display name and /
or MIME type for the attachment using the
as and withMime
methods:
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromPath('/path/to/file')
->as('name.pdf')
->withMime('application/pdf'),
];
}
ディスクからファイルを添付Attaching Files From Disk
ファイルシステムディスクのいずれかにファイルを保存している場合、fromStorage添付メソッドを使用してメールへ添付できます。If you have stored a file on one
of your filesystem
disks[/docs/{{version}}/filesystem], you may
attach it to the email using the
fromStorage attachment
method:
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromStorage('/path/to/file'),
];
}
もちろん、添付ファイル名とMIMEタイプも指定できます。Of course, you may also specify the attachment's name and MIME type:
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromStorage('/path/to/file')
->as('name.pdf')
->withMime('application/pdf'),
];
}
デフォルトディスク以外のストレージディスクを指定する必要がある場合は、fromStorageDiskメソッドを使用してください。The fromStorageDisk
method may be used if you need to specify a storage
disk other than your default disk:
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromStorageDisk('s3', '/path/to/file')
->as('name.pdf')
->withMime('application/pdf'),
];
}
素のデータの添付ファイルRaw Data Attachments
fromData添付メソッドを使用すると、生のバイト列を添付ファイルにできます。例えば、メモリ上でPDFを生成し、それをディスクへ一旦書き込まずにメールへ添付したい場合は、このメソッドを使用します。fromDataメソッドは、添付ファイルに割り当てるべき名前と同時に、生のデータバイトを解決するクロージャを受け取ります。The fromData
attachment method may be used to attach a raw string
of bytes as an attachment. For example, you might
use this method if you have generated a PDF in
memory and want to attach it to the email without
writing it to disk. The fromData method
accepts a closure which resolves the raw data bytes
as well as the name that the attachment should be
assigned:
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [
Attachment::fromData(fn () => $this->pdf, 'Report.pdf')
->withMime('application/pdf'),
];
}
インライン添付Inline Attachments
インライン画像をメールに埋め込むのは、通常面倒です。ただし、Laravelはメールに画像を添付する便利な方法を提供しています。インライン画像を埋め込むには、メールテンプレート内の$message変数でembedメソッドを使用します。Laravelは自動的に$message変数をすべてのメールテンプレートで利用できるようにするので、手作業で渡すことを心配する必要はありません。Embedding inline images into your
emails is typically cumbersome; however, Laravel
provides a convenient way to attach images to your
emails. To embed an inline image, use the
embed method on the
$message variable within your email
template. Laravel automatically makes the
$message variable available to all of
your email templates, so you don't need to worry
about passing it in manually:
<body>
Here is an image:
<img src="{{ $message->embed($pathToImage) }}">
</body>
Warning! 平文ンテキストメッセージはインライン添付ファイルを利用しないため、
$message変数は平文テキストメッセージテンプレートでは使用できません。[!WARNING]
The$messagevariable is not available in plain-text message templates since plain-text messages do not utilize inline attachments.
素のデータの添付ファイルへの埋め込みEmbedding Raw Data Attachments
電子メールテンプレートに埋め込みたい素の画像データ文字列がすでにある場合は、$message変数でembedDataメソッドを呼び出すことができます。embedDataメソッドを呼び出すときは、埋め込み画像に割り当てる必要のあるファイル名を指定する必要があります。If you already have a raw image
data string you wish to embed into an email
template, you may call the embedData
method on the $message variable. When
calling the embedData method, you will
need to provide a filename that should be assigned
to the embedded image:
<body>
Here is an image from raw data:
<img src="{{ $message->embedData($data, 'example-image.jpg') }}">
</body>
AttachableオブジェクトAttachable Objects
単純な文字列のパスを介してメッセージへファイルを添付すれば十分なことがある一方で、多くの場合、アプリケーション内の添付可能(Attachable)なエンティティはクラスによって表されます。例えば、アプリケーションがメッセージに写真を添付している場合、アプリケーションはその写真を表すPhotoモデルを用意することもできます。その場合、Photoモデルをattachメソッドに渡せれば、便利ですよね?添付可能なAttachableオブジェクトを使用すれば、それが実行できます。While attaching files to messages
via simple string paths is often sufficient, in many
cases the attachable entities within your
application are represented by classes. For example,
if your application is attaching a photo to a
message, your application may also have a
Photo model that represents that photo.
When that is the case, wouldn't it be convenient to
simply pass the Photo model to the
attach method? Attachable objects allow
you to do just that.
この機能を利用するには、メッセージへ添付できるオブジェクトに、Illuminate\Contracts\Mail\Attachableインターフェイスを実装します。このインターフェイスは、そのクラスがIlluminate\Mail\Attachmentインスタンスを返すtoMailAttachmentメソッドを定義するよう指示します:To get started, implement the
Illuminate\Contracts\Mail\Attachable
interface on the object that will be attachable to
messages. This interface dictates that your class
defines a toMailAttachment method that
returns an Illuminate\Mail\Attachment
instance:
<?php
namespace App\Models;
use Illuminate\Contracts\Mail\Attachable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Mail\Attachment;
class Photo extends Model implements Attachable
{
/**
* モデルの添付可能な形式を取得
*/
public function toMailAttachment(): Attachment
{
return Attachment::fromPath('/path/to/file');
}
}
添付可能なオブジェクトを定義したら、メールメッセージを作成する際にattachmentsメソッドにより、そのオブジェクトのインスタンスを返してください。Once you have defined your
attachable object, you may return an instance of
that object from the attachments method
when building an email message:
/**
* メッセージの添付を取得
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [$this->photo];
}
もちろん、添付ファイルデータは、Amazon S3などのリモートファイルストレージサービスに保存されている場合もあるでしょう。そのため、Laravelでは、アプリケーションのファイルシステム・ディスクのいずれかに保存しているデータから、添付ファイルのインスタンスを生成することも可能です。Of course, attachment data may be stored on a remote file storage service such as Amazon S3. So, Laravel also allows you to generate attachment instances from data that is stored on one of your application's filesystem disks[/docs/{{version}}/filesystem]:
// デフォルトデスクから、添付ファイルを作成する
return Attachment::fromStorage($this->path);
// 特定のディスクから、添付ファイルを作成する
return Attachment::fromStorageDisk('backblaze', $this->path);
さらに、メモリ上にあるデータを介して添付ファイルインスタンスを作成することもできます。これを行うには、fromDataメソッドへクロージャを指定します。クロージャは、添付ファイルを表す生データを返す必要があります。In addition, you may create
attachment instances via data that you have in
memory. To accomplish this, provide a closure to the
fromData method. The closure should
return the raw data that represents the
attachment:
return Attachment::fromData(fn () => $this->content, 'Photo Name');
Laravelは、添付ファイルをカスタマイズするために使用できる追加メソッドも提供しています。例えば、asやwithMimeメソッドを使用して、ファイル名やMIMEタイプをカスタマイズできます。Laravel also provides additional
methods that you may use to customize your
attachments. For example, you may use the
as and withMime methods to
customize the file's name and MIME type:
return Attachment::fromPath('/path/to/file')
->as('Photo Name')
->withMime('image/jpeg');
ヘッダHeaders
時には、送信するメッセージへ追加のヘッダを付ける必要が起きるかもしれません。例えば、カスタムMessage-Idや、その他の任意のテキストヘッダを設定する必要があるかもしれません。Sometimes you may need to attach
additional headers to the outgoing message. For
instance, you may need to set a custom
Message-Id or other arbitrary text
headers.
これを行うには、Mailableでheadersメソッドを定義します。headersメソッドは、Illuminate\Mail\Mailables\Headersインスタンスを返す必要があります。このクラスは
messageId、references、textを引数に取ります。もちろん、特定のメッセージに必要なパラメータだけを渡すこともできます。To accomplish this, define a
headers method on your mailable. The
headers method should return an
Illuminate\Mail\Mailables\Headers
instance. This class accepts messageId,
references, and text
parameters. Of course, you may provide only the
parameters you need for your particular
message:
use Illuminate\Mail\Mailables\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',
],
);
}
タグとメタデータTags and Metadata
MailgunやPostmarkなどのサードパーティのメールプロバイダは、メッセージの「タグ」や「メタデータ」をサポートしており、アプリケーションが送信したメールをグループ化し、追跡しするために使用できます。タグやメタデータは、Envelope定義により、メールメッセージへ追加します。Some third-party email providers
such as Mailgun and Postmark support message
"tags" and "metadata", which may
be used to group and track emails sent by your
application. You may add tags and metadata to an
email message via your Envelope
definition:
use Illuminate\Mail\Mailables\Envelope;
/**
* メッセージ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ドライバを使用している場合、タグとメタデータの詳細は、Mailgunのドキュメントを参照してください。同様に、Postmarkのドキュメントも、タグとメタデータのサポートについて、詳しい情報を得るために参照できます。If your application is using the Mailgun driver, you may consult Mailgun's documentation for more information on tags[https://documentation.mailgun.com/en/latest/user_manual.html#tagging-1] and metadata[https://documentation.mailgun.com/en/latest/user_manual.html#attaching-data-to-messages]. Likewise, the Postmark documentation may also be consulted for more information on their support for tags[https://postmarkapp.com/blog/tags-support-for-smtp] and metadata[https://postmarkapp.com/support/article/1125-custom-metadata-faq].
アプリケーションがAmazon
SESを使用してメールを送信している場合、metadataメソッドを使用して、メッセージへSES
「タグ」を添付する必要があります。If
your application is using Amazon SES to send emails,
you should use the metadata method to
attach SES
"tags"[https://docs.aws.amazon.com/ses/latest/APIReference/API_MessageTag.html]
to the message.
SymfonyメッセージのカスタマイズCustomizing the Symfony Message
Laravelのメール機能は、Symfony
Mailerによって提供されています。Laravelでは、メッセージを送信する前に、Symfonyのメッセージインスタンスで呼び出されるカスタムコールバックを登録できます。これにより、メッセージ送信前に、そのメッセージを深くカスタマイズするチャンスが得られます。これを利用するには、Envelope定義でusingパラメータを定義します。Laravel's mail capabilities are
powered by Symfony Mailer. Laravel allows you to
register custom callbacks that will be invoked with
the Symfony Message instance before sending the
message. This gives you an opportunity to deeply
customize the message before it is sent. To
accomplish this, define a using
parameter on your Envelope
definition:
use Illuminate\Mail\Mailables\Envelope;
use Symfony\Component\Mime\Email;
/**
* メッセージEnvelopeを取得
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Order Shipped',
using: [
function (Email $message) {
// ...
},
]
);
}
Markdown MailableMarkdown Mailables
Markdown Mailableメッセージを使用すると、Mailableでメール通知の事前に作成されたテンプレートとコンポーネントを利用できます。メッセージはMarkdownで記述されているため、Laravelはメッセージの美しくレスポンシブなHTMLテンプレートをレンダすると同時に、平文テキスト版も自動的に生成できます。Markdown mailable messages allow you to take advantage of the pre-built templates and components of mail notifications[/docs/{{version}}/notifications#mail-notifications] in your mailables. Since the messages are written in Markdown, Laravel is able to render beautiful, responsive HTML templates for the messages while also automatically generating a plain-text counterpart.
Markdown Mailableの生成Generating Markdown Mailables
対応するMarkdownテンプレートを使用してMailableファイルを生成するには、make:mail
Artisanコマンドの--markdownオプションを使用します。To generate a mailable with a
corresponding Markdown template, you may use the
--markdown option of the
make:mail Artisan command:
php artisan make:mail OrderShipped --markdown=mail.orders.shipped
次に、MailableのContent定義をそのcontentメソッド内で設定するときに、viewパラメータの代わりに、markdownパラメータを使用します。Then, when configuring the
mailable Content definition within its
content method, use the
markdown parameter instead of the
view parameter:
use Illuminate\Mail\Mailables\Content;
/**
* メッセージ内容の定義を取得
*/
public function content(): Content
{
return new Content(
markdown: 'mail.orders.shipped',
with: [
'url' => $this->orderUrl,
],
);
}
Markdownメッセージの記述Writing Markdown Messages
Markdown Mailableは、BladeコンポーネントとMarkdown構文の組み合わせを使用して、Laravelに組み込まれた電子メールUIコンポーネントを活用しながら、メールメッセージを簡単に作成できるようにします。Markdown mailables use a combination of Blade components and Markdown syntax which allow you to easily construct mail messages while leveraging Laravel's pre-built email UI components:
<x-mail::message>
# 発送
注文を発送しました。
<x-mail::button :url="$url">
注文の確認
</x-mail::button>
Thanks,<br>
{{ config('app.name') }}
</x-mail::message>
Note: Markdownメールを書くときに余分なインデントを使用しないでください。Markdown標準に従って、Markdownパーサーはインデントされたコンテンツをコードブロックとしてレンダリングします。[!NOTE]
Do not use excess indentation when writing Markdown emails. Per Markdown standards, Markdown parsers will render indented content as code blocks.
ボタンコンポーネントButton Component
ボタンコンポーネントは、中央に配置されたボタンリンクをレンダします。コンポーネントは、urlとオプションのcolorの2つの引数を取ります。サポートしている色は、primary、success、errorです。メッセージには、必要なだけのボタンコンポーネントを追加できます。The button component renders a
centered button link. The component accepts two
arguments, a url and an optional
color. Supported colors are
primary, success, and
error. You may add as many button
components to a message as you wish:
<x-mail::button :url="$url" color="success">
注文の確認
</x-mail::button>
パネルコンポーネントPanel Component
パネルコンポーネントは、メッセージの残りの部分とはわずかに異なる背景色を持つパネルで、指定するテキストのブロックをレンダします。これにより、特定のテキストブロックに注意を引くことができます。The panel component renders the given block of text in a panel that has a slightly different background color than the rest of the message. This allows you to draw attention to a given block of text:
<x-mail::panel>
ここはパネルの本文。
</x-mail::panel>
テーブルコンポーネントTable Component
テーブルコンポーネントを使用すると、MarkdownテーブルをHTMLテーブルに変換できます。コンポーネントは、そのコンテンツとしてMarkdownテーブルを受け入れます。テーブルの列の配置は、デフォルトのMarkdownテーブルの配置構文をサポートします。The table component allows you to transform a Markdown table into an HTML table. The component accepts the Markdown table as its content. Table column alignment is supported using the default Markdown table alignment syntax:
<x-mail::table>
| Laravel | テーブル | 例 |
| -------- | :-----------: | ---: |
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
</x-mail::table>
コンポーネントのカスタマイズCustomizing the Components
カスタマイズするために、すべてのMarkdownメールコンポーネントを自身のアプリケーションへエクスポートできます。コンポーネントをエクスポートするには、vendor:publish
Artisanコマンドを使用してlaravel-mailアセットタグでリソース公開します。You may export all of the
Markdown mail components to your own application for
customization. To export the components, use the
vendor:publish Artisan command to
publish the laravel-mail asset
tag:
php artisan vendor:publish --tag=laravel-mail
このコマンドは、Markdownメールコンポーネントをresources/views/vendor/mailディレクトリへリソース公開します。mailディレクトリにはhtmlディレクトリとtextディレクトリが含まれ、それぞれに利用可能なすべてのコンポーネントのそれぞれの表現が含まれます。これらのコンポーネントは自由にカスタマイズできます。This command will publish the
Markdown mail components to the
resources/views/vendor/mail directory.
The mail directory will contain an
html and a text directory,
each containing their respective representations of
every available component. You are free to customize
these components however you like.
CSSのカスタマイズCustomizing the CSS
コンポーネントをエクスポートした後、resources/views/vendor/mail/html/themesディレクトリにはdefault.cssファイルが含まれます。このファイルのCSSをカスタマイズすると、MarkdownメールメッセージのHTML表現内でスタイルが自動的にインラインCSSスタイルに変換されます。After exporting the components,
the
resources/views/vendor/mail/html/themes
directory will contain a default.css
file. You may customize the CSS in this file and
your styles will automatically be converted to
inline CSS styles within the HTML representations of
your Markdown mail messages.
LaravelのMarkdownコンポーネント用にまったく新しいテーマを作成したい場合は、CSSファイルをhtml/themesディレクトリに配置できます。CSSファイルに名前を付けて保存した後、アプリケーションのconfig/mail.php設定ファイルのthemeオプションを更新して、新しいテーマの名前と一致させます。If you would like to build an
entirely new theme for Laravel's Markdown
components, you may place a CSS file within the
html/themes directory. After naming and
saving your CSS file, update the theme
option of your application's
config/mail.php configuration file to
match the name of your new theme.
個々のMailableのテーマをカスタマイズするには、Mailableクラスの$themeプロパティを、そのMailableを送信するときに使用するテーマの名前に設定します。To customize the theme for an
individual mailable, you may set the
$theme property of the mailable class
to the name of the theme that should be used when
sending that mailable.
メール送信Sending Mail
メッセージを送信するには、Mailファサードでtoメソッドを使用します。toメソッドは、電子メールアドレス、ユーザーインスタンス、またはユーザーのコレクションを受け入れます。オブジェクトまたはオブジェクトのコレクションを渡すと、メーラーは電子メールの受信者を決定するときに自動的にemailおよびnameプロパティを使用するため、これらの属性がオブジェクトで使用可能であることを確認してください。受信者を指定したら、Mailableクラスのインスタンスをsendメソッドに渡すことができます。To send a message, use the
to method on the Mail
facade[/docs/{{version}}/facades]. The
to method accepts an email address, a
user instance, or a collection of users. If you pass
an object or collection of objects, the mailer will
automatically use their email and
name properties when determining the
email's recipients, so make sure these attributes
are available on your objects. Once you have
specified your recipients, you may pass an instance
of your mailable class to the send
method:
<?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
{
/**
* 指定注文を発送
*/
public function store(Request $request): RedirectResponse
{
$order = Order::findOrFail($request->order_id);
// 注文の発送処理…
Mail::to($request->user())->send(new OrderShipped($order));
return redirect('/orders');
}
}
メッセージを送信するときに「宛先」の受信者を指定するだけに限定されません。それぞれのメソッドをチェーン化することで、「to」、「cc」、「bcc」の受信者を自由に設定できます。You are not limited to just specifying the "to" recipients when sending a message. You are free to set "to", "cc", and "bcc" recipients by chaining their respective methods together:
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->send(new OrderShipped($order));
受信者をループするLooping Over Recipients
場合によっては、受信者/電子メールアドレスの配列を反復処理して、受信者のリストにMailableファイルを送信する必要が起きるでしょう。しかし、toメソッドはメールアドレスをMailable受信者のリストに追加するため、ループを繰り返すたびに、以前のすべての受信者に別のメールが送信されます。したがって、受信者ごとにMailableインスタンスを常に再作成する必要があります。Occasionally, you may need to
send a mailable to a list of recipients by iterating
over an array of recipients / email addresses.
However, since the to method appends
email addresses to the mailable's list of
recipients, each iteration through the loop will
send another email to every previous recipient.
Therefore, you should always re-create the mailable
instance for each recipient:
foreach (['taylor@example.com', 'dries@example.com'] as $recipient) {
Mail::to($recipient)->send(new OrderShipped($order));
}
特定のメーラーを介してメールを送信Sending Mail via a Specific Mailer
デフォルトでは、Laravelはアプリケーションのmail設定ファイルでdefaultメーラーとして設定されたメーラーを使用してメールを送信します。しかし、mailerメソッドを使用して、特定のメーラー設定を使用してメッセージを送信することができます。By default, Laravel will send
email using the mailer configured as the
default mailer in your application's
mail configuration file. However, you
may use the mailer method to send a
message using a specific mailer
configuration:
Mail::mailer('postmark')
->to($request->user())
->send(new OrderShipped($order));
メールのキュー投入Queueing Mail
メールメッセージのキュー投入Queueing a Mail Message
電子メールメッセージの送信はアプリケーションのレスポンス時間に悪影響を与える可能性があるため、多くの開発者はバックグラウンド送信のために電子メールメッセージをキューに投入することを選択します。Laravelは組み込みの統一キューAPIを使用してこれを簡単にしています。メールメッセージをキューに投入するには、メッセージの受信者を指定した後、Mailファサードでqueueメソッドを使用します。Since sending email messages can
negatively impact the response time of your
application, many developers choose to queue email
messages for background sending. Laravel makes this
easy using its built-in unified queue
API[/docs/{{version}}/queues]. To queue a
mail message, use the queue method on
the Mail facade after specifying the
message's recipients:
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue(new OrderShipped($order));
このメソッドは、メッセージがバックグラウンドで送信されるように、ジョブをキューへ自動的に投入処理します。この機能を使用する前に、キューを設定しておく必要があります。This method will automatically take care of pushing a job onto the queue so the message is sent in the background. You will need to configure your queues[/docs/{{version}}/queues] before using this feature.
遅延メッセージキューDelayed Message Queueing
キューに投入した電子メールメッセージの配信を遅らせたい場合は、laterメソッドを使用します。laterメソッドは最初の引数にメッセージの送信時期を示すDateTimeインスタンスを取ります。If you wish to delay the delivery
of a queued email message, you may use the
later method. As its first argument,
the later method accepts a
DateTime instance indicating when the
message should be sent:
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->later(now()->addMinutes(10), new OrderShipped($order));
特定のキューへの投入Pushing to Specific Queues
make:mailコマンドを使用して生成したすべてのMailableクラスはIlluminate\Bus\Queueableトレイトを利用するため、任意のMailableクラスインスタンスでonQueueメソッドとonConnectionメソッドを呼び出して、メッセージに使う接続とキュー名を指定できます。Since all mailable classes
generated using the make:mail command
make use of the
Illuminate\Bus\Queueable trait, you may
call the onQueue and
onConnection methods on any mailable
class instance, allowing you to specify the
connection and queue name for the
message:
$message = (new OrderShipped($order))
->onConnection('sqs')
->onQueue('emails');
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue($message);
デフォルトでのキュー投入Queueing by Default
常にキューに入れたいMailableクラスがある場合は、クラスにShouldQueue契約を実装できます。これで、メール送信時にsendメソッドを呼び出しても、この契約を実装しているため、Mailableはキューへ投入されます。If you have mailable classes that
you want to always be queued, you may implement the
ShouldQueue contract on the class. Now,
even if you call the send method when
mailing, the mailable will still be queued since it
implements the contract:
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderShipped extends Mailable implements ShouldQueue
{
// ...
}
Mailableのキュー投入とデータベーストランザクションQueued Mailables and Database Transactions
キュー投入されたMailableがデータベーストランザクション内でディスパッチされると、データベーストランザクションがコミットされる前にキューによって処理される場合があります。これが発生した場合、データベーストランザクション中にモデルまたはデータベースレコードに加えた更新は、データベースにまだ反映されていない可能性があります。さらに、トランザクション内で作成したモデルまたはデータベースレコードは、データベースに存在しない可能性があります。Mailableがこれらのモデルに依存している場合、キューに入れられたMailableを送信するジョブが処理されるときに予期しないエラーが発生する可能性があります。When queued mailables are dispatched within database transactions, they may be processed by the queue before the database transaction has committed. When this happens, any updates you have made to models or database records during the database transaction may not yet be reflected in the database. In addition, any models or database records created within the transaction may not exist in the database. If your mailable depends on these models, unexpected errors can occur when the job that sends the queued mailable is processed.
キュー接続のafter_commit設定オプションがfalseに設定されている場合でも、メールメッセージ送信時にafterCommitメソッドを呼び出せば、キュー投入する特定のMailableが、オープンしているすべてのデータベーストランザクションのコミット後に、ディスパッチすると示せます。If your queue connection's
after_commit configuration option is
set to false, you may still indicate
that a particular queued mailable should be
dispatched after all open database transactions have
been committed by calling the
afterCommit method when sending the
mail message:
Mail::to($request->user())->send(
(new OrderShipped($order))->afterCommit()
);
あるいは、Mailableのコンストラクタで、afterCommitメソッドを呼び出すこともできます。Alternatively, you may call the
afterCommit method from your mailable's
constructor:
<?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;
/**
* 新しいメッセージインスタンスの生成
*/
public function __construct()
{
$this->afterCommit();
}
}
Note: これらの問題の回避方法の詳細は、キュー投入したジョブとデータベーストランザクションに関するドキュメントを確認してください。[!NOTE]
To learn more about working around these issues, please review the documentation regarding queued jobs and database transactions[/docs/{{version}}/queues#jobs-and-database-transactions].
MailableのレンダRendering Mailables
MailableのHTMLコンテンツを送信せずにキャプチャしたい場合があります。これを行うには、Mailableのrenderメソッドを呼び出してください。このメソッドは、Mailableファイルの評価済みHTMLコンテンツを文字列として返します。Sometimes you may wish to capture
the HTML content of a mailable without sending it.
To accomplish this, you may call the
render method of the mailable. This
method will return the evaluated HTML content of the
mailable as a string:
use App\Mail\InvoicePaid;
use App\Models\Invoice;
$invoice = Invoice::find(1);
return (new InvoicePaid($invoice))->render();
ブラウザによるMailableのプレビューPreviewing Mailables in the Browser
Mailableのテンプレートを設計するときは、通常のBladeテンプレートのように、レンダ済みMailableをブラウザですばやくプレビューできると便利です。このためLaravelでは、ルートクロージャまたはコントローラから直接Mailableを返せます。Mailableが返されると、ブラウザでレンダされ表示されるため、実際の電子メールアドレスへ送信しなくても、デザインをすばやくプレビューできます。When designing a mailable's template, it is convenient to quickly preview the rendered mailable in your browser like a typical Blade template. For this reason, Laravel allows you to return any mailable directly from a route closure or controller. When a mailable is returned, it will be rendered and displayed in the browser, allowing you to quickly preview its design without needing to send it to an actual email address:
Route::get('/mailable', function () {
$invoice = App\Models\Invoice::find(1);
return new App\Mail\InvoicePaid($invoice);
});
Mailableの多言語化Localizing Mailables
Laravelを使用すると、リクエストの現在のロケール以外のロケールでMailableファイルを送信でき、メールがキュー投入される場合でもこのロケールを記憶しています。Laravel allows you to send mailables in a locale other than the request's current locale, and will even remember this locale if the mail is queued.
これを実現するために、Mailファサードは目的の言語を設定するためのlocaleメソッドを提供します。Mailableのテンプレートが評価されると、アプリケーションはこのロケールに変更され、評価が完了すると前のロケールに戻ります。To accomplish this, the
Mail facade offers a
locale method to set the desired
language. The application will change into this
locale when the mailable's template is being
evaluated and then revert back to the previous
locale when evaluation is complete:
Mail::to($request->user())->locale('es')->send(
new OrderShipped($order)
);
ユーザー優先ロケールUser Preferred Locales
場合によっては、アプリケーションは各ユーザーの優先ロケールを保存しています。1つ以上のモデルにHasLocalePreferenceコントラクトを実装することで、メールを送信するときにこの保存されたロケールを使用するようにLaravelに指示できます。Sometimes, applications store
each user's preferred locale. By implementing the
HasLocalePreference contract on one or
more of your models, you may instruct Laravel to use
this stored locale when sending mail:
use Illuminate\Contracts\Translation\HasLocalePreference;
class User extends Model implements HasLocalePreference
{
/**
* ユーザーの希望するロケールを取得
*/
public function preferredLocale(): string
{
return $this->locale;
}
}
このインターフェイスを実装すると、LaravelはMailableと通知をモデルへ送信するとき、自動的に優先ロケールを使用します。したがって、このインターフェイスを使用する場合、localeメソッドを呼び出す必要はありません。Once you have implemented the
interface, Laravel will automatically use the
preferred locale when sending mailables and
notifications to the model. Therefore, there is no
need to call the locale method when
using this interface:
Mail::to($request->user())->send(new OrderShipped($order));
TestingTesting
Mailable内容のテストTesting Mailable Content
Laravelは、Mailableの構造を調べる数多くのメソッドを提供しています。さらに、期待するコンテンツがMailableに含まれているかをテストするために便利なメソッドをいくらか用意しています。これらのメソッドは以下の通りです。assertSeeInHtml、assertDontSeeInHtml、assertSeeInOrderInHtml、assertSeeInText、assertDontSeeInText、assertSeeInOrderInText、assertHasAttachment、assertHasAttachedData、assertHasAttachmentFromStorage、assertHasAttachmentFromStorageDiskLaravel provides a variety of
methods for inspecting your mailable's structure. In
addition, Laravel provides several convenient
methods for testing that your mailable contains the
content that you expect. These methods are:
assertSeeInHtml,
assertDontSeeInHtml,
assertSeeInOrderInHtml,
assertSeeInText,
assertDontSeeInText,
assertSeeInOrderInText,
assertHasAttachment,
assertHasAttachedData,
assertHasAttachmentFromStorage, and
assertHasAttachmentFromStorageDisk.
ご想像のとおり、"HTML"アサートは、MailableのHTMLバージョンに特定の文字列が含まれていることを宣言し、"text"アサートは、Mailableの平文テキストバージョンに特定の文字列が含まれていることを宣言します。As you might expect, the "HTML" assertions assert that the HTML version of your mailable contains a given string, while the "text" assertions assert that the plain-text version of your mailable contains a given string:
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']);
}
Mailable送信のテストTesting Mailable Sending
指定Mailableが特定のユーザーに「送信」されたことをアサートするテストとは別に、Mailalbeの内容をテストすることをお勧めします。通常、Mailableの内容は、テストしているコードには関係ないため、LaravelがMailableを送信するように指示されたことを単純に主張するだけで十分です。We suggest testing the content of your mailables separately from your tests that assert that a given mailable was "sent" to a specific user. Typically, the content of mailables is not relevant to the code you are testing, and it is sufficient to simply assert that Laravel was instructed to send a given mailable.
Mailファサードのfakeメソッドを使用して、メールが実際には送信されないようにできます。Mailファサードのfakeメソッドを呼び出した後、メールソフトがユーザーに送信するよう指示されたことをアサートし、受信されたMailableのデータを検査することも可能です。You may use the Mail
facade's fake method to prevent mail
from being sent. After calling the Mail
facade's fake method, you may then
assert that mailables were instructed to be sent to
users and even inspect the data the mailables
received:
<?php
use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Mail;
test('orders can be shipped', function () {
Mail::fake();
// 注文の発送処理
// Mailableを送らないことをアサート
Mail::assertNothingSent();
// Mailableを一つ送信したことをアサート
Mail::assertSent(OrderShipped::class);
// Mailableを一つ2回送信したことをアサート
Mail::assertSent(OrderShipped::class, 2);
// あるMailableを送信しないことをアサート
Mail::assertNotSent(AnotherMailable::class);
// Mailableを合計3回送信することをアサート
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();
// 注文の発送処理
// Mailableを送らないことをアサート
Mail::assertNothingSent();
// Mailableを一つ送信したことをアサート
Mail::assertSent(OrderShipped::class);
// Mailableを一つ2回送信したことをアサート
Mail::assertSent(OrderShipped::class, 2);
// あるMailableを送信しないことをアサート
Mail::assertNotSent(AnotherMailable::class);
// Mailableを合計3回送信することをアサート
Mail::assertSentCount(3);
}
}
バックグラウンドで配送するためMailableをキューに投入する場合は、assertSentの代わりにassertQueuedメソッドを使用してください。If you are queueing mailables for
delivery in the background, you should use the
assertQueued method instead of
assertSent:
Mail::assertQueued(OrderShipped::class);
Mail::assertNotQueued(OrderShipped::class);
Mail::assertNothingQueued();
Mail::assertQueuedCount(3);
クロージャをassertSent、assertNotSent、assertQueued、assertNotQueuedメソッドへ渡すと、指定した「真理値テスト」にパスするMailableが送信されたことをアサートできます。指定した真理値テストにパスするMailableを少なくとも1つ送信した場合、アサーションをパスします。You may pass a closure to the
assertSent, assertNotSent,
assertQueued, or
assertNotQueued methods in order to
assert that a mailable was sent that passes a given
"truth test". If at least one mailable was
sent that passes the given truth test then the
assertion will be successful:
Mail::assertSent(function (OrderShipped $mail) use ($order) {
return $mail->order->id === $order->id;
});
Mailファサードのアサートメソッドを呼び出すときに、指定するクロージャが引数に受けるMailableインスタンスは、Mailableを調べるための有用なメソッドを提供しています。When calling the
Mail facade's assertion methods, the
mailable instance accepted by the provided closure
exposes helpful methods for examining the
mailable:
Mail::assertSent(OrderShipped::class, function (OrderShipped $mail) use ($user) {
return $mail->hasTo($user->email) &&
$mail->hasCc('...') &&
$mail->hasBcc('...') &&
$mail->hasReplyTo('...') &&
$mail->hasFrom('...') &&
$mail->hasSubject('...');
});
また、Mailableインスタンスには、Mailableに添付されたファイルを調べるための有用なメソッドを用意しています。The mailable instance also includes several helpful methods for examining the attachments on a mailable:
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つあることにお気づきでしょうか。assertNotSentとassertNotQueuedです。時には、メールが送信されなかったこと、またはキュー投入されなかったことをアサートしたい場合があります。これを行うには、assertNothingOutgoingとassertNotOutgoingメソッドを使用します。You may have noticed that there
are two methods for asserting that mail was not
sent: assertNotSent and
assertNotQueued. Sometimes you may wish
to assert that no mail was sent or
queued. To accomplish this, you may use the
assertNothingOutgoing and
assertNotOutgoing methods:
Mail::assertNothingOutgoing();
Mail::assertNotOutgoing(function (OrderShipped $mail) use ($order) {
return $mail->order->id === $order->id;
});
メールとローカル開発Mail and Local Development
電子メールを送信するアプリケーションを開発する場合、実際の電子メールアドレスに電子メールを送信したくない場合があります。Laravelは、ローカル開発中に実際の電子メールの送信を「無効にする」ためのいくつかの方法を提供します。When developing an application that sends email, you probably don't want to actually send emails to live email addresses. Laravel provides several ways to "disable" the actual sending of emails during local development.
LogドライバLog Driver
メールを送信する代わりに、logメールドライバは検査のためにすべてのメールメッセージをログファイルに書き込みます。通常、このドライバはローカル開発中にのみ使用されます。環境ごとのアプリケーションの設定の詳細については、設定ドキュメントを確認してください。Instead of sending your emails,
the log mail driver will write all
email messages to your log files for inspection.
Typically, this driver would only be used during
local development. For more information on
configuring your application per environment, check
out the configuration
documentation[/docs/{{version}}/configuration#environment-configuration].
HELO/Mailtrap/MailpitHELO / Mailtrap / Mailpit
もしくは、HELOやMailtrapなどのサービスとsmtpドライバを使用して、メールメッセージを「ダミー」メールボックスに送信可能です。本当の電子メールクライアントでそれらを表示できます。このアプローチには、Mailtrapのメッセージビューアで最終的な電子メールを実際に調べられるという利点があります。Alternatively, you may use a
service like HELO[https://usehelo.com] or
Mailtrap[https://mailtrap.io] and the
smtp driver to send your email messages
to a "dummy" mailbox where you may view
them in a true email client. This approach has the
benefit of allowing you to actually inspect the
final emails in Mailtrap's message
viewer.
Laravel Sailを使用している場合は、Mailpitを使用してメッセージをプレビューできます。Sailの実行中は、http://localhost:8025でMailpitインターフェイスにアクセスできます。If you are using Laravel
Sail[/docs/{{version}}/sail], you may
preview your messages using
Mailpit[https://github.com/axllent/mailpit].
When Sail is running, you may access the Mailpit
interface at:
http://localhost:8025.
グローバルなtoアドレスの使用Using a Global to
Address
最後に、Mailファサードが提供するalwaysToメソッドを呼び出し、グローバルな「宛先」アドレスを指定する方法です。通常、このメソッドは、アプリケーションのサービスプロバイダのbootメソッドから呼び出すべきでしょう。Finally, you may specify a global
"to" address by invoking the
alwaysTo method offered by the
Mail facade. Typically, this method
should be called from the boot method
of one of your application's service
providers:
use Illuminate\Support\Facades\Mail;
/**
* アプリケーションの全サービスの初期起動処理
*/
public function boot(): void
{
if ($this->app->environment('local')) {
Mail::alwaysTo('taylor@example.com');
}
}
イベントEvents
Laravelはメール送信時に2つのイベントをディスパッチします。MessageSendingイベントはメッセージを送信する前にディスパッチし、MessageSentイベントはメッセージを送信した後にディスパッチします。これらのイベントはメールがキューに入っている時点でなく、送信した時にディスパッチされることを覚えておいてください。アプリケーションの中で、これらのイベントのイベントリスナを作成できます。Laravel dispatches two events
while sending mail messages. The
MessageSending event is dispatched
prior to a message being sent, while the
MessageSent event is dispatched after a
message has been sent. Remember, these events are
dispatched when the mail is being sent, not
when it is queued. You may create event
listeners[/docs/{{version}}/events] for
these events within your application:
use Illuminate\Mail\Events\MessageSending;
// use Illuminate\Mail\Events\MessageSent;
class LogMessage
{
/**
* 指定イベントの処理
*/
public function handle(MessageSending $event): void
{
// ...
}
}
カスタムトランスポートCustom Transports
Laravelは様々なメールトランスポートを用意していますが、Laravelが予めサポートしていない他のサービスを使いメールを配信するため、独自のトランスポートを書きたい場合があり得ます。取り掛かるには、Symfony\Component\Mailer\Transport\AbstractTransportクラスを継承するクラスを定義します。次に、トランスポートでdoSendと__toString()メソッドを実装します。Laravel includes a variety of
mail transports; however, you may wish to write your
own transports to deliver email via other services
that Laravel does not support out of the box. To get
started, define a class that extends the
Symfony\Component\Mailer\Transport\AbstractTransport
class. Then, implement the doSend and
__toString() methods on your
transport:
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
{
/**
* 新しいMailchimpトランスポートインスタンスの生成
*/
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(),
]]);
}
/**
* トランスポートの文字列表現の取得
*/
public function __toString(): string
{
return 'mailchimp';
}
}
カスタムトランスポートを定義したら、Mailファサードが提供するextendメソッドで登録します。一般的には、アプリケーションのAppServiceProviderサービスプロバイダのbootメソッド内で行います。extendメソッドへ渡されるクロージャへ、$config引数が渡されます。この引数には、アプリケーションのconfig/mail.php設定ファイルで定義してあるメーラーの設定配列が含まれています。Once you've defined your custom
transport, you may register it via the
extend method provided by the
Mail facade. Typically, this should be
done within the boot method of your
application's AppServiceProvider
service provider. A $config argument
will be passed to the closure provided to the
extend method. This argument will
contain the configuration array defined for the
mailer in the application's
config/mail.php configuration
file:
use App\Mail\MailchimpTransport;
use Illuminate\Support\Facades\Mail;
/**
* アプリケーションの全サービスの初期起動処理
*/
public function boot(): void
{
Mail::extend('mailchimp', function (array $config = []) {
return new MailchimpTransport(/* ... */);
});
}
カスタムトランスポートを定義し、登録すると、アプリケーションのconfig/mail.php設定ファイル内に、新しいトランスポートを利用するメーラー定義を作成できます。Once your custom transport has
been defined and registered, you may create a mailer
definition within your application's
config/mail.php configuration file that
utilizes the new transport:
'mailchimp' => [
'transport' => 'mailchimp',
// ...
],
Symfonyトランスポートの追加Additional Symfony Transports
Laravelは、MailgunやPostmarkのように、Symfonyがメンテナンスしている既存のメールトランスポートをサポートしています。しかし、Laravelを拡張して、Symfonyが保守する追加のトランスポートを追加サポートしたい場合があるでしょう。Composerを使い、必要なSymfonyメーラーをインストールし、Laravelでそのトランスポートを登録することで、これが実現できます。例として、"Brevo"(以前の"Sendinblue") Symfonyメーラーをインストールし、登録してみましょう。Laravel includes support for some existing Symfony maintained mail transports like Mailgun and Postmark. However, you may wish to extend Laravel with support for additional Symfony maintained transports. You can do so by requiring the necessary Symfony mailer via Composer and registering the transport with Laravel. For example, you may install and register the "Brevo" (formerly "Sendinblue") Symfony mailer:
composer require symfony/brevo-mailer symfony/http-client
Sendinblueメーラーパッケージをインストールしたら、アプリケーションのBrevo設定ファイルへ、Brevo
API認証情報のエントリを追加します。Once the
Brevo mailer package has been installed, you may add
an entry for your Brevo API credentials to your
application's services configuration
file:
'brevo' => [
'key' => 'your-api-key',
],
次に、Mailファサードのextendメソッドを使用して、Laravelへこのトランスポートを登録します。一般的に、これはサービスプロバイダのbootメソッド内で行う必要があります。Next, you may use the
Mail facade's extend
method to register the transport with Laravel.
Typically, this should be done within the
boot method of a service
provider:
use Illuminate\Support\Facades\Mail;
use Symfony\Component\Mailer\Bridge\Brevo\Transport\BrevoTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;
/**
* アプリケーションの全サービスの初期起動処理
*/
public function boot(): void
{
Mail::extend('brevo', function () {
return (new BrevoTransportFactory)->create(
new Dsn(
'brevo api',
'default',
config('services.brevo.key')
)
);
});
}
トランスポートを登録したら、アプリケーションのconfig/mail.php設定ファイル内に、その新しいトランスポートを利用するメーラー定義を作成します。Once your transport has been
registered, you may create a mailer definition
within your application's config/mail.php
configuration file that utilizes the new
transport:
'brevo' => [
'transport' => 'brevo',
// ...
],