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

тегистатьи IT, уроки по Laravel, laravel, email, отправка письма




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Да здравствует PHP!
Знакомство и установка NUnit
Урок 19. Оператор if...else JavaScript