Отправка почты
Магазин сам отправляет письма: о новом заказе, регистрации, сбросе пароля. Ваше дополнение может отправлять свои — например, сообщить владельцу о новой заявке на звонок. Этим занимается класс \Opencart\System\Library\Mail, а параметры отправки берутся из настроек магазина.
Где лежит
| Что | Где |
|---|---|
| Класс | system/library/mail.php |
| Настройки | System → Settings, изменить магазин, вкладка Mail |
На вкладке Mail выбирают способ отправки — функцию PHP mail или SMTP — и вводят сервер SMTP, логин и пароль.
Отправка письма
Добавьте отправку в контроллер витрины модуля, сразу после сохранения заявки:
// extension/acme_hello/catalog/controller/module/acme_hello.php, в send()
if ($this->config->get('config_mail_engine')) {
$option = [
'parameter' => $this->config->get('config_mail_parameter'),
'smtp_hostname' => $this->config->get('config_mail_smtp_hostname'),
'smtp_username' => $this->config->get('config_mail_smtp_username'),
'smtp_password' => html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'),
'smtp_port' => $this->config->get('config_mail_smtp_port'),
'smtp_timeout' => $this->config->get('config_mail_smtp_timeout'),
];
$mail = new \Opencart\System\Library\Mail($this->config->get('config_mail_engine'), $option);
$mail->setTo($this->config->get('config_email'));
$mail->setFrom($this->config->get('config_email'));
$mail->setSender(html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8'));
$mail->setSubject('Новая заявка на звонок');
$mail->setText('Имя: ' . $name . "\n" . 'Телефон: ' . $phone);
$mail->send();
}Отправьте форму заявки на витрине — на адрес магазина из System → Settings придёт письмо с именем и телефоном.
Так пишут в выпусках 4.0.2 и новее, где параметры передаются в конструктор массивом. В 4.0.0 и 4.0.1 их присваивали свойствам объекта после создания. Точный код возьмите из файла ядра, который отправляет почту, например catalog/controller/mail/order.php своей копии.
Методы
| Метод | Что задаёт |
|---|---|
setTo($email) | Получатель |
setFrom($email) | Адрес отправителя |
setSender($name) | Имя отправителя |
setReplyTo($email) | Адрес для ответа |
setSubject($text) | Тема |
setText($text) | Текст письма |
setHtml($html) | Тело письма в HTML |
send() | Отправляет письмо |
Письмо в HTML
Тело HTML-письма строят из шаблона Twig, как страницу:
$data['name'] = $name;
$data['phone'] = $phone;
$mail->setHtml($this->load->view('extension/acme_hello/mail/callback', $data));{# extension/acme_hello/catalog/view/template/mail/callback.twig #}
<h2>Новая заявка на звонок</h2>
<p>Имя: {{ name }}</p>
<p>Телефон: {{ phone }}</p>Проверка на локальном сервере
Локальный сервер обычно не может отправлять настоящую почту. Поставьте перехватчик почты, например Mailpit, и укажите его адрес и порт в полях SMTP на вкладке Mail — все письма магазина будут видны в его веб-интерфейсе.
Частая ошибка
Название магазина или значение из формы подставляют в тему как есть, и письмо приходит с Tom & Anna в теме. Строки из настроек и запроса хранятся экранированными. В текстовом письме и в теме раскодируйте их через html_entity_decode($value, ENT_QUOTES, 'UTF-8').