{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} == Введение == Laravel предоставляет простой API к популярной библиотеке ((http://swiftmailer.org/ SwiftMailer)) c драйверами для SMTP, Mailgun, Mandrill (для Laravel 5.2 и ранее), SparkPost, Amazon SES, функции PHP ((php:mail)), и %%(t)sendmail%%, поэтому вы можете быстро приступить к рассылке почты с помощью локального или облачного сервиса на ваш выбор. === Требования для драйверов === Драйверы на основе API, такие как Mailgun и SparkPost, зачастую работают проще и быстрее, чем SMTP-серверы. По возможности лучше использовать именно их. Для работы таких драйверов необходима HTTP-библиотека Guzzle, которую можно установить через менеджер пакетов Composer: %%(sh) composer require guzzlehttp/guzzle %% **Драйвер Mailgun** Для использования драйвера Mailgun установите Guzzle и задайте для параметра %%(t)driver%% значение %%(t)mailgun%% в конфигурационном файле %%(t)config/mail.php%%. Затем проверьте, что в конфигурационном файле %%(t)config/services.php%% есть следующие параметры: %% 'mailgun' => [ 'domain' => 'your-mailgun-domain', 'secret' => 'your-mailgun-key', ], %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Драйвер Mandrill** Для использования драйвера Mandrill установите Guzzle и задайте для параметра %%(t)driver%% значение %%(t)mandrill%% в конфигурационном файле %%(t)config/mail.php%%. Затем проверьте, что в конфигурационном файле %%(t)config/services.php%% есть следующие параметры: ~%% 'mandrill' => [ 'secret' => 'your-mandrill-key', ], ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) **Драйвер SparkPost** Для использования драйвера SparkPost установите Guzzle и задайте для параметра %%(t)driver%% значение %%(t)sparkpost%% в конфигурационном файле %%(t)config/mail.php%%. Затем проверьте, что в конфигурационном файле %%(t)config/services.php%% есть следующие параметры: ~%% 'sparkpost' => [ 'secret' => 'your-sparkpost-key', ], ~%% %% **Драйвер SES** Чтобы использовать драйвер Amazon SES, сначала установите Amazon AWS SDK для PHP. Вы можете установить эту библиотеку, добавив следующую строку в раздел %%(t)require%% файла %%(t)composer.json%% и выполнив команду %%(sh)composer update%%: %% "aws/aws-sdk-php": "~3.0" %% Затем задайте для параметра %%(t)driver%% значение %%(t)ses%% в конфигурационном файле %%(t)config/mail.php%% и проверьте, что в конфигурационном файле %%(t)config/services.php%% есть следующие параметры: %% 'ses' => [ 'key' => 'your-ses-key', 'secret' => 'your-ses-secret', 'region' => 'ses-region', // например, us-east-1 ], %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) == Создание отправляемых объектов == В Laravel каждый отправляемый приложением тип email-сообщения представлен "отправляемым" классом. Эти классы хранятся в папке %%(t)app/Mail%%. Если у вас нет такой папки, она будет сгенерирована при создании первого отправляемого класса командой %%(sh)make:mail%%: %%(sh) php artisan make:mail OrderShipped ~%% == Написание отправляемых объектов == Все настройки отправляемого класса происходят в методе %%build()%%. В этом методе вы можете вызывать различные другие методы, такие как %%from()%%, %%subject()%%, %%view()%% и %%attach()%%, для настройки содержимого и доставки email-сообщения. === Настройка отправителя === **Используя метод %%from()%%** Сначала давайте рассмотрим настройку отправителя email. Другими словами - от кого будет приходить email. Есть два способа настроить отправителя. Первый - с помощью метода %%from()%% в методе %%build()%% вашего отправляемого класса: ~%% /** * Создание сообщения. * * @return $this */ public function build() { return $this->from('example@example.com') ->view('emails.orders.shipped'); } ~%% **Используя глобальный адрес %%(t)from%%** Если ваше приложение использует одинаковый адрес отправителя для всех своих email-сообщений, то будет излишне вызывать метод %%from()%% в каждом генерируемом классе. Вместо этого вы можете указать глобальный адрес %%(t)from%% в файле настроек %%(t)config/mail.php%%. Этот адрес будет использован тогда, когда в отправляемом классе не указан никакой другой адрес отправителя: ~%% 'from' => ['address' => 'example@example.com', 'name' => 'App Name'], ~%% === Настройка представления === В методе %%build()%% отправляемого класса вы можете использовать метод %%view()%% для указания шаблона для построения содержимого email-сообщения. Поскольку обычно для построения содержимого всех email-сообщений используется ((//docs/v5/blade Blade-шаблон)), вам доступна вся мощь и всё удобство шаблонизатора Blade для создания HTML-кода ваших email-сообщений: ~%% /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped'); } ~%% .(alert) Вы можете создать папку %%(t)resources/views/emails%% для размещения всех ваших email-шаблонов, или любую другую папку в каталоге %%(t)resources/views%%. **Текстовые email-сообщения** Если вы хотите определить текстовую версию вашего email, используйте метод %%text()%%. Подобно методу %%view()%% метод %%text()%% принимает имя шаблона, который будет использован для построения содержимого email-сообщения. Вы можете определить обе версии вашего сообщения - HTML и текстовую: ~%% /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped') ->text('emails.orders.shipped_plain'); } ~%% === Данные представления === **Через общедоступные свойства** Обычно необходимо передать какие-либо данные в представление, которые можно использовать при построении HTML-кода email-сообщения. Есть два способа сделать данные доступными для вашего представления. Первый - любое общедоступное (%%(t)public%%) свойство, определённое в вашем отправляемом классе, автоматически станет доступным для представления. Например, вы можете передать данные в конструктор вашего отправляемого класса и поместить эти данные в общедоступные свойства, определённые в классе: ~%% order = $order; } /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped'); } } ~%% Когда данные помещены в общедоступное свойство, они автоматически станут доступны в вашем представлении, и вы можете обращаться к ним как к любым другим данным Blade-шаблонах: ~%%
Price: {{ $order->price }}
~%% **Через метод %%with()%%** Если вы хотите настроить формат данных вашего email-сообщения до того, как они будут отправлены в шаблон, вы можете вручную передать данные в представление методом %%with()%%. Вы будете по-прежнему передавать данные через конструктор отправляемого класса, но вам надо поместить эти данные в свойства %%(t)protected%% или %%(t)private%%, чтобы данные не были автоматически доступны шаблону. Затем при вызове метода %%with()%% передайте массив данных, которые должны быть доступны шаблону: ~%% order = $order; } /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped') ->with([ 'orderName' => $this->order->name, 'orderPrice' => $this->order->price, ]); } } ~%% После передачи данных в метод %%with()%% они автоматически станут доступны для вашего представления, и вы сможете обращаться к ним как к любым другим данным Blade-шаблонах: ~%%
Price: {{ $orderPrice }}
~%% %% === ((#вложения)) Вложения === %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Для добавления к письму вложений используйте метод %%attach()%% в методе %%build()%% отправляемого класса. Метод %%attach()%% принимает первым аргументом полный путь к файлу: ~%% /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped') ->attach('/path/to/file'); } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Для добавления к письму вложений служит метод %%attach()%% на объекте %%$message%%, переданном в ваше замыкание. Метод %%attach()%% принимает первым аргументом полный путь к файлу: ~%% Mail::send('emails.welcome', $data, function ($message) { // $message->attach($pathToFile); }); ~%% %% При добавлении файлов можно указать их ((ВП:MIME))-тип и/или отображаемое имя, передав массив вторым аргументом метода %%attach()%%: %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped') ->attach('/path/to/file', [ 'as' => 'name.pdf', 'mime' => 'application/pdf', ]); } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% $message->attach($pathToFile, ['as' => $display, 'mime' => $mime]); ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) **Вложение "сырых" данных** Метод %%attachData()%% можно использовать для добавления "сырой" строки байтов в качестве вложения. Например, вы можете использовать этот метод, если вы сгенерировали PDF в памяти и хотите прикрепить его к письму, не записывая на диск. Метод %%attachData()%% принимает "сырые" данные первым аргументом, имя файла вторым аргументом, и массив параметров третьим аргументом: ~%% /** * Создание сообщения. * * @return $this */ public function build() { return $this->view('emails.orders.shipped') ->attachData($this->pdf, 'name.pdf', [ 'mime' => 'application/pdf', ]); } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Метод %%attachData()%% можно использовать для добавления "сырой" строки байтов в качестве вложения. Например, вы можете использовать этот метод, если вы сгенерировали PDF в памяти и хотите прикрепить его к письму, не записывая на диск: ~%% $message->attachData($pdf, 'invoice.pdf'); $message->attachData($pdf, 'invoice.pdf', ['mime' => $mime]); ~%% %% === Строчные вложения === Обычно добавление строчных вложений - утомительное занятие, однако Laravel делает его проще, позволяя вам добавлять изображения и получать соответствующие CID. .(tl_note) Строчные вложения - файлы, не видимые получателю в списке вложений, но используемые внутри HTML-тела сообщения; CID - уникальный идентификатор внутри данного сообщения, используемый вместо URL в таких атрибутах, как %%(t)src%% - //прим. пер.// Для вставки строчного изображения используйте метод %%embed()%% на переменной %%$message%% в шаблоне вашего email. Laravel автоматически делает переменную %%$message%% доступной для всех шаблонов ваших сообщений, поэтому вам не надо передавать их вручную: %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% Вот какая-то картинка: ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Вот какая-то картинка: ~%% %% **Вставка файла из потока данных** Если у вас уже есть строка сырых данных для вставки в шаблон email-сообщения, вы можете использовать метод %%embedData()%% на переменной %%$message%%: %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% А вот картинка, полученная из строки с данными: ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% А вот картинка, полученная из строки с данными: ~%% %% == Отправка почты == %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Для отправки сообщений используйте метод %%to()%% ((//docs/v5/facades фасада)) %%(t)Mail%%. Метод %%to()%% принимает email-адрес, экземпляр пользователя или коллекцию пользователей. Если вы передадите объект или коллекцию объектов, то обработчик почты автоматически использует их свойства %%(t)email%% и %%(t)name%% для настройки получателей email-сообщения, поэтому эти атрибуты должны быть доступны в ваших объектах. После настройки получателей вы можете передать экземпляр вашего отправляемого класса в метод %%send()%%: ~%% user())->send(new OrderShipped($order)); } } ~%% Само собой при отправке сообщений вы можете указать не только получателей %%(t)to%%. Вы можете задать получателей %%(t)to%%, %%(t)cc%% и %%(t)bcc%% одним сцепленным вызовом метода: ~%% Mail::to($request->user()) ->cc($moreUsers) ->bcc($evenMoreUsers) ->send(new OrderShipped($order)); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Laravel позволяет хранить почтовые сообщения в ((/docs/v5/views представлениях)). Например, вы можете расположить свои сообщения в папке %%(t)emails%%, создав её в папке %%(t)resources/views%%. Для отправки сообщения используется метод %%send()%% ((/docs/v5/facades фасада)) %%(t)Mail%%. Этот метод принимает три аргумента. Первый - имя ((/docs/v5/views представления)), которое содержит текст сообщения. Второй - массив данных, передаваемых в представление. Третий - функция-замыкание, получающая экземпляр сообщения, и позволяющая вам настроить различные параметры сообщения, такие как получатели, тема и т.д.: ~%% $user], function ($m) use ($user) { $m->from('hello@app.com', 'Your Application'); $m->to($user->email, $user->name)->subject('Your Reminder!'); }); } } ~%% Поскольку в этом примере мы передаём массив с ключом %%(t)user%%, мы можем отобразить имя пользователя в нашем представлении с помощью такого PHP-кода: ~%% name; ?> ~%% .(alert) Переменная %%$message%% всегда передаётся в представления и позволяет вам прикреплять ((/docs/v5/mail#вложения вложения)). Поэтому вам не стоит передавать одноимённую переменную с данными для представления. **Построение сообщения** Как уже было сказано, третий аргумент метода %%send()%% - замыкание, которое позволяет указать различные настройки для самого сообщения. С помощью этого замыкания вы можете задать другие атрибуты сообщения, такие как явная рассылка на несколько адресов, скрытая рассылка на несколько адресов, и т.д.: ~%% Mail::send('emails.welcome', $data, function ($message) { $message->from('us@example.com', 'Laravel'); $message->to('foo@example.com')->cc('bar@example.com'); }); ~%% Ниже приведён список доступных методов для экземпляра построителя сообщения %%$message%%: ~%% $message->from($address, $name = null); $message->sender($address, $name = null); $message->to($address, $name = null); $message->cc($address, $name = null); $message->bcc($address, $name = null); $message->replyTo($address, $name = null); $message->subject($subject); $message->priority($level); $message->attach($pathToFile, array $options = []); // Прикрепить файл из сырой $data string... $message->attachData($data, $name, array $options = []); // Получить низкоуровневый экземпляр сообщения SwiftMailer... $message->getSwiftMessage(); ~%% .(alert) Экземпляр сообщения, передаваемый замыканию метода %%Mail::send()%%, наследует класс сообщения SwiftMailer, что позволяет вам вызывать любые методы этого класса для создания своего сообщения. **Отправка простого текста** По умолчанию ожидается, что передаваемое в метод %%send()%% представление содержит HTML. Но передавая первым аргументом метода %%send()%% массив, вы можете указать простое текстовое представление вдобавок к HTML-представлению: ~%% Mail::send(['html.view', 'text.view'], $data, $callback); ~%% А если вам надо отправить только простой текст, вы можете указать это при помощи ключа %%(t)text%% в массиве: ~%% Mail::send(['text' => 'view'], $data, $callback); ~%% **Отправка сырых строк** Если вам надо отправить непосредственно простую строку, используйте метод %%raw()%%: ~%% Mail::raw('Text to e-mail', function ($message) { // }); ~%% %% == Очереди отправки == **Помещение сообщения в очередь отправки** Из-за того, что отправка сообщений может сильно повлиять на время обработки запроса, многие разработчики помещают их в очередь на фоновую отправку. Laravel позволяет легко делать это, используя ((docs/v5/queues единое API очередей)). Для помещения сообщения в очередь просто используйте метод %%queue()%% фасада %%(t)Mail%% после настройки получателей сообщения: %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% Mail::to($request->user()) ->cc($moreUsers) ->bcc($evenMoreUsers) ->queue(new OrderShipped($order)); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Mail::queue('emails.welcome', $data, function ($message) { // }); ~%% %% Этот метод автоматически позаботится о помещении задачи в очередь, поэтому сообщение будет отправлено в фоне. Не забудьте ((docs/v5/queues настроить механизм очередей)) перед использованием данной возможности. **Задержка отправки сообщения** Вы можете задержать отправку сообщения на нужное число секунд методом %%later()%%. Первый аргумент метода - экземпляр %%(t)DateTime%%, указывающий, когда необходимо отправить сообщение: %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% $when = Carbon\Carbon::now()->addMinutes(10); Mail::to($request->user()) ->cc($moreUsers) ->bcc($evenMoreUsers) ->later($when, new OrderShipped($order)); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Mail::later(5, 'emails.welcome', $data, function ($message) { // }); ~%% %% **Помещение сообщения в определённую очередь** %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Поскольку все генерируемые командой %%(sh)make:mail%% отправляемые классы используют типаж %%(t)Illuminate\Bus\Queueable%%, вы можете вызывать методы %%onQueue()%% и %%onConnection()%% на любом экземпляре отправляемого класса, что позволяет вам указывать название подключения и имя очереди для сообщения: ~%% $message = (new OrderShipped($order)) ->onConnection('sqs') ->onQueue('emails'); Mail::to($request->user()) ->cc($moreUsers) ->bcc($evenMoreUsers) ->queue($message); ~%% **Помещение в очередь по умолчанию** Если у вас есть отправляемые классы, которые необходимо всегда помещать в очередь, вы можете реализовать контракт %%(t)ShouldQueue%% в классе. Тогда даже при вызове метода %%send()%% отправляемый объект будет помещаться в очередь, поскольку он реализует контракт %%(t)ShouldQueue%%: ~%% use Illuminate\Contracts\Queue\ShouldQueue; class OrderShipped extends Mailable implements ShouldQueue { // } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Если вы хотите поместить сообщение в определённую очередь отправки, то используйте методы %%queueOn()%% и %%laterOn()%%: ~%% Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) { // }); Mail::laterOn('queue-name', 5, 'emails.welcome', $data, function ($message) { // }); ~%% %% == Почта и локальная разработка == На стадии разработки приложения обычно предпочтительно отключить доставку отправляемых сообщений. В Laravel есть несколько способов "отключить" реальную отправку почтовых сообщений во время разработки. **Драйвер Log** Вместо отправки сообщений почтовый драйвер %%(t)log%% будет заносить все сообщения в ваши журналы для возможности их просмотра. Подробнее о настройке различных окружений для приложения читайте в ((/docs/v5/installation#настройка документации по настройке)). %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Вы можете либо вызывать метод %%Mail::pretend()%%, либо установить параметр **pretend** в значение %%true%% в файле настроек %%(t)config/mail.php%%. Когда это сделано, сообщения будут записываться в журнал вашего приложения, вместо отправки получателю. %% **Универсальный получатель** Другой вариант - задать универсального получателя для всех сообщений от фреймворка. при этом все сообщения, генерируемые вашим приложением, будут отсылаться на заданный адрес, вместо адреса, указанного при отправке сообщения. Это можно сделать с помощью параметра %%(t)to%% в файле настроек %%(t)config/mail.php%%: %% 'to' => [ 'address' => 'example@example.com', 'name' => 'Example' ], %% **Mailtrap** И наконец, вы можете использовать сервис ((https://mailtrap.io MailTrap)) и драйвер %%(t)smtp%% для отправки ваших почтовых сообщений на фиктивный почтовый ящик, где вы сможете посмотреть их при помощи настоящего почтового клиента. Преимущество этого вариант в том, что вы можете проверить то, как в итоге будут выглядеть ваши почтовые сообщения, при помощи средства для просмотра сообщений Mailtrap. == События == %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Laravel генерирует событие непосредственно перед отправкой почтовых сообщений. Учтите, это событие возникает при //отправке// сообщения, а не при помещении его в очередь. Вы можете зарегистрировать слушатель для этого события в своём %%(t)EventServiceProvider%%: ~%% /** * Отображения слушателя событий для приложения. * * @var array */ protected $listen = [ 'Illuminate\Mail\Events\MessageSending' => [ 'App\Listeners\LogSentMessage', ], ]; ~%% %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Laravel генерирует событие %%(t)mailer.sending%% непосредственно перед отправкой почтовых сообщений. Учтите, это событие возникает при //отправке// сообщения, а не при помещении его в очередь. Вы можете зарегистрировать слушатель события в своём %%(t)EventServiceProvider%%: ~%% /** * Регистрация всех остальных событий для вашего приложения. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); $events->listen('mailer.sending', function ($message) { // }); } ~%% %%