Настройка
Laravel предоставляет простой интерфейс к популярной библиотеке SwiftMailer. Главный файл настроек — app/config/mail.php; он содержит всевозможные параметры, позволяющие вам менять SMTP-сервер, порт, логин, пароль, а также устанавливать глобальный адрес From для исходящих сообщений. Вы можете использовать любой SMTP-сервер, либо стандартную функцию PHP mail — для этого установите параметр driver в значение mail. Кроме того, доступен драйвер sendmail.
добавлено в 4.2 ()
Драйверы API
Также Laravel включает в себя драйверы для HTTP API Mailgun и Mandrill. Эти API часто работают проще и быстрее, чем SMTP-сервера. Для работы обоих драйверов необходимо, чтобы в вашем приложении была установлена HTTP-библиотека Guzzle 4. Вы можете добавить Guzzle 4 в свой проект, добавив такую строку в файл composer.json:
conf"guzzlehttp/guzzle": "~4.0"
Для использования драйвера Mailgun установите для параметра driver значение mailgun в конфигурационном файле app/config/mail.php. Затем создайте конфигурационный файл app/config/services.php, если такого ещё нет в вашем проекте. Проверьте, что в нём есть следующие параметры:
conf'mailgun' => array( 'domain' => 'your-mailgun-domain', 'secret' => 'your-mailgun-key', ),
Для использования драйвера Mandrill установите для параметра driver значение mandrill в конфигурационном файле app/config/mail.php. Затем создайте конфигурационный файл app/config/services.php, если такого ещё нет в вашем проекте. Проверьте, что в нём есть следующие параметры:
conf'mandrill' => array( 'secret' => 'your-mandrill-key', ),
Драйвер Log
Если параметр driver в вашем конфигурационном файле app/config/mail.php имеет значение log, то все сообщения e-mail будут заноситься в ваши журналы и не будут отправляться адресатам. Это полезно в первую очередь для быстрой, локальной отладки и проверки данных.
Основы использования
Метод PHPMail::send()
используется для отправки сообщения:
Mail::send('emails.welcome', array('key' => 'value'), function($message)
{
$message->to('foo@example.com', 'Джон Смит')->subject('Привет!');
});
Первый параметр — имя шаблона, который должен использоваться для текста сообщения. Второй — данные, передаваемые в шаблон, часто это ассоциативный массив, в котором элементы данных доступны через PHP$key
. Третий — функция-замыкание, позволяющая вам настроить новое сообщения.
Внимание: переменная PHP$message
всегда передаётся в ваш шаблон и позволяет вам прикреплять вложения. Таким образом, вам не стоит передавать одноимённую переменную с данными для шаблона.
В дополнение к телу сообщения в формате 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('us@example.com', 'Laravel');
$message->to('foo@example.com')->cc('bar@example.com');
$message->attach($pathToFile);
});
При добавлении файлов можно указывать их MIME-тип и/или отображаемое имя:
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
Объект, передаваемый замыканию метода PHPMail::send()
, наследует класс собщения SwiftMailer, что позволяет вам вызывать любые методы для создания своего сообщения.
Добавление строчных вложений
Обычно добавление строчных вложений — утомительное занятие, однако Laravel делает его проще, позволяя вам добавлять файлы и получать соответствующие CID.
Строчные вложения — файлы, не видимые получателю в списке вложений, но используемые внутри HTML-тела сообщения; CID — уникальный идентификатор внутри данного сообщения, используемый вместо URL в таких атрибутах, как src — прим. пер.
Добавление картинки в шаблон сообщения
<body>
Вот какая-то картинка:
<img src="<?php echo $message->embed($pathToFile); ?>">
</body>
Добавление файла из потока данных
<body>
А вот картинка, полученная из строки с данными:
<img src="<?php echo $message->embedData($data, $name); ?>">
</body>
Переменная $message всегда передаётся шаблонам сообщений классом PHPMail
.
Очереди отправки
Помещение сообщения в очередь отправки
Из-за того, что отправка сообщений может сильно повлиять на время обработки запроса многие разработчики помещают их в очередь на отправку. Laravel позволяет делать это, используя единое API очередей. Для помещения сообщения в очередь просто используйте метод PHPMail::queue()
:
Mail::queue('emails.welcome', $data, function ($message) {
$message->to('foo@example.com', 'Джон Смит')->subject('Привет!');
});
Вы можете задержать отправку сообщения на нужное число секунд методом PHPlater()
:
Mail::later(5, 'emails.welcome', $data, function ($message) {
$message->to('foo@example.com', 'Джон Смит')->subject('Привет!');
});
Если же вы хотите поместить сообщение в определённую очередь отправки, то используйте методы PHPqueueOn()
и PHPlaterOn()
:
Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) {
$message->to('foo@example.com', 'Джон Смит')->subject('Привет!');
});
Локальная разработка
При разработке приложения обычно предпочтительно отключить доставку отправляемых сообщений. Для этого вы можете либо вызывать метод PHPMail::pretend()
, либо установить параметр pretend в значение PHPtrue
в файле настроек app/config/mail.php. Когда это сделано, сообщения будут записываться в файл журнала вашего приложения, вместо того, чтобы быть отправленными получателю.
Mail::pretend();