Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Отправка почты

Магазин сам отправляет письма: о новом заказе, регистрации, сбросе пароля. Ваше дополнение может отправлять свои — например, сообщить владельцу о новой заявке на звонок. Этим занимается класс \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 &amp; Anna в теме. Строки из настроек и запроса хранятся экранированными. В текстовом письме и в теме раскодируйте их через html_entity_decode($value, ENT_QUOTES, 'UTF-8').

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.