Не получая переменную $message в поле зрения от Laravel HTML Mailable (NON Markdown)
Я прочитал несколько подобных вопросов, связанных с этой проблемой, но все они относятся к Markdown mailable.
Я пытаюсь отправить встроенные изображения в почтовых ящиках, но я не нашел способа сделать это правильно (Laravel 5.5).
Документация гласит следующее:
Встроенные Вложения
Встраивание встроенных изображений в ваши электронные письма обычно является громоздким; однако Laravel предоставляет удобный способ прикрепления изображений к вашим электронным письмам и извлечения соответствующий
CID
. Чтобы встроить встроенное изображение, используйте методembed
для переменной$message
в шаблоне электронной почты. Laravel автоматически делает переменную$message
доступной для всех ваших шаблонов электронной почты, поэтому вам не нужно беспокоиться о передаче ее вручную:<body> Here is an image: <img src="{{ $message->embed($pathToFile) }}"> </body>
Но, делая это, я получаю эту ошибку:
Неопределенной переменной: сообщение (вид: /путь/к/проекта/ресурсы/просмотров/сообщений/new_user_welcome.лезвие.php)
Я знаю, что это имеет ограничение при использовании сообщения Markdown , но я не использую одно.
Это связанные файлы:
Почта / NewUserWelcomeEmail.php
class NewUserWelcomeEmail extends Mailable
{
use SerializesModels;
public function build()
{
return $this->view('mails.new_user_welcome');
}
}
Ресурсы / просмотры / почта / new_user_welcome.лезвие.php
@extends('layouts.mail')
@section('content')
<img src="{{ $message->embed(url("storage/images/inline_image.png")) }}"
alt="An inline image" />
@endsection
App / Http / Controllers / UserController.php
public function register(NewUserRequest $request)
{
// some code
Mail::to($user)->send(new NewUserWelcomeEmail($user));
return 'done';
}
4 ответа:
Ну, честно говоря, я не нашел способа заставить это работать должным образом. Я имею в виду, что в нынешнем виде это должно сработать. Может быть, это моя установка Laravel (?)..
Так или иначе, я заставил его работать с обходным путем.
1) используя Eduardokum ' Laravel Mail Auto Embed пакет, это в основном генерирует CID для каждого из ваших медиа-активов.
Но после добавления этого пакета это не сработало, как ожидалось.. Итак, я:
2) изменить то, каким я был. ссылаясь на мои активы, из этого:
<img src="{{ url("storage/a_inline_image.png") }}" />
К этому:
<img src="{{ asset("storage/a_inline_image.png") }}" />
Теперь это работает.
Если вы можете использовать так, чем это может быть работа по-другому, вы не используете переменную $message в почтовой колонке
Mail::send('emails.welcome', $data, function ($message) { $message->from('us@example.com', 'Laravel'); $message->to('foo@example.com')->cc('bar@example.com'); });
Если вы не хотите использовать этот метод, чем вы можете использовать вот так
Https://code.tutsplus.com/tutorials/how-to-send-emails-in-laravel--cms-30046
Это может быть такая работа.
В моем случае (Larvel 5.5 ) мне удалось изменить логотип заголовка как в html, так и в markdown.
Документация Laravel , хотя и действительно отличная, могла бы быть лучше в этом отношении.
В любом случае, выполните следующие действия, и все будет в порядке...
- публикуйте шаблоны почты через
php artisan vendor:publish --tag=laravel-mail
, чтобы вы могли легко изменять исходные файлы почты.Изменить
message.blade.php
вresources/views/vendor/mail/html
следующим образом:
@slot('header') @component('mail::header', ['url' => config('app.url')]) <img src="{{asset('assets/img/pathToYourImage...')}}"> @endcomponent @endslot
Все ваши электронные письма отныне должен получать логотип через CID.
Примечание:
В этом примере Laravel автоматически преобразует активы в CID, поэтому вам не нужно вызывать
$message->embed(...
вообще...Пожалуйста, протестируйте подробно, с этими каталогами html/markdown и директивами blade. Это немного сложно, но это определенно, делает свое волшебство...
Вы должны определить переменную пути к файлу в вашем Mailable как public property - > example $pathToFile.
Если у вас есть путь к файлу из-за пределов почтового ящика, вы можете передать его с помощью конструктора.
class NewUserWelcomeEmail extends Mailable { use SerializesModels; // Must be public public $pathToFile; /** * Create a new message instance. */ public function __construct(string $pathToFile) { $this->pathToFile= $pathToFile; } public function build() { return $this->view('mails.new_user_welcome'); } }
Тогда он работает так, как и ожидалось в вашем представлении, например:
@extends('layouts.mail') @section('content') <img src="{{ $message->embed(url($pathToFile)) }}" alt="An inline image" /> @endsection