Узнайте, как отправлять электронные письма с помощью markdown. Благодаря этой новой возможности в Laravel 5.4 вам больше не нужно беспокоиться о написании HTML и встроенных стилей CSS.
Содержание
Лучший способ создания email.
Начиная с версии Laravel 5.4 мы можем писать письма, используя Markdown, но не только это.
Мы можем повторно использовать компоненты между письмами, которые мы отправляем, используя Blade.
В этом посте мы рассмотрим, как создать письмо, подобное следующему, в 3 простых шага:
Шаги, которые необходимо выполнить
- Первое, что мы сделаем, это создадим класс, который наследуется от Mailable. Этот класс будет управлять отправкой почты.
- Затем мы создадим представление, используя Markdown, с содержимым письма, которое мы собираемся отправить.
- Наконец, мы используем наш класс, наше представление и отправим письмо.
Почта
Почему нужно создать класс?
Согласно документации:
В Laravel каждый тип письма, которое мы отправляем из нашего приложения, представлен классом Mailable.
Эти уроки будут проходить в app\Mail.
И при этом нам не нужно беспокоиться о создании ни этой папки, ни класса, потому что это сделает за нас команда:
php artisan make:mail OrderShipped --markdown=emails.orders.shipped
Примечание: Приведенная выше команда создает класс OrderShipped и файл shipped.blade.php в resources/views/emails/orders
Этот пример приведен в документации Laravel. Мы должны адаптировать его в соответствии с нашей задачей.
Например, прямо сейчас я хочу создать письмо с подтверждением для новых пользователей, и я это сделаю следующим образом:
php artisan make:mail EmailConfirmation --markdown=emails.users.confirmation
В результате мы создали наш класс и наше представление.
Шаблон с использованием Markdown
Наше представление, созданное с помощью этой команды, уже имеет содержимое по умолчанию, которое использует Markdown:
@component('mail::message')
# Introduction
The body of your message.
@component('mail::button', ['url' => ''])
Button Text
@endcomponent
Thanks,<br>
{{ config('app.name') }}
@endcomponent
Code language: PHP (php)
Если вы сравните это содержимое с изображением вверху, вы заметите, как каждый компонент сам заботится о назначении встроенных стилей.
Настройка компонентов
Мы можем создавать свои собственные компоненты.
Или получить компоненты по умолчанию, чтобы редактировать их по своему усмотрению.
Чтобы получить доступ к этим стилям и изменить их, мы должны использовать следующую команду:
php artisan vendor:publish --tag=laravel-mail
Эта команда:
- Извлекает компоненты в resources/views/vendor/mail. В 2 папки: html и markdown.
- Создает папку resources/views/vendor/mail/html/themes с файлом default.css, содержащим тему по умолчанию для наших писем.
Если мы хотим, мы можем определить новую тему, создав новый CSS-файл в папке themes. В то время как тема, которая будет использоваться, указывается в config/mail.php.
Примечание: Создание этих файлов не означает, что мы должны перезаписать все компоненты. Также нам не нужно вносить изменения в сгенерированные файлы.
В качестве примера я перезаписал только компонент сообщения.
@component('mail::layout')
{{-- Header --}}
@slot('header')
@component('mail::header', ['url' => config('app.url')])
{{ config('app.name') }}
@endcomponent
@endslot
![Логотип$slot }}
{{-- Footer --}}
@slot('footer')
@component('mail::footer')
© {{ date('Y') }} {{ config('app.name') }}. Все'/configuracion') }}
@endcomponent
@endslot
[logo]: https://mysite.eu/images/mago/mago-200x200.png
@endcomponent
Code language: PHP (php)
Я поместил этот компонент сообщения в resources/views/emails.
Таким образом, resources/views/emails/users/confirmation.blade.php выглядит следующим образом:
@component('emails.message')
# Приветственное письмо
Здравствуйтетвуйтейте$user->name }}, добро'mail::button', [ 'url' => $emailConfirmationUrl ])
Нажмите
Code language: PHP (php)
Примечание: Я могу использовать $emailConfirmationUrl, поскольку он также определен в классе EmailConfirmation как публичный атрибут. Другой альтернативой является использование функции with для введения переменных в представление.
Отправка почты
Команда создала для нас класс и представление.
После редактирования представления в соответствии с нашей задачей, следующее, что нужно сделать, это “отправить письмо”.
Как это сделать?
Mail::to($user)->send(new EmailConfirmation($user));
Code language: PHP (php)
Эта фраза говорит сама за себя:
Отправляет письмо типа EmailConfirmation пользователю $user.
Почему мы передаем параметр новому экземпляру EmailConfirmation?
Это нужно для того, чтобы мы могли использовать данные пользователя в представлении.
И сейчас мы на это посмотрим.
Использование переменных в представлении почты
В этом случае класс EmailConfirmation получает объект $user. Но наш Mailable может принимать данные любого типа.
В этом случае наш класс адаптируется следующим образом:
class EmailConfirmation extends Mailable
{
use Queueable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function build()
{
return $this->markdown('emails.users.confirmation');
}
}
Code language: PHP (php)
До и после
Способ отправки электронной почты, который использовался в предыдущих версиях Laravel, по-прежнему доступен.
Давайте быстро рассмотрим сравнение.
Вот как я отправлял сообщение с подтверждением раньше:
Mail::send('emails.users.confirmation', $data, function($message) use ($data) {
$message->to($data['email'], $data['name'])->subject('Пожалуйста, подтвердите свою электронную почту');
});
Code language: PHP (php)
А вот как выглядит код с использованием Mailables:
Mail::to($user)->send(new EmailConfirmation($user));
Code language: PHP (php)
Что мы упустили?
Правильно. Тему письма.
Мы должны поместить эти данные в метод build метода EmailConfirmation:
public function build()
{
return $this->markdown('emails.users.confirmation')->subject('Пожалуйста, подтвердите свою электронную почту');
}
Code language: PHP (php)
Этот метод должен “собрать наше письмо”, указывая представление, которое мы будем использовать.
В дополнение к указанию темы мы также можем прикреплять файлы к нашему письму.
Заключение
Нам больше не нужно бороться с CSS.
Мы можем использовать Markdown вместо HTML.
Мы можем использовать (и создавать свои собственные) компоненты.