Laravel は、人気のある SwiftMailer クラス ライブラリに基づいて、クリーンで簡潔なメール API を構築します。 Laravel は、SMTP、Mandrill、SparkPost、Amazon SES、PHP のメール メソッド、および sendmail メソッドをサポートするドライバーを提供しており、ローカルまたはクラウド サービスを介して電子メールを送信するための機能の構築をすぐに開始できます。
Mailgun や Mandrill などの API ベースのドライバーは、一般に SMTP サービスよりもシンプルで高速です。すべての API ドライバーは Guzzle HTTP クラス ライブラリをインポートする必要があります。次の内容をcomposer.json ファイルに追加することでインストールできます:
"guzzlehttp/guzzle": "~5.3|~6.0"
Mailgun driver
Mailgun ドライバーを使用する場合は、まず Guzzle をインストールし、次に config/mail.php 構成ファイルのドライバー オプションを mailgun に設定する必要があります。次に、config/services.php 設定ファイルに次のオプションが含まれていることを確認する必要があります:
'mailgun' => [ 'domain' => 'your-mailgun-domain', 'secret' => 'your-mailgun-key',],
Mandrill ドライバー
Mandrill ドライバーを使用している場合は、まず Guzzle をインストールし、次に config/mail.php 設定ファイルのドライバー オプションを mandrill に設定する必要があります。次に、config/services.php 設定ファイルに次のオプションが含まれていることを確認する必要があります。
'mandrill' => [ 'secret' => 'your-mandrill-key',],
SparkPost ドライバー
SparkPost ドライバーを使用する場合、まず Guzzle をインストールする必要があります。次に、config/mail.php 構成ファイルのドライバー オプションを Sparkpost に設定します。次に、config/services.php 設定ファイルに次のオプションが含まれていることを確認する必要があります:
'sparkpost' => [ 'secret' => 'your-sparkpost-key',],
SES ドライバー
Amazon SES ドライバーを使用する場合、PHP での Amazon AWS SDK の紹介が必要です。これは、composer.json ファイルにインポートすることでインストールできます。
"aws/aws-sdk-php": "~3.0"
次に、config/mail.php 設定ファイルのドライバー オプションを ses に設定します。次に、config/services.php 設定ファイルに次のオプションが含まれていることを確認する必要があります:
'ses' => [ 'key' => 'your-ses-key', 'secret' => 'your-ses-secret', 'region' => 'ses-region', //e.g. us-east-1],
Laravel では、ビューを使用して電子メール メッセージを保存できます。たとえば、resources/views ディレクトリの下にメール ディレクトリを作成して、メール ビューを管理できます。
メールを送信するには、メール マスクの send メソッドを使用する必要があります。 send メソッドは 3 つのパラメーターを受け取ります。最初のパラメーターはビューの名前である必要があります。 2 番目のパラメーターは、ビューに渡されるデータの配列である必要があります。最後に、Closure コールバック関数があります。このコールバック関数はメッセージ インスタンスを受け取り、受信者、件名、その他の電子メール情報を自由に設定できます。ユーザー キーを配列に渡したため、メール ビューでユーザーの名前を使用できるようになります。
<?phpnamespace App\Http\Controller;use Mail;use App\User;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class UserController extends Controller{ /** * Send an e-mail reminder to the user. * * @param Request $request * @param int $id * @return Response */ public function sendEmailReminder(Request $request, $id) { $user = User::findOrFail($id); Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) { $m->from('hello@app.com', 'Your Application'); $m->to($user->email, $user->name)->subject('Your Reminder!'); }); }}
注: $message 変数は自動的にメール ビューに渡され、インラインを許可します。添付ファイル。したがって、メッセージ変数をビューに手動で渡すことは避けてください。
<?php echo $user->name; ?>
メッセージの構築
上で説明したように、send メソッドに渡される 3 番目のパラメータはクロージャです。このクロージャにより、メッセージのさまざまなオプションを設定できます。電子メールメッセージ。クロージャーを使用すると、コピー、シークレットコピーなど、メッセージの他のプロパティを指定できます。
$message のインスタンスを構築するために使用できるすべてのメソッドは次のとおりです:
Mail::send('emails.welcome', $data, function ($message) { $message->from('us@example.com', 'Laravel'); $message->to('foo@example.com')->cc('bar@example.com');});
注: メッセージ インスタンスは SwiftMailer メッセージ クラスを継承し、Mail::send クロージャに渡されます。これにより、すべての SwiftMailer メッセージ クラス メソッドにアクセスできるようになります。
$message->from($address, $name = null);$message->sender($address, $name = null);$message->to($address, $name = null);$message->cc($address, $name = null);$message->bcc($address, $name = null);$message->replyTo($address, $name = null);$message->subject($subject);$message->priority($level);$message->attach($pathToFile, array $options = []);// Attach a file from a raw $data string...$message->attachData($data, $name, array $options = []);// Get the underlying SwiftMailer message instance...$message->getSwiftMessage();
プレーンテキスト電子メール
デフォルトでは、send メソッドは、渡されたビューに HTML が含まれていると想定します。ただし、send メソッドの最初のパラメータに配列を渡し、プレーン テキスト ビューを指定して HTML ビューをマージすることができます。
または、単にプレーン テキストの電子メールを渡すこともできます。指定する配列のキーはテキストです:
Mail::send(['html.view', 'text.view'], $data, $callback);
Mail::send(['text' => 'view'], $data, $callback);
生のメソッドを使用して、元の文字列メールを直接送信できます:
添付ファイル
Mail::raw('Text to e-mail', function ($message){ //});
電子メールの添付ファイルを追加する場合、添付ファイルの表示名または MIME タイプの指定も必要になる場合があります。配列を 2 番目のパラメータとして Attach メソッドに渡すことができます。
Mail::send('emails.welcome', $data, function ($message) { // $message->attach($pathToFile); });
AttachData メソッドを使用して、生のバイト文字列を添付ファイルとして追加できます。たとえば、次のメソッドを使用して、メモリ内で生成された PDF をディスクに保存せずに添付ファイルに直接追加できます。
$message->attach($pathToFile, ['as' => $display, 'mime' => $mime]);
Inline Attachment
$message->attachData($pdf, 'invoice.pdf');$message->attachData($pdf, 'invoice.pdf', ['mime' => $mime]);
電子メールに画像をインライン化するのは、多くの場合扱いにくいものです。ただし、laravel は、メールに画像を添付して適切な CID を取得する便利な方法を提供します。メールビューで $message 変数の embed メソッドを使用する必要があります。 Laravel は $message 変数を自動的に作成し、それをメール ビューに渡すことを覚えておく必要があります。
生データをビューに埋め込む<body> Here is an image: <img src="<?php echo $message->embed($pathToFile); ?>"</body>
如果你希望嵌入一个原始数据到邮件信息中,你可以使用 $message 变量的 embedData 方法:
<body> Here is an image from raw data: <img src="<?php echo $message->embedData($data, $name); ?>"</body>
队列化邮件信息
由于发送邮件是非常消耗资源的一件事,这样会影响到应用的响应时间。所以很多开发者都选择使用队列来完成异步的邮件发送。Laravel 使用统一的队列接口来使这些非常简单。你需要使用 Mail 假面的 queue 方法来使邮件队列化:
Mail::queue('emails.welcome', $data, function ($message) { // });
该方法会自动的在队列添加发送邮件的任务,该任务会在后台自动的执行。当然,你需要先配置好队列。
延迟消息队列
如果你希望延迟执行邮件的发送队列。你需要使用 later 方法。你需要在方法的第一个参数传送一个你希望延迟执行的秒数:
Mail::later(5, 'emails.welcome', $data, function ($message) { //});
添加到指定的队列
如果你希望添加邮件任务到指定的队列,你需要使用 queueOn 和 laterOn 方法:
Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) { // });Mail::laterOn('queue-name', 5, 'emails.welcome', $data, function ($message) { // });
当开发一个发送邮件的服务时,你可能并不希望真实的去发送一个邮件。只需要模拟测试成功就可以了。laravel 提供了多种方式来禁用真实的邮件发送。
log 驱动
其中一个解决方案就是在本地开发时使用 log 邮件驱动。这个驱动会将所有的邮件信息写入到日志文件中。
通用的邮件
另外一个解决方案就是设置一个通用的邮件来接收所有的应用发出的邮件。这种方式,会使应用生成的所有邮件都发送到这个地址。你可以通过配置 config/mail.php 文件的 to 选项来进行设置:
'to' => [ 'address' => 'dev@domain.com', 'name' => 'Dev Example'],
mailtrap
最后,你也可以使用一些像 Mailtrap 和 smtp 驱动的服务来发送你的邮件到一个虚拟邮箱,而且你也可以通过真实的邮件客户端进行查看。这可以使你看到真实的邮件在 Mailtrap 中的显示效果。
laravel 会在发送邮件之前触发事件。你应该注意的是,它是在邮件发送之前触发事件,而不是添加到队列时。你可以在 EventServiceProvider 中注册一个事件监听者:
/** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'Illuminate\Mail\Events\MessageSending' => [ 'App\Listeners\LogSentMessage', ], ];