Работа с e-mail

Настройка

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', array('key' => 'value'), function($message)
{
    $message->to('foo@example.com', 'Джон Смит')->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('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));

Если вам надо просто отправить письмом несколько слов, то вместо того, чтобы создавать для этого шаблон, воспользуйтесь простым методом raw:

Mail::raw('Текст письма', function($message)
{
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com')->cc('bar@example.com');
});

Примечание: Объект $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('foo@example.com', 'Джон Смит')->subject('Привет!');
});

Вы можете задержать отправку сообщения на нужное число секунд методом later:

Mail::later(5, 'emails.welcome', $data, function($message)
{
    $message->to('foo@example.com', 'Джон Смит')->subject('Привет!');
});

Если же вы хотите поместить сообщение в определённую очередь отправки, то используйте методы queueOn и laterOn:

Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
    $message->to('foo@example.com', 'Джон Смит')->subject('Привет!');
});

Локальная разработка

При разработке приложения обычно предпочтительно отключить доставку отправляемых сообщений. Для этого вы можете либо вызывать метод Mail::pretend, либо установить параметр pretend в значение true в файле настроек config/mail.php. Когда это сделано, сообщения будут записываться в файл журнала вашего приложения, вместо того, чтобы быть отправленными получателю.

Если вы хотите отладить вид отсылаемых писем, воспользуйтесь сервисом типа MailTrap.