web-dev-qa-db-ja.com

Laravel mail:ビューの代わりに文字列を渡す

Laravelを使用して確認メールを送信したい。 laravel Mail :: send()関数は、システム上のファイルへのパスのみを受け入れるようです。問題は、メールテンプレートがシステム上のファイルではなくデータベースに保存されることです。 。

プレーンコンテンツをメールに渡すにはどうすればよいですか?

例:

$content = "Hi,welcome user!";

Mail::send($content,$data,function(){});
40
nexana

更新:Laravel 5では、代わりにrawを使用できます:

Mail::raw('Hi, welcome user!', function ($message) {
  $message->to(..)
    ->subject(..);
});

これがあなたのやり方です:

Mail::send([], [], function ($message) {
  $message->to(..)
    ->subject(..)
    // here comes what you want
    ->setBody('Hi, welcome user!'); // assuming text/plain
    // or:
    ->setBody('<h1>Hi, welcome user!</h1>', 'text/html'); // for HTML rich messages
});
89
Jarek Tkaczyk

HTMLメールの場合

Mail::send(array(), array(), function ($message) use ($html) {
  $message->to(..)
    ->subject(..)
    ->from(..)
    ->setBody($html, 'text/html');
});
38
Sajjad Ashraf

Mailerクラスは、文字列をaddContentに渡します。これは、さまざまな他のメソッドを介してviews->make()を呼び出します。その結果、コンテンツの文字列を直接渡すことは、その名前でビューをロードしようとするため、機能しません。

あなたがする必要があるのは、単にエコーするビューを作成することです$content

// mail-template.php
<?php echo $content; ?>

そして、実行時にそのビューに文字列を挿入します。

$content = "Hi,welcome user!";

$data = [
    'content' => $content
];

Mail::send('mail-template', $data, function() { });
13
Ben Swinburne

郵便物を使用していた場合。 buildメソッドで次のようなことができます:

public function build()
{

    return $this->view('email')
        ->with(['html'=>'This is the message']);
}

そして、先に進み、ブレードビューを作成しますemail.blade.phpリソースフォルダー。

次に、ブレードでlaravelブレード構文を使用して文字列を参照できます

 <html>
    <body>
      {{$html}}
    </body>
  </html>

または

 <html>
            <body>
              {!!$html!!}
            </body>
          </html>

生のテキストにhtmlマークアップが含まれている場合、データベースにテンプレートが保存されており、LaravelのMailablesクラスを利用したい人にこれが機能することを願っています。

2

質問に直接関連するものではありませんが、カスタムHTMLバージョンを保持したまま電子メールのプレーンテキストバージョンの設定を検索する場合は、次の例を使用できます。

_Mail::raw([], function($message) {
    $message->from('[email protected]', 'Company name');
    $message->to('[email protected]');
    $message->subject('5% off all our website');
    $message->setBody( '<html><h1>5% off its awesome</h1><p>Go get it now !</p></html>', 'text/html' );
    $message->addPart("5% off its awesome\n\nGo get it now!", 'text/plain');
});
_

「しかし、なぜ最初の引数をプレーンテキストとして設定しないのですか?」と尋ねる場合は、テストを行い、html部分のみを取り、生の部分は無視します。

追加の変数を使用する必要がある場合、匿名関数では次のようにuse()ステートメントを使用する必要があります。

_Mail::raw([], function($message) use($html, $plain, $to, $subject, $formEmail, $formName){
    $message->from($fromEmail, $fromName);
    $message->to($to);
    $message->subject($subject);
    $message->setBody($html, 'text/html' ); // dont miss the '<html></html>' or your spam score will increase !
    $message->addPart($plain, 'text/plain');
});
_

皆さんのお役に立てば幸いです。

1
Anwar
public function build()
{
    $message = 'Hi,welcome user!'
    return $this->html($message)->subject($message);
}
1
jeidison farias

あなたが知っているように

キューイングできるのは郵送物のみです。

つまり、ShouldQueueインターフェイスを使用する場合

1)最初に、あなたはいつもするべきです

php artisan queue:restart

2)2番目に、メール可能ファイルでhtmlメソッドを使用できます(laravel 5.8でテスト済み)

public function build(): self
{
    return $this
            ->html('
                <html>
                    <body>
                        ForwardEmail
                    </body>
                </html>
            ')
            ->subject(config('app.name') . ' ' . 'email forwarded')
            ->attachData($this->content, 'email.eml', [
                'mime' => 'application/eml',
    ]);
}
0

Laravel Mailablesを使用して生のHTML、テキストなどを送信するには

mailableでMailable-> send()をオーバーライドし、そこで、前の応答のメソッドを使用します。

send([], [], function($message){ $message->setBody() } )

ビルド関数で$ this-> view()を呼び出す必要はまったくありません。

0
patrox