Laravel mail: передать строку вместо представления
Я хочу отправить электронное письмо с подтверждением, используя laravel.
Функция laravel Mail:: send() только, кажется, принимает путь к файлу в системе.
Проблема в том, что мои почтовые шаблоны хранятся в базе данных, а не в файле в системе.
Как передать простой контент по электронной почте?
Пример:
$content = "Hi,welcome user!";
Mail::send($content,$data,function(){});
Ответы
Ответ 1
update: В 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
});
Ответ 2
Для электронных писем Html
Mail::send(array(), array(), function ($message) use ($html) {
$message->to(..)
->subject(..)
->from(..)
->setBody($html, 'text/html');
});
Ответ 3
Класс Mailer передает строку addContent
, которая с помощью других методов вызывает views->make()
. В результате передача строки содержимого напрямую не будет работать, поскольку она попытается загрузить представление под этим именем.
Что вам нужно сделать, так это создать представление, которое просто echos $content
// mail-template.php
<?php echo $content; ?>
И затем вставьте строку в это представление во время выполнения.
$content = "Hi,welcome user!";
$data = [
'content' => $content
];
Mail::send('mail-template', $data, function() { });
Ответ 4
Если вы используете почтовые рассылки. Вы можете сделать что-то подобное в методе построения:
public function build()
{
return $this->view('email')
->with(['html'=>'This is the message']);
}
И вы просто запустите и создайте вид в лесу email.blade.php
в своей папке ресурсов.
Затем в лезвии вы можете ссылаться на свою строку с использованием синтаксиса laravel blade
<html>
<body>
{{$html}}
</body>
</html>
или
<html>
<body>
{!!$html!!}
</body>
</html>
Если ваш исходный текст содержит html-метку вверх
Я надеюсь, что это работает для тех, у кого есть шаблоны, хранящиеся в базе данных, и хочет использовать класс Mailables в Laravel.
Ответ 5
Это не имеет прямого отношения к вопросу, но для тех, которые ищут установку текстовой версии вашего письма при сохранении пользовательской версии 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()
оператор 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');
});
Надеюсь, это поможет вам.
Ответ 6
Для отправки необработанного HTML, текста и т.д. С помощью Laravel Mailables вы можете
переопределите Mailable-> send() в вашем Mailable и там, используйте метод в предыдущих ответах:
send([], [], function($message){ $message->setBody() } )
Нет необходимости вызывать $this-> view() для вашей функции сборки.
Ответ 7
Как Вам известно
Только почтовые сообщения могут быть поставлены в очередь.
это означает, что если вы используете интерфейс ShouldQueue
1) во-первых, вы всегда должны делать
php artisan queue:restart
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',
]);
}
Ответ 8
public function build()
{
$message = 'Hi,welcome user!'
return $this->html($message)->subject($message);
}