Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.

Работа с e-mail

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 10.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();