Если вы используете SMTP сервер для отправки почты с сайта (например, используете Почту для домена от Яндекса), то можете столкнуться со следующей проблемой — на почту не приходят уведомления о сообщениях через контактную форму. При этом все остальные письма отправляются нормально.
Это происходит из-за того, что такие письма отправляются от имени посетителя сайта.
Для решения этой проблемы вы можете попробовать обратиться в техподдержку хостинга сайта или почтового сервиса. Если это не помогает, то можно все исправить на уровне PrestaShop.
Решение проблемы:
1. Самый простой способ — это отправлять почту через функцию PHP mail(). Сменить способ отправки писем можно в админке сайта (Расширенные параметры -> E-mail).
Письма, отправленные таким способом, очень часто попадают в спам — это, конечно же, очень плохо.
2. Другой способ — это небольшая модификация кода.
Все правки можно сделать через FTP. Пути к файлам указаны относительно корня сайта.
В файле /controllers/ContactController.php есть функция postProcess(). В самом ее конце есть код:
1 2 3 4 5 6 | if (!Mail::Send($this->context->language->id, 'contact', Mail::l('Message from contact form').' [no_sync]', $var_list, $contact->email, $contact->name, null, null, $file_attachment, null, _PS_MAIL_DIR_, false, null, null, $from) || !Mail::Send($this->context->language->id, 'contact_form', ((isset($ct) && Validate::isLoadedObject($ct)) ? sprintf(Mail::l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail::l('Your message has been correctly sent')), $var_list, $from, null, null, null, $file_attachment, null, _PS_MAIL_DIR_, false, null, null, $contact->email)) { $this->errors[] = Tools::displayError('An error occurred while sending the message.'); } |
Он отвечает за отправку писем администратору и посетителю. Код приведен из PrestaShop 1.6, в других версиях он может немного отличаться.
Необходимо внести следующие изменения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // сохраняем текущий способ отправки в переменную $ps_mail_method = Configuration::get('PS_MAIL_METHOD'); // меняем способ отправки на PHP mail() Configuration::updateValue('PS_MAIL_METHOD', '1'); // отправляем письмо администратору if (!Mail::Send( $this->context->language->id, 'contact', Mail::l('Message from contact form').' [no_sync]', $var_list, $contact->email, $contact->name, $from, ($customer->id ? $customer->firstname.' '.$customer->lastname : ''), $file_attachment )) { $this->errors[] = Tools::displayError('An error occurred while sending the message.'); } //возвращаем обратно изначальный способ отправки Configuration::updateValue('PS_MAIL_METHOD', $ps_mail_method); // отправляем письмо клиенту if(!Mail::Send( $this->context->language->id, 'contact_form', ((isset($ct) && Validate::isLoadedObject($ct)) ? sprintf(Mail::l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail::l('Your message has been correctly sent')), $var_list, $from, null, $contact->email, $contact->name, $file_attachment )) { $this->errors[] = Tools::displayError('An error occurred while sending the message.'); } |
Общий смысл изменений: перед отправкой письма администратору меняем способ отправки на PHP Mail(), а потом изменяем обратно. Таким образом, письма посетителям будут отправляться через SMTP сервер и не попадут в спам, а администратору хватит и PHP Mail().
Все изменения стоит делать в переопределенном классе: /override/controllers/ContactController.php