Отправка писем
Магазин сам отправляет письма о заказах и регистрации. Модуль может отправлять свои — например, сообщать владельцу магазина о новом отзыве. Для этого служит метод Mail::Send(): он берёт шаблон письма, подставляет в него переменные и отправляет через почтовые настройки магазина.
Где лежат шаблоны
Шаблоны писем модуля хранят в папке mails, по подпапке на язык. Каждому письму нужны два файла с одним именем: версия HTML и текстовая. Создайте их вручную:
modules/acmehello/
├── acmehello.php
├── mails/
│ └── en/
│ ├── review_added.html
│ └── review_added.txt
└── ...Имя подпапки — код языка: en, ru, fr. Папку en держите всегда: если шаблона для языка письма нет, движок возьмёт английский.
Шаблон
<!-- modules/acmehello/mails/en/review_added.html -->
<h2>Новый отзыв</h2>
<p>Товар: {product}</p>
<p>Автор: {author}</p>
<p>Оценка: {rating} из 5</p>Новый отзыв
Товар: {product}
Автор: {author}
Оценка: {rating} из 5Второй блок — содержимое файла review_added.txt. Шаблон письма — не Smarty: в нём нет условий и циклов, только метки в фигурных скобках, которые заменяются значениями.
Отправка
// modules/acmehello/acmehello.php
private function notifyAboutReview(string $productName, string $author, int $rating): bool
{
return (bool) Mail::Send(
(int) $this->context->language->id,
'review_added',
$this->trans('Новый отзыв о товаре', [], 'Modules.Acmehello.Admin'),
[
'{product}' => $productName,
'{author}' => $author,
'{rating}' => $rating,
],
Configuration::get('PS_SHOP_EMAIL'),
null,
null,
null,
null,
null,
$this->getLocalPath() . 'mails/'
);
}Метод отправляет письмо на почту магазина и возвращает true при успехе.
Аргументы Mail::Send
| По порядку | Что передают |
|---|---|
| 1 | Номер языка: по нему выбирается подпапка шаблона |
| 2 | Имя шаблона без расширения |
| 3 | Тема письма |
| 4 | Массив переменных: ключ — метка вместе со скобками |
| 5 | Адрес получателя |
| 6 | Имя получателя |
| 7, 8 | Адрес и имя отправителя; null — настройки магазина |
| 9 | Вложение |
| 10 | Служебный, оставляют null |
| 11 | Папка шаблонов. Для модуля — его папка mails |
Без одиннадцатого аргумента движок ищет шаблон в общей папке mails магазина и не найдёт его. getLocalPath() возвращает путь к папке модуля на диске.
Вызов после сохранения отзыва
// modules/acmehello/acmehello.php, метод addReview
if (!$review->add()) {
return false;
}
$product = new Product($productId, false, $this->context->language->id);
$this->notifyAboutReview($product->name, $author, $rating);
return true;Письмо уходит после того, как отзыв сохранён. Результат отправки на сохранение не влияет: отзыв не должен пропасть из-за неработающей почты.
Как увидеть результат
Отправьте отзыв через форму на странице отзывов и откройте в панели «Расширенные параметры → E-mail». Внизу страницы — журнал отправленных писем: в нём появится строка с шаблоном review_added. На той же странице настраивают способ отправки и отправляют тестовое письмо.
На локальной машине почта обычно не уходит наружу. Удобно указать в настройках SMTP локальный перехватчик писем, например Mailpit: письма будут видны в его окне.
Готовые переменные
Движок сам добавляет в каждое письмо несколько меток.
| Метка | Что подставится |
|---|---|
{shop_name} | Название магазина |
{shop_url} | Адрес магазина |
{shop_logo} | Логотип |
Частая ошибка
Создан только файл .html, а .txt забыт. Mail::Send() возвращает false, письмо не уходит, и на экране ошибки нет. Для каждого письма нужны оба файла с одинаковым именем в папке каждого языка.