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).

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().
