Урок 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты