Не получая переменную $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 6

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 , хотя и действительно отличная, могла бы быть лучше в этом отношении.

В любом случае, выполните следующие действия, и все будет в порядке...
  1. публикуйте шаблоны почты через php artisan vendor:publish --tag=laravel-mail, чтобы вы могли легко изменять исходные файлы почты.
  2. Изменить 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

  3. Все ваши электронные письма отныне должен получать логотип через 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