メールのマニュアルには、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で削除されています。
なんで。
英語の時点で消えてるので、日本語訳の手抜きとかでもありません。
このような方法は推奨できない、必ずテンプレートを使え、ということでしょうか。