Solucionar el formulario de contacto de PrestaShop que no envía correos.

Si está utilizando SMTP en la configuración de correo electrónico de su tienda, entonces podría encontrar el siguiente problema: no recibe notificaciones por correo electrónico sobre nuevos mensajes del formulario de contacto. Y todos los demás correos se envían correctamente.


Ocurre porque PrestaShop envía correos desde el nombre del cliente, pero utilizando su servidor SMTP y su cuenta de correo electrónico.

Podría contactar al soporte de su alojamiento o al soporte de su proveedor de correo electrónico, tal vez le ofrezcan alguna solución. Si no, puede solucionar este problema a nivel de PrestaShop.

Solución:

1. La forma más fácil es enviar correo a través de la función PHP mail(). Puede cambiar la configuración de correo electrónico en el back office (Parámetros Avanzados -> Correo electrónico).
1
Los correos enviados de esta manera muy a menudo caen en spam. Y eso es muy malo, por supuesto.

2. La otra forma: una pequeña modificación de código.

Todos los archivos se pueden editar a través de FTP. Las rutas de los archivos son relativas a la raíz del sitio.
Todos los cambios deben implementarse en la clase override: /override/controllers/ContactController.php

En el archivo /controllers/ContactController.php puede encontrar la función postProcess(). Y al final de esta función encuentre el siguiente código:

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

Este código es para enviar correos a un cliente y a un administrador. Este ejemplo se da para PrestaShop 1.6, en las otras versiones puede ser ligeramente diferente.

Necesita reemplazar ese código por el siguiente:

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

La idea principal de estos cambios: cambiamos el método de envío de correo a PHP Mail() antes de enviar el correo al administrador. Y luego lo cambiamos de nuevo al método predeterminado (SMTP). Así, el correo se enviará al cliente a través del servidor SMTP y no caerá en spam, y el administrador estará lo suficientemente feliz con PHP Mail().

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *