PHP
laravel
laravel5.7

【Laravel5.7】文面固定のテキストメールを送りたい

メールのマニュアルには、Mailableをextendsしたクラスを用意してBladeで書いたテンプレをviewで指定してデータをwithでカスタマイズして、とやたら面倒臭いことが書いてあります。

実際はSMTP送信するMailableが最初からデフォルトで用意されているので、それを使えばわざわざMailableを作る必要はありません。

$params = ['foo'=>'bar', 'hoge'=>'fuga'];

$ret = Mail::send('emails.template', $params, function ($message) {
$message
->to('送信先'))
->from('送信元')
->subject('件名');
});

これで、.envに書かれているMAIL_HOST、MAIL_USERNAME、MAIL_PASSWORDに従ってメールが送信されます

複雑な処理を必要とするメールでもないかぎり、これで十分でしょう。

しかしテンプレとかいらない、ただ単に文面固定のテキストメールを送りたいだけなんだ、という要望にはこれでもまだオーバースペックです。

もっとこう、Mail::from($from)->to($to)->title($title)->body($body)->send();みたいなのはないのか?


答え

$ret = Mail::raw('本文', function ($message) {

$message->to('送信先'))->from('送信元')->subject('件名');
});

// もしくは
$ret = Mail::send(['raw'=>'本文'], function ($message) {
$message->to('送信先'))->from('送信元')->subject('件名');
});

たったこれだけ調べるのにどんだけ苦労したと思ってるんだ!

メール送信の本文はIlluminate\Mail\Mailerあたりに書かれているのですが、これがもうわけがわからない。

    /**

* @param string|array|\Illuminate\Contracts\Mail\Mailable $view
* @param array $data
* @param \Closure|string $callback
* @return void
*/

public function send($view, array $data = [], $callback = null)
{
if ($view instanceof MailableContract) {
return $this->sendMailable($view);
}

[$view, $plain, $raw] = $this->parseView($view);

$data['message'] = $message = $this->createMessage();

call_user_func($callback, $message);

$this->addContent($message, $view, $plain, $raw, $data);

if (isset($this->to['address'])) {
$this->setGlobalToAndRemoveCcAndBcc($message);
}

$swiftMessage = $message->getSwiftMessage();

if ($this->shouldSendMessage($swiftMessage, $data)) {
$this->sendSwiftMessage($swiftMessage);
$this->dispatchSentEvent($message, $data);
}
}

これで$view['raw']に値があればプレーンテキストメール送信だと理解る人がどれだけ存在するのかと。

ソースを辿ってSwift_DependencyContainerあたりに行き着いたところで、ソースから解読するのを諦めました。


マニュアル

実はこのMail::raw、公式マニュアルのLaravel5.2版には記載されていたのですが、5.3で削除されています

なんで。

英語の時点で消えてるので、日本語訳の手抜きとかでもありません。

このような方法は推奨できない、必ずテンプレートを使え、ということでしょうか。