Урок 20. Продолжение страницы контактов, или отправка писем с вложением Laravel
На предыдущем уроке мы создали страницу контактов. Давайте теперь заставим её отправлять нам письма.
Создание Laravel Mailable
Каждое письмо, отправленное в приложении Laravel, представлено как "отправляемое по почте" (mailable) на случай, если вам интересно название.
php artisan make:mail ContactFormMail --markdown=template.client.contactformПриведенная выше команда создаст файл в каталоге resources > views > template > client, а также создаст файл для отправки по почте в app > Mail > ContactFormMail.php.
В ContactFormMail.php у нас есть следующий фрагмент кода, который позволяет нам отправлять письма без вложений:
<?php namespace App\Mail; use App\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class ContactFormMail extends Mailable { use Queueable, SerializesModels; /** * Создаем новый экземпляр сообщения. * * @return void */ public function __construct($data) { $this->user = $data; } /** * Создаем сообщение * * @return $this */ public function build() { return $this->from('noreply@domain.com') ->markdown('template.client.contactform') ->with([ 'subject' => $this->user['subject'], 'message' => $this->user['message'], 'email' => $this->user['email'], 'phone_number' => $this->user['phone_number'], 'fullname' => $this->user['fullname'], ]); } }Давайте немного разберем этот код.
В методе _construct я анализирую все пользовательские данные в качестве параметра и переназначаю их. В методе сборки выполняется вся конфигурация класса, доступного для отправки по почте.
Метод from указывает отправителя почты, то есть от кого приходит почта (в моем случае noreply@domain.com ).
Метод with позволяет вам настроить способ отображения писем в соответствии с созданной уценкой. В этой статье мы назначим все поля парам ключей и значений в массиве, чтобы в рамках markdown мы могли получить доступ к каждому значению с помощью его собственного уникального ключа.
Метод markdown принимает имя шаблона markdown, который будет отображаться с дополнительным параметром данных (если мы не использовали метод with).
И, наконец, метод to указывает получателя письма. В домашнем контроллере выше измените 'receipent@domain.com' - на адрес фактического получателя.
Добавьте данные в файл markdown
Теперь нам нужно настроить файл markdown в каталоге resources > views > template > client. Поскольку у нас уже есть пары значений ключей, проще ссылаться на ключи в файле markdown, как показано ниже:
@component('mail::message') # {{$subject}} ## {{$message}} Feel free to contact me via {{$phone}} or {{$email}} Thanks,<br> {{$fullname}} {{ config('app.name') }} @endcomponentНа данный момент мы почти закончили. Теперь вы узнали, как отправлять электронное письмо без вложений. Далее давайте посмотрим, как это сделать с помощью вложения.
Отправка писем с вложением
Laravel уже поставляется с мощной файловой системой, поэтому отправка писем с вложением не слишком сложна. Мы будем использовать эту функцию и создадим хранилище для пользователей, где мы будем хранить их прикрепленные файлы в приложении.
php artisan storage:linkПРИМЕЧАНИЕ: В HomeController выше я уже указал каталог хранения для загрузок. Вы должны сделать то же самое, создав папку (назвав её contact) в storage > app > public > contact.
Также в config > filesystems.php проверьте и убедитесь, что диск файловой системы по умолчанию настроен на возврат ['default' => 'public'].
Теперь в ContactFormMail.php выглядит вот так. Теперь мы можем использовать метод attachFromStorage, который ссылается на путь к файлу.
<?php namespace App\Mail; use App\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class ContactFormMail extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public $user; public function __construct($data) { $this->user = $data; } /** * Build the message. * * @return $this */ public function build() { return $this->from('noreply@domain.com') ->markdown('template.client.contactform') ->attachFromStorage($this->user['screenshot']) ->with([ 'subject' => $this->user['subject'], 'message' => $this->user['message'], 'email' => $this->user['email'], 'phone_number' => $this->user['phone_number'], 'fullname' => $this->user['fullname'] ]); } }Единственным дополнением здесь будет attachFromStorage. Он используется для обработки вложенных файлов (изображений или pdf) в течение всего процесса рассылки.
В файле markdown, который мы использовали ранее, мы можем немного переработать его, чтобы он выглядел так, как показано ниже:
<div class="row"> <h1 class="text-dark">{{$subject}}</h1> <h3>{{$message}}</h3> <h4>You can reach me via mail or telephone : {{$email}} or {{$phone_number}}<br/> Thanks </h4> </div>
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.