Laravel 5.4 ^ - Как настроить макет уведомления по электронной почте?
Я пытаюсь настроить макет электронной почты в формате HTML, который используется при отправке уведомлений по электронной почте.
Я опубликовал как почту, так и уведомления.
php artisan vendor:publish --tag=laravel-mail
php artisan vendor:publish --tag=laravel-notifications
Если я /resources/views/vendor/notifications/email.blade.php
файл /resources/views/vendor/notifications/email.blade.php
, я могу изменить только содержимое BODY отправляемых электронных писем. Я также хочу изменить нижний колонтитул, заголовок и все остальные части макета электронной почты.
Я попытался также изменить представления внутри /resources/vendor/mail/html/
, но всякий раз, когда уведомление отправляется, оно даже не использует эти представления и вместо этого использует стандартные рамки laravel.
Я знаю, что могу установить представление MailMessage
возвращаемое моим классом Notification, но я хочу сохранить стандартные функции line()
, greeting()
и т.д.
Кто-нибудь знает, как я могу получить свои уведомления для отправки электронной почты, используя представления в /resources/vendor/mail/html
?
![enter image description here]()
Ниже приведен мой файл /resources/views/vendor/notifications/email.blade.php
, но в нем нет места для настройки верхнего/нижнего колонтитула/общего макета.
@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level == 'error')
# Whoops!
@else
# Hello!
@endif
@endif
{{-- Intro Lines --}}
@foreach ($introLines as $line)
{{ $line }}
@endforeach
{{-- Action Button --}}
@if (isset($actionText))
<?php
switch ($level) {
case 'success':
$color = 'green';
break;
case 'error':
$color = 'red';
break;
default:
$color = 'blue';
}
?>
@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent
@endif
{{-- Outro Lines --}}
@foreach ($outroLines as $line)
{{ $line }}
@endforeach
<!-- Salutation -->
@if (! empty($salutation))
{{ $salutation }}
@else
Regards,<br>{{ config('app.name') }}
@endif
<!-- Subcopy -->
@if (isset($actionText))
@component('mail::subcopy')
If youre having trouble clicking the "{{ $actionText }}" button, copy and paste the URL below
into your web browser: [{{ $actionUrl }}]({{ $actionUrl }})
@endcomponent
@endif
@endcomponent
Ответы
Ответ 1
Запустите эту команду
php artisan vendor:publish --tag=laravel-notifications
php artisan vendor:publish --tag=laravel-mail
обновление для Laravel 5. 7+
php artisan vendor:publish
и тогда вы получите:
[<number>] Tag: laravel-mail
[<number>] Tag: laravel-notifications
а затем просто введите этот номер перед публикацией файла для редактирования
а затем в
/resources/views/vendor/mail/html/
вы можете редактировать все компоненты и настраивать все, что вы хотите.
Например, я отредактировал предложение "Все права защищены". на "Все тесты зарезервированы" внизу этого изображения внутри этого файла:
/resources/views/vendor/mail/html/message.blade.php
и вот что я получил:
![enter image description here]()
Ответ 2
Убедитесь, что вы правильно настроили конфигурацию в файле config/mail.php:
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
]
],
Ответ 3
Я написал статью о том, как создать уведомление и изменить ваш шаблон, включая верхний и нижний колонтитулы.
Он включает в себя объяснение того, как работают компоненты Laravel и как передать ваши данные в новый шаблон электронной почты.
https://medium.com/@adnanxteam/how-to-customize-laravel-5-4-notification-email-templates-header-and-footer-158b1c7cc1c
Наиболее важной частью является размещение следующего кода внутри шаблона электронной почты:
@component('mail::layout')
{{-- Header --}}
@slot('header')
@component('mail::header', ['url' => config('app.url')])
Header Title
@endcomponent
@endslot
{{-- Body --}}
This is our main message {{ $user }}
{{-- Subcopy --}}
@isset($subcopy)
@slot('subcopy')
@component('mail::subcopy')
{{ $subcopy }}
@endcomponent
@endslot
@endisset
{{-- Footer --}}
@slot('footer')
@component('mail::footer')
© {{ date('Y') }} {{ config('app.name') }}. Super FOOTER!
@endcomponent
@endslot
@endcomponent
Вы можете проверить среднюю статью, если хотите узнать больше о том, как работают компоненты и как правильно передавать данные.
Ответ 4
@Брайан
Вы можете просто внести изменения в директивы @component в вашем файле шаблона, чтобы использовать свои собственные шаблоны. Например:
Замените @component('mail::message')
на @component('vendor.mail.html.message')
, если ваш шаблон находится в /resources/views/vendor/mail/html/message.blade.php
Ответ 5
В итоге я просто использовал пользовательский вид вместо того, чтобы пытаться заставить встроенные Laravel работать.
Я добавил следующий оператор use
в класс Notification
use Illuminate\Support\Facades\View;
use Illuminate\Support\HtmlString;
use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;
Затем в методе toMail
:
public function toMail($notifiable)
{
$view_file = 'emails.teamInvitation';
$view = View::make($view_file, ['sender' => $this->sender, 'invitationToken' => $this->invitationToken, 'team' => $this->team ]);
$view = new HtmlString(with(new CssToInlineStyles)->convert($view));
return (new MailMessage)
->subject('PreSource Invitation From ' . $this->sender->name )
->view('emails.htmlBlank', ['bodyContent' => $view]);
}
emails.teamInvitation
- мой фактический шаблон электронной почты.
Я скомпилирую представление в строку, а затем преобразую таблицы стилей в строку.
emails.htmlBlank
- это файл вида, но все, что он делает, это echo out bodyContent
. Это необходимо, потому что метод MailMessage->view
ожидает файл вида, а не HtmlString.
Ответ 6
НЕ делайте то, что предлагается здесь.
Это работает. Просто помните, что вы должны редактировать шаблоны, содержащиеся в папке vendor/mail/html, а НЕ содержимое папки vendor/mail/markdown, если, конечно, вы не используете markdown вместо line()/reeting ( ) функции построения электронной почты
Вместо этого, запустите команды ремесленника, а затем отредактируйте сгенерированные файлы в вашей папке ресурсов, с которой вы в конечном итоге. Никогда не перезаписывайте файлы вендора, как будто вы работаете с локальной версией, затем перенесите ее на работающий сервер и запустите установку composer, таких изменений у вас больше не будет.
Наследование Laravel позволяет вам легко перезаписывать заранее определенные методы и файлы, поэтому используйте это для более чистого контроля версий и лучшей возможности отката изменений в основной функциональности.
Ответ 7
Вы делаете электронную почту на основе компонента @component('mail::message')
Это значение по умолчанию, и это только один из описанных в документации. Этот компонент не позволяет изменять заголовок. Однако, если вы посмотрите в этот файл,
\vendor\laravel\framework\src\Illuminate\Mail\resources\views\markdown\message.blade.php
вы увидите, что он использует другой компонент @component('mail::layout')
,
Просто скопируйте содержимое файла message.blade.php
в ваш .blade.php
и замените {{ $slot }}
тем, что было в вашем файле ранее.
И теперь у вас есть все гибкость в вашем файле.
плюс
если вы хотите изменить стили, перейдите в файл \config\mail.php
и изменить раздел markdown
как это так
'markdown' => [
'theme' => 'default0',
'paths' => [
resource_path('views/vendor/mail'),
base_path('resources/views/emails/vendor'),
],
],
В этом случае я заменил тему по умолчанию на мои собственные \resources\views\emails\vendor\html\themes\default0.css
или, если вы не хотите настраивать пути - поместите файл default0.css
в /resources/views/vendor/mail/html/themes
- это путь по умолчанию, и вам не нужно его упоминать.
Проверено на Laravel 5.7