laravel php mail send
Laravel Framework Russian Community
Настройка
Отправка через API
Laravel содержит драйвера отправки почты через HTTP API сервисов Mailgun и Mandrill. Отправка через API как правило работает быстрее, чем отправка через протокол SMTP. Оба этих драйвера требуют наличия пакета Guzzle для осуществления HTTP-запросов. Чтобы включить его в свое приложение, добавьте в composer.json
Драйвер Mailgun
Драйвер Mandrill
Log Driver
Если в файле app/config/mail.php установить опцию driver в ‘log’, то все отправляемые письма будут записываться в лог-файл фреймворка и не будут рассылаться. Этот вариант используется для отладки.
Основы использования
Метод Mail::send используется для отправки сообщения:
В дополнение к шаблону в формате HTML вы можете указать текстовый шаблон письма:
Вы также можете оставить только один формат, передав массив с ключом html или text :
Вы можете указывать другие настройки для сообщения, например, копии или вложения:
При добавлении файлов можно указывать их MIME-тип и/или отображаемое имя:
Если вам надо просто отправить письмом несколько слов, то вместо того, чтобы создавать для этого шаблон, воспользуйтесь простым методом raw :
Добавление встроенных вложений
Обычно добавление встроенных вложений в письмо утомительное занятие, однако Laravel делает его проще, позволяя вам добавлять файлы и получать соответствующие CID.
Добавление картинки в шаблон сообщения
Добавление встроенной в html картинки (data:image)
Очереди отправки
Из-за того, что отправка писем может сильно повлиять на время отклика приложения, многие разработчики помещают их в фоновую очередь на отправку. Laravel позволяет делать это, используя единое API очередей. Для помещения сообщения в очередь просто используйте метод Mail::queue() :
Помещение сообщения в очередь отправки
Вы можете задержать отправку сообщения на нужное число секунд методом later :
Если же вы хотите поместить сообщение в определённую очередь отправки, то используйте методы queueOn и laterOn :
Локальная разработка
Если вы хотите отладить вид отсылаемых писем, воспользуйтесь сервисом типа MailTrap.
Работа с e-mail
Введение
Требования для драйверов
Драйверы на основе API, такие как Mailgun и SparkPost, зачастую работают проще и быстрее, чем SMTP-серверы. По возможности лучше использовать именно их. Для работы таких драйверов необходима HTTP-библиотека Guzzle, которую можно установить через менеджер пакетов Composer:
Драйвер Mailgun
Драйвер Mandrill
Драйвер SparkPost
Драйвер SES
Чтобы использовать драйвер Amazon SES, сначала установите Amazon AWS SDK для PHP. Вы можете установить эту библиотеку, добавив следующую строку в раздел require файла composer.json и выполнив команду sh composer update :
Затем задайте для параметра driver значение ses в конфигурационном файле config/mail.php и проверьте, что в конфигурационном файле config/services.php есть следующие параметры:
Создание отправляемых объектов
Написание отправляемых объектов
Настройка отправителя
Используя метод PHP from ()
Сначала давайте рассмотрим настройку отправителя email. Другими словами — от кого будет приходить email. Есть два способа настроить отправителя. Первый — с помощью метода PHP from () в методе PHP build () вашего отправляемого класса:
Используя глобальный адрес from
Настройка представления
В методе PHP build () отправляемого класса вы можете использовать метод PHP view () для указания шаблона для построения содержимого email-сообщения. Поскольку обычно для построения содержимого всех email-сообщений используется Blade-шаблон, вам доступна вся мощь и всё удобство шаблонизатора Blade для создания HTML-кода ваших email-сообщений:
Текстовые email-сообщения
Данные представления
Через общедоступные свойства
Обычно необходимо передать какие-либо данные в представление, которые можно использовать при построении HTML-кода email-сообщения. Есть два способа сделать данные доступными для вашего представления. Первый — любое общедоступное ( public ) свойство, определённое в вашем отправляемом классе, автоматически станет доступным для представления. Например, вы можете передать данные в конструктор вашего отправляемого класса и поместить эти данные в общедоступные свойства, определённые в классе:
Когда данные помещены в общедоступное свойство, они автоматически станут доступны в вашем представлении, и вы можете обращаться к ним как к любым другим данным Blade-шаблонах:
Через метод PHP with ()
После передачи данных в метод PHP with () они автоматически станут доступны для вашего представления, и вы сможете обращаться к ним как к любым другим данным Blade-шаблонах:
Вложения
Для добавления к письму вложений используйте метод PHP attach () в методе PHP build () отправляемого класса. Метод PHP attach () принимает первым аргументом полный путь к файлу:
При добавлении файлов можно указать их MIME-тип и/или отображаемое имя, передав массив вторым аргументом метода PHP attach () :
Вложение «сырых» данных
Метод PHP attachData () можно использовать для добавления «сырой» строки байтов в качестве вложения. Например, вы можете использовать этот метод, если вы сгенерировали PDF в памяти и хотите прикрепить его к письму, не записывая на диск. Метод PHP attachData () принимает «сырые» данные первым аргументом, имя файла вторым аргументом, и массив параметров третьим аргументом:
Метод PHP attachData () можно использовать для добавления «сырой» строки байтов в качестве вложения. Например, вы можете использовать этот метод, если вы сгенерировали PDF в памяти и хотите прикрепить его к письму, не записывая на диск:
Строчные вложения
Обычно добавление строчных вложений — утомительное занятие, однако Laravel делает его проще, позволяя вам добавлять изображения и получать соответствующие CID.
Строчные вложения — файлы, не видимые получателю в списке вложений, но используемые внутри HTML-тела сообщения; CID — уникальный идентификатор внутри данного сообщения, используемый вместо URL в таких атрибутах, как src — прим. пер.
Отправка почты
Построение сообщения
Как уже было сказано, третий аргумент метода PHP send () — замыкание, которое позволяет указать различные настройки для самого сообщения. С помощью этого замыкания вы можете задать другие атрибуты сообщения, такие как явная рассылка на несколько адресов, скрытая рассылка на несколько адресов, и т.д. :
Отправка простого текста
По умолчанию ожидается, что передаваемое в метод PHP send () представление содержит HTML. Но передавая первым аргументом метода PHP send () массив, вы можете указать простое текстовое представление вдобавок к HTML-представлению:
А если вам надо отправить только простой текст, вы можете указать это при помощи ключа text в массиве:
Отправка сырых строк
Если вам надо отправить непосредственно простую строку, используйте метод PHP raw () :
Очереди отправки
Помещение сообщения в очередь отправки
Из-за того, что отправка сообщений может сильно повлиять на время обработки запроса, многие разработчики помещают их в очередь на фоновую отправку. Laravel позволяет легко делать это, используя единое API очередей. Для помещения сообщения в очередь просто используйте метод PHP queue () фасада Mail после настройки получателей сообщения:
Этот метод автоматически позаботится о помещении задачи в очередь, поэтому сообщение будет отправлено в фоне. Не забудьте настроить механизм очередей перед использованием данной возможности.
Задержка отправки сообщения
Помещение сообщения в определённую очередь
Помещение в очередь по умолчанию
Если у вас есть отправляемые классы, которые необходимо всегда помещать в очередь, вы можете реализовать контракт ShouldQueue в классе. Тогда даже при вызове метода PHP send () отправляемый объект будет помещаться в очередь, поскольку он реализует контракт ShouldQueue :
Если вы хотите поместить сообщение в определённую очередь отправки, то используйте методы PHP queueOn () и PHP laterOn () :
Почта и локальная разработка
На стадии разработки приложения обычно предпочтительно отключить доставку отправляемых сообщений. В Laravel есть несколько способов «отключить» реальную отправку почтовых сообщений во время разработки.
Драйвер Log
Вместо отправки сообщений почтовый драйвер log будет заносить все сообщения в ваши журналы для возможности их просмотра. Подробнее о настройке различных окружений для приложения читайте в документации по настройке.
Универсальный получатель
Другой вариант — задать универсального получателя для всех сообщений от фреймворка. при этом все сообщения, генерируемые вашим приложением, будут отсылаться на заданный адрес, вместо адреса, указанного при отправке сообщения. Это можно сделать с помощью параметра to в файле настроек config/mail.php :
Mailtrap
И наконец, вы можете использовать сервис MailTrap и драйвер smtp для отправки ваших почтовых сообщений на фиктивный почтовый ящик, где вы сможете посмотреть их при помощи настоящего почтового клиента. Преимущество этого вариант в том, что вы можете проверить то, как в итоге будут выглядеть ваши почтовые сообщения, при помощи средства для просмотра сообщений Mailtrap.
События
Laravel генерирует событие непосредственно перед отправкой почтовых сообщений. Учтите, это событие возникает при отправке сообщения, а не при помещении его в очередь. Вы можете зарегистрировать слушатель для этого события в своём EventServiceProvider :
Laravel генерирует событие mailer.sending непосредственно перед отправкой почтовых сообщений. Учтите, это событие возникает при отправке сообщения, а не при помещении его в очередь. Вы можете зарегистрировать слушатель события в своём EventServiceProvider :
Комментарии (8)
Буду очень благодарен за помощь.
Блин так и не понял ничего. как это все работает((
Какой момент именно вам не понятен?
поддерживаю комментатора выше
Вылезла ошибка при использование сервиса Mailgun. cURL error 60: SSL certificate problem: unable to get local issuer certificate. Где мне отключить проверку на сертификацию?
Здравствуйте.
Только вникаю в Laravel, не судите строго.
Данные из формы добавляются в БД (на этом этапе все без проблем) далее подключается модель отправки почты и появляется ошибка «Too few arguments to function App\Mail\Question::__construct()», вроде скопировал все с документации, но все равно вылазят ошибки.
Laravel Framework Russian Community
Пролог
Начало работы
Архитектурные концепции
Основное
Погружение
Безопасность
База данных
Eloquent ORM
Тестирование
Пакеты
Отправка электронной почты
Введение
Конфигурирование
Почтовые службы Laravel могут быть настроены через конфигурационный файл config/mail.php вашего приложения. Каждая почтовая программа, настроенная в этом файле, может иметь свою собственную уникальную конфигурацию и даже свой собственный уникальный «транспорт», что позволяет вашему приложению использовать различные почтовые службы для отправки определенных сообщений электронной почты. Например, ваше приложение может использовать Postmark для отправки транзакционных писем, а Amazon SES – для массовых рассылок.
Предварительная подготовка драйверов
Драйверы на основе API, такие как Mailgun и Postmark, часто проще в использовании и быстрее, чем отправка почты через SMTP-серверы. По возможности мы рекомендуем использовать один из этих драйверов. Для всех драйверов на основе API требуется HTTP-библиотека Guzzle, которую можно установить через менеджер пакетов Composer:
Драйвер Mailgun
Если вы не используете регион Mailgun США, то вы можете определить конечную точку своего региона в конфигурации файла services :
Драйвер Postmark
Чтобы использовать драйвер Postmark, установите транспорт SwiftMailer для Postmark через Composer:
Если вы хотите указать поток сообщений Postmark, который должен использоваться данной почтовой программой, вы можете добавить параметр конфигурации message_stream_id в массив конфигурации почтовой программы. Этот массив конфигурации можно найти в файле конфигурации вашего приложения config/mail.php :
Таким образом, вы также можете настроить несколько почтовых программ Postmark с разными потоками сообщений.
Драйвер SES
Чтобы использовать драйвер Amazon SES, сначала необходимо установить Amazon AWS SDK для PHP. Вы можете установить эту библиотеку через менеджер пакетов Composer:
Затем установите для параметра default в вашем файле конфигурации config/mail.php значение ses и убедитесь, что конфигурационный файл config/services.php содержит следующие параметры:
Если вы хотите определить дополнительные параметры, которые Laravel должен передать методу SendRawEmail AWS SDK при отправке сообщения электронной почты, вы можете определить массив options в конфигурации ses :
Генерация отправлений
Написание отправлений
Конфигурирование отправителя
Использование метода from
Во-первых, давайте рассмотрим настройку отправителя электронного письма. Или, другими словами, от кого будет электронное письмо. Настроить отправителя можно двумя способами. Во-первых, вы можете использовать метод from в методе build вашего почтового класса:
Использование глобального адреса from
Кроме того, вы можете определить глобальный адрес reply_to в конфигурационном файле config/mail.php :
Конфигурирование шаблона
Письма с обычным текстом
Данные шаблона
Передача данных шаблону через публичные свойства
Как правило, вам нужно передать в шаблон некоторые данные, которые можно использовать при отображении HTML-кода электронного письма. Есть два способа сделать данные доступными для вашего шаблона. Во-первых, любое публичное свойство, определенное в вашем почтовом классе, будет автоматически доступно для шаблона. Так, например, можно передать данные в конструктор почтового класса и присвоить этим данные публичным свойствам, определенным в классе:
После того как данные были заданы как публичные свойства, они будут автоматически доступны в вашем шаблоне, поэтому вы можете получить к ним доступ так же, как и к любым другим данным в ваших шаблонах Blade:
Передача данных шаблону через метод with
Вложения
Чтобы добавить вложения к электронному письму, используйте метод attach в методе build почтового класса. Метод attach принимает полный путь к файлу в качестве своего первого аргумента:
При прикреплении файлов к сообщению вы также можете указать отображаемое имя и / или MIME-тип, передав массив в качестве второго аргумента методу attach :
Прикрепление файлов с диска
Если вы сохранили файл на одном из дисков файлового хранилища, то вы можете прикрепить его к электронному письму с помощью метода attachFromStorage :
При необходимости вы можете указать имя прикрепленного файла и дополнительные параметры, используя второй и третий аргументы метода attachFromStorage :
Метод attachFromStorageDisk используется, если вам нужно указать диск хранения, отличный от вашего диска по умолчанию:
Вложения необработанных данных
Метод attachData используется для присоединения необработанной строки в качестве вложения. Например, вы можете использовать этот метод, если вы создали PDF-файл в памяти и хотите прикрепить его к электронному письму, не записывая его на диск. Метод attachData принимает байты необработанных данных в качестве первого аргумента, имя файла в качестве второго аргумента и массив параметров в качестве третьего аргумента:
Встраиваемые вложения
Встраиваемые вложения необработанных данных
Настройка сообщения SwiftMailer
Метод withSwiftMessage базового класса Mailable позволяет вам зарегистрировать замыкание, которое будет вызываться с экземпляром сообщения SwiftMailer перед отправкой сообщения. Это дает вам возможность глубокой настройки сообщения перед его доставкой:
Отправления с разметкой Markdown
Почтовые сообщения с разметкой Markdown позволяют вам воспользоваться преимуществами предварительно созданных шаблонов и компонентов почтовых уведомлений в ваших почтовых рассылках. Поскольку сообщения написаны на Markdown, Laravel может отображать красивые, отзывчивые HTML-шаблоны для сообщений, а также автоматически генерировать их аналоги в виде простого текста.
Генерация отправлений с разметкой Markdown
Написание сообщений с разметкой Markdown
Почтовые сообщения Markdown используют комбинацию компонентов Blade и синтаксиса Markdown, которые позволяют легко создавать почтовые сообщения, используя предварительно созданные компоненты пользовательского интерфейса электронной почты Laravel:
Не используйте лишние отступы при написании писем Markdown. По стандартам Markdown парсеры будут отображать контент с отступом в виде блоков кода.
Компонент Button
Компонент Panel
Компонент панели отображает указанный блок текста на панели, цвет фона которой немного отличается от цвета остальной части сообщения. Это позволяет привлечь внимание к указанному блоку текста:
Компонент Table
Компонент таблицы позволяет преобразовать таблицу Markdown в таблицу HTML. Компонент принимает в качестве содержимого таблицу Markdown. Выравнивание столбцов таблицы поддерживается с использованием синтаксиса выравнивания таблицы Markdown по умолчанию:
Изменение компонентов
Редактирование файла CSS
Отправка почты
Итерация списка получателей
Иногда требуется отправить почтовое сообщение списку получателей, перебирая массив получателей / адресов электронной почты. Однако, поскольку метод to добавляет адреса электронной почты к списку получателей почтового сообщения, каждая итерация цикла будет отправлять другое электронное письмо каждому предыдущему получателю. Следовательно, вы всегда должны повторно создавать почтовый экземпляр для каждого получателя:
Указание драйвера при отправки почты
Очередь почты
Постановка сообщения в очередь почты
Поскольку отправка сообщений электронной почты может негативно повлиять на время отклика вашего приложения, многие разработчики ставят сообщения электронной почты в очередь для фоновой отправки. Laravel упрощает это с помощью встроенного API унифицированной очереди. Чтобы поставить почтовое сообщение в очередь, используйте метод queue фасада Mail после указания получателей сообщения:
Этот метод автоматически помещает задание в очередь, чтобы сообщение отправлялось в фоновом режиме. Перед использованием этого функционала вам необходимо настроить очереди.
Очередь отложенных сообщений
Постановка сообщения в конкретную очередь почты
Очередь почты, используемая по умолчанию
Если у вас есть почтовые классы, которые вы хотите всегда ставить в очередь, то вы можете реализовать контракт ShouldQueue для этого класса. Теперь, даже если вы вызовете метод send для отправки, почтовый класс все равно будет помещен в очередь, поскольку он содержит контракт:
Почтовые сообщения в очереди и транзакции в базе данных
Когда помещенные в очередь почтовые сообщения отправляются в рамках транзакций базы данных, они могут быть обработаны очередью до того, как транзакция базы данных будет зафиксирована. Когда это происходит, любые обновления, внесенные вами в модели или записи базы данных во время транзакции базы данных, могут еще не быть отражены в базе данных. Кроме того, любые модели или записи базы данных, созданные в рамках транзакции, могут не существовать в базе данных. Если ваше почтовое сообщение зависит от этих моделей, при обработке задания, отправляющего почтовое сообщение в очереди, могут возникнуть непредвиденные ошибки.
Чтобы больше узнать о том, как обойти эти проблемы, просмотрите документацию, касающуюся заданий в очереди и транзакций базы данных.
Отображение отправлений
Иногда требуется получить HTML-содержимое почтового сообщения, не отправляя его. Для этого вы можете вызвать метод render почтового сообщения. Этот метод вернет проанализированное HTML-содержимое почтового сообщения в виде строки:
Предварительный просмотр отправлений в браузере
При разработке шаблона почтового сообщения удобно быстро просмотреть визуализированное почтовое сообщение в браузере как типичный шаблон Blade. По этой причине Laravel позволяет вам возвращать любое почтовое сообщение непосредственно из замыкания маршрута или контроллера. Когда почтовое сообщение возвратится, оно будет обработано и отображено в браузере, что позволит вам быстро просмотреть его дизайн без необходимости отправлять его на реальный адрес электронной почты:
Встраиваемые вложения не будут отображаться при предварительном просмотре почтового сообщения в вашем браузере. Чтобы просмотреть эти почтовые сообщения, вы должны отправить их в приложение для тестирования электронной почты, например, MailHog или HELO.
Локализация отправлений
Laravel позволяет отправлять почтовые сообщения, используя язык, отличный от текущего языка запроса, и даже будет помнить его, если почта находится в очереди.
Для этого фасад Mail содержит метод locale для установки желаемого языка. Приложение изменит язык при анализе шаблона почтового сообщения, а затем вернется к предыдущему языку, когда анализ будет завершен:
Предпочитаемые пользователем локализации
Иногда приложения хранят предпочтительный язык каждого пользователя. Реализуя контракт HasLocalePreference в ваших моделях, вы можете указать Laravel использовать этот сохраненный язык при отправке почты:
После того как вы реализовали интерфейс, Laravel будет автоматически использовать предпочтительный язык при отправке уведомлений и почтовых сообщений модели. Следовательно, при использовании этого интерфейса нет необходимости вызывать метод locale :
Тестирование отправлений
Как и следовало ожидать, утверждения «HTML» утверждают, что HTML-версия вашего почтового сообщения содержит переданную строку, в то время как утверждения «текст» утверждают, что текстовая версия вашего почтового сообщения содержит переданную строку:
Тестирование отправки почтовых сообщений
Мы предлагаем тестировать содержимое ваших почтовых сообщений отдельно от тестов, которые подтверждают, что данное почтовое сообщение было «отправлено» определенному пользователю. Чтобы узнать, как протестировать, что почтовые отправления были отправлены, ознакомьтесь с нашей документацией по фальсификации Mail.
Почта и локальная разработка
При разработке приложения для отправки электронной почты вы, вероятно, не захотите отправлять электронные письма на реальные адреса электронной почты. Laravel предлагает несколько способов «отключить» фактическую отправку электронных писем во время локальной разработки.
Драйвер Log
Вместо того чтобы отправлять ваши электронные письма, почтовый драйвер log будет записывать все сообщения электронной почты в ваши файлы журналов для проверки. Обычно этот драйвер используется только во время локальной разработки. Для получения дополнительной информации о настройке вашего приложения для каждой среды ознакомьтесь с документацией по конфигурации.
HELO / Mailtrap / MailHog
События
Laravel запускает два события в процессе отправки почтовых сообщений. Событие MessageSending запускается перед отправкой сообщения, а событие MessageSent запускается после того, как сообщение было отправлено. Помните, что эти события запускаются, когда почта отправляется, а не когда она ставится в очередь. Вы можете зарегистрировать слушатели для этого события в вашем поставщике App\Providers\EventServiceProvider :