26
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

メールのマニュアルには、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で削除されています
なんで。

英語の時点で消えてるので、日本語訳の手抜きとかでもありません。
このような方法は推奨できない、必ずテンプレートを使え、ということでしょうか。

26
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?