Naprawa formularza kontaktowego PrestaShop, który nie wysyła e-maili.

Jeśli używasz SMTP w konfiguracji e-mail swojego sklepu, możesz napotkać następujący problem – nie otrzymujesz powiadomień e-mail o nowych wiadomościach z formularza kontaktowego. A wszystkie inne maile wysyłają się bez problemu.


Dzieje się tak, ponieważ PrestaShop wysyła maile w imieniu klienta, ale używając Twojego serwera SMTP i Twojego konta e-mail.

Możesz skontaktować się z pomocą techniczną hostingu lub dostawcą poczty e-mail, być może zaoferują Ci jakieś rozwiązanie. Jeśli nie, możesz naprawić ten problem na poziomie PrestaShop.

Rozwiązanie:

1. Najłatwiejszym sposobem jest wysyłanie poczty za pomocą funkcji PHP mail(). Ustawienia e-mail możesz zmienić w back office (Zaawansowane -> E-mail).
1
Maile wysyłane w ten sposób bardzo często trafiają do spamu. A to oczywiście bardzo źle.

2. Inny sposób – niewielka modyfikacja kodu.

Wszystkie pliki można edytować przez FTP. Ścieżki plików są względne do katalogu głównego witryny.
Wszystkie zmiany należy wprowadzić w klasie nadpisania: /override/controllers/ContactController.php

W pliku /controllers/ContactController.php możesz znaleźć funkcję postProcess(). A na końcu tej funkcji znajdź następujący kod:

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.');
}

Ten kod służy do wysyłania maili do klienta i do administratora. Ten przykład pochodzi z PrestaShop 1.6, w innych wersjach może się nieznacznie różnić.

Musisz zastąpić ten kod następującym:

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
// save the current email sending method to the variable
$ps_mail_method = Configuration::get('PS_MAIL_METHOD');
// change email sending method to PHP mail()
Configuration::updateValue('PS_MAIL_METHOD', '1');
// send email to admin
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.');
}

// turn back default method
Configuration::updateValue('PS_MAIL_METHOD', $ps_mail_method);
// send email to a customer
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.');
}

Główna idea tych zmian: zmieniamy metodę wysyłania poczty na PHP Mail() przed wysłaniem maila do administratora. A następnie zmieniamy ją z powrotem na domyślną metodę (SMTP). Dzięki temu mail zostanie wysłany do klienta przez serwer SMTP i nie wpadnie do spamu, a administrator będzie wystarczająco zadowolony z PHP Mail().

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *