Работа с e-mail
11.x
.
Почему это важно?
Настройка
Laravel предоставляет простой интерфейс к популярной библиотеке SwiftMailer. Главный файл настроек – app/config/mail.php
– содержит всевозможные параметры, позволяющие вам менять SMTP-сервер, порт, логин, пароль, а также устанавливать глобальный адрес from
для исходящих сообщений. Вы можете использовать любой SMTP-сервер, либо стандартную функцию PHP mail
– для этого установите параметр driver
в значение mail
. Кроме того, доступен драйвер sendmail
.
Отправка через API
Laravel содержит драйвера отправки почты через HTTP API сервисов Mailgun и Mandrill. Отправка через API как правило работает в разы быстрее, чем отправка через протокол SMTP. Оба этих брайвера требуют наличия пакета Guzzle для осуществления HTTP-запросов. Чтобы включить его в свое приложение, добавьте в composer.json
"guzzlehttp/guzzle": "~4.0"
и выполните
composer update
Драйвер Mailgun
В файле app/config/mail.php
установите опцию driver
в 'mailgun’. Создайте файл app/config/services.php
, в котором укажите данные вашего аккаунта на mailgun.com :
'mailgun' => array(
'domain' => 'your-mailgun-domain',
'secret' => 'your-mailgun-key',
),
Драйвер Mandrill
В файле app/config/mail.php
установите опцию driver
в 'mandrill’. Создайте файл app/config/services.php
, в котором укажите данные вашего аккаунта на mandrill.com :
'mandrill' => array(
'secret' => 'your-mandrill-key',
),
Log Driver
Если в файле app/config/mail.php
установить опцию driver
в 'log’, то все отправляемые письма будут записываться в лог-файл фреймворка и не будут рассылаться. Этот вариант используется для отладки.
Основы использования
Метод Mail::send
используется для отправки сообщения:
Mail::send('emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'Джон Смит')->subject('Привет!');
});
Первый параметр – имя шаблона, который должен использоваться для текста сообщения. Второй – ассоциативный массив переменных, передаваемых в шаблон, и доступных там по ключу массива. Третий – функция-замыкание, позволяющая вам произвести дополнительные настройки сообщения.
Примечание: переменная
$message
всегда передаётся в ваш шаблон и позволяет вам прикреплять вложения. Таким образом, вам не стоит передавать одноимённую переменную в массиве$data
.
В дополнение к шаблону в формате HTML вы можете указать текстовый шаблон письма:
Mail::send(array('html.view', 'text.view'), $data, $callback);
Вы также можете оставить только один формат, передав массив с ключом html
или text
:
Mail::send(array('text' => 'view'), $data, $callback);
Вы можете указывать другие настройки для сообщения, например, копии или вложения:
Mail::send('emails.welcome', $data, function($message)
{
$message->from('[email protected]', 'Laravel');
$message->to('[email protected]')->cc('[email protected]');
$message->attach($pathToFile);
});
При добавлении файлов можно указывать их MIME-тип и/или отображаемое имя:
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
Примечание: Объект $message, передаваемый функции-замыканию метода
Mail::send
, наследует класс собщения SwiftMailer, что позволяет вам вызывать любые методы для создания своего сообщения.
Добавление встроенных вложений
Обычно добавление встроенных вложений в письмо обычно утомительное занятие, однако Laravel делает его проще, позволяя вам добавлять файлы и получать соответствующие CID.
Встроенные (inline) вложения – файлы, не видимые получателю в списке вложений, но используемые внутри HTML-тела сообщения; CID – уникальный идентификатор внутри данного сообщения, используемый вместо URL в таких атрибутах, как
src
– прим. пер.
Добавление картинки в шаблон сообщения
<body>
Вот какая-то картинка:
<img src="<?php echo $message->embed($pathToFile); ?>">
</body>
Добавление встроенной в html картинки (data:image)
<body>
А вот картинка, полученная из строки с данными:
<img src="<?php echo $message->embedData($data, $name); ?>">
</body>
Переменная $message
всегда передаётся шаблонам сообщений классом Mail
.
Очереди отправки
Помещение сообщения в очередь отправки
Из-за того, что отправка множества мейлов может сильно повлиять на время отклика приложения, многие разработчики помещают их в очередь на отправку. Laravel позволяет делать это, используя единое API очередей. Для помещения сообщения в очередь просто используйте метод Mail::queue()
:
Mail::queue('emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'Джон Смит')->subject('Привет!');
});
Вы можете задержать отправку сообщения на нужное число секунд методом later
:
Mail::later(5, 'emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'Джон Смит')->subject('Привет!');
});
Если же вы хотите поместить сообщение в определённую очередь отправки, то используйте методы queueOn
и laterOn
:
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'Джон Смит')->subject('Привет!');
});
Локальная разработка
При разработке приложения обычно предпочтительно отключить доставку отправляемых сообщений. Для этого вы можете либо вызывать метод Mail::pretend
, либо установить параметр pretend
в значение true
в файле настроек app/config/mail.php
. Когда это сделано, сообщения будут записываться в файл журнала вашего приложения, вместо того, чтобы быть отправленными получателю.
Включение симуляции отправки
Mail::pretend();