Исправление проблемы при отправке почты из контактной формы

Если вы используете SMTP сервер для отправки почты с сайта (например, используете Почту для домена от Яндекса), то можете столкнуться со следующей проблемой — на почту не приходят уведомления о сообщениях через контактную форму. При этом все остальные письма отправляются нормально.

Это происходит из-за того, что такие письма отправляются от имени посетителя сайта.

Для решения этой проблемы вы можете попробовать обратиться в техподдержку хостинга сайта или почтового сервиса. Если это не помогает, то можно все исправить на уровне PrestaShop.

Решение проблемы:

1. Самый простой способ — это отправлять почту через функцию PHP mail(). Сменить способ отправки писем можно в админке сайта (Расширенные параметры -> E-mail).

wp

Письма, отправленные таким способом, очень часто попадают в спам — это, конечно же, очень плохо.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *