Configurar Magento 1.9 e inferiores para envío de correos vía SMTP

Magento en sus versiones 1.x (incluida la 1.9) utiliza por defecto la función mail() de PHP para el envío de correos, lo que puede provocar que los correos sean clasificados como spam o directamente rechazados por proveedores como Orange, Gmail o Hotmail.

A diferencia de Magento 2, las versiones 1.x no incluyen una opción nativa en el panel de administración para configurar SMTP, por lo que existen dos alternativas: instalar una extensión o editar manualmente el código.

Opción 1: Extensión SMTP Pro Email (recomendada)

La extensión gratuita y de código abierto SMTP Pro Email de ASchroder es la más utilizada para este fin. Es compatible con Magento 1.x hasta la versión 1.9.4.x.

Instalación

1. Descargar la extensión

Accedemos vía SSH al directorio raíz de Magento y descargamos la extensión desde GitHub:

cd ~/public_html
wget https://github.com/aschroder/Magento-SMTP-Pro-Email-Extension/archive/refs/heads/master.zip -O smtp-pro.zip

2. Descomprimir y copiar los ficheros

Descomprimimos el archivo y copiamos la carpeta app al directorio raíz de Magento, que fusionará los ficheros con la estructura existente:

unzip smtp-pro.zip
cp -r Magento-SMTP-Pro-Email-Extension-master/app/ ./app/

3. Limpieza

Eliminamos los ficheros temporales de la descarga:

rm -rf Magento-SMTP-Pro-Email-Extension-master smtp-pro.zip

4. Limpiar la cache de Magento

Desde el panel de administración de Magento accedemos a System > Cache Management, seleccionamos todos los tipos de cache y pulsamos Refresh. Alternativamente por SSH:

rm -rf var/cache/*

Tras limpiar la cache, cerramos sesión y volvemos a iniciar sesión en el panel de administración para que los cambios se apliquen correctamente.

Configuración SMTP

Una vez instalada la extensión, accedemos en el administrador de Magento a System > Configuration, y en el menú lateral izquierdo buscamos la sección ASCHRODER EXTENSIONS > SMTP Pro.

Configuramos los siguientes parámetros:

  • Email Connection: Custom SMTP
  • Authentication: Login
  • Username: cuenta de correo completa que utilizaremos para el envío (debe estar creada en cPanel)
  • Password: contraseña de dicha cuenta de correo
  • Host: localhost
  • Port: 25
  • SSL Security: None

Usamos localhost como host y el puerto 25 sin SSL porque se trata de una conexión local dentro del mismo servidor, lo que hace que el cifrado no sea necesario.

Guardamos los cambios pulsando Save Config en la parte superior derecha.

Verificar el funcionamiento

La extensión incluye una opción de prueba integrada. Desde la misma sección de configuración SMTP Pro, buscamos el botón o enlace de Test que permite enviar un correo de prueba para verificar que la configuración es correcta.

También es recomendable realizar un envío de prueba real, por ejemplo realizando un pedido de prueba o usando el formulario de contacto de la tienda, y verificar que el correo llega correctamente al destinatario.

Si usas una cuenta externa a nuestros servicios, como Gmail u Office 365, los datos de servidor, puerto, usuario y cifrado deberán corresponder a los proporcionados por dicho servicio.

Opción 2: Edición manual del código (sin extensión)

Si no es posible o no se desea instalar una extensión, se puede forzar el uso de SMTP editando directamente los ficheros encargados del envío de correos en Magento. Es necesario modificar dos ficheros: Template.php que gestiona los envíos directos y Queue.php que gestiona los envíos en cola (introducido en Magento 1.9.1+).

Importante: nunca se deben editar los ficheros del directorio app/code/core/ directamente, ya que cualquier actualización de Magento los sobrescribiría. En su lugar, se utiliza el directorio app/code/local/ que tiene prioridad sobre core y no se ve afectado por actualizaciones.

1. Copiar los ficheros al directorio local

Accedemos vía SSH al directorio raíz de Magento y creamos la estructura de directorios necesaria en app/code/local/:

mkdir -p app/code/local/Mage/Core/Model/Email/

Copiamos los dos ficheros originales:

cp app/code/core/Mage/Core/Model/Email/Template.php app/code/local/Mage/Core/Model/Email/Template.php
cp app/code/core/Mage/Core/Model/Email/Queue.php app/code/local/Mage/Core/Model/Email/Queue.php

2. Editar Template.php - método getMail()

Abrimos app/code/local/Mage/Core/Model/Email/Template.php y buscamos el método getMail(), cuyo contenido original es:

public function getMail()
{
    if (is_null($this->_mail)) {
        $this->_mail = new Zend_Mail('utf-8');
    }
    return $this->_mail;
}

Lo reemplazamos por el siguiente código, que configura el transporte SMTP con autenticación:

public function getMail()
{
    if (is_null($this->_mail)) {
        $smtp_host = Mage::getStoreConfig('system/smtp/host');
        $smtp_port = Mage::getStoreConfig('system/smtp/port');

        $config = array(
            'port' => $smtp_port,
            'auth' => 'login',
            'username' => 'noreply@tudominio.com',
            'password' => 'tu_contraseña'
        );

        $transport = new Zend_Mail_Transport_Smtp($smtp_host, $config);
        Zend_Mail::setDefaultTransport($transport);

        $this->_mail = new Zend_Mail('utf-8');
    }
    return $this->_mail;
}

3. Editar Queue.php - método send()

Abrimos app/code/local/Mage/Core/Model/Email/Queue.php y buscamos dentro del método send() las siguientes líneas:

ini_set('SMTP', Mage::getStoreConfig('system/smtp/host'));
ini_set('smtp_port', Mage::getStoreConfig('system/smtp/port'));

Las reemplazamos por el bloque que configura el transporte SMTP de forma idéntica:

$smtp_host = Mage::getStoreConfig('system/smtp/host');
$smtp_port = Mage::getStoreConfig('system/smtp/port');

$config = array(
    'port' => $smtp_port,
    'auth' => 'login',
    'username' => 'noreply@tudominio.com',
    'password' => 'tu_contraseña'
);

$transport = new Zend_Mail_Transport_Smtp($smtp_host, $config);
Zend_Mail::setDefaultTransport($transport);

Además, dentro del mismo método send(), buscamos el bloque condicional que establece el transporte Sendmail:

if ($parameters->getReturnPathEmail() !== null) {
    $mailTransport = new Zend_Mail_Transport_Sendmail("-f" . $parameters->getReturnPathEmail());
    Zend_Mail::setDefaultTransport($mailTransport);
}

Y lo eliminamos o comentamos, ya que de lo contrario sobrescribiría nuestro transporte SMTP cuando exista un return-path configurado.

En ambos ficheros, sustituye noreply@tudominio.com y tu_contraseña por los datos reales de una cuenta de correo creada en cPanel.

4. Configurar host y puerto en el panel

Desde el administrador de Magento accedemos a System > Configuration > Advanced > System > Mail Sending Settings y verificamos que los valores son:

  • Host: localhost
  • Port: 25

Estos valores son los que lee el código mediante Mage::getStoreConfig('system/smtp/host') y Mage::getStoreConfig('system/smtp/port').

5. Limpiar cache y recompilar

Si Magento tiene el compilador activado (comprobable en System > Tools > Compilation), es necesario limpiar y recompilar para que los cambios se apliquen correctamente:

php shell/compiler.php clear
php shell/compiler.php compile

Finalmente, limpiamos la cache para que Magento cargue los ficheros del directorio local en lugar de los de core:

rm -rf var/cache/*

Consideraciones de la edición manual

  • La cuenta de correo usada como username debe existir creada en cPanel.
  • Las credenciales quedan escritas en el código PHP, lo que es menos seguro que usar una extensión con interfaz de configuración. Asegúrate de que los permisos del fichero restrinjan su lectura.
  • Es imprescindible editar ambos ficheros (Template.php y Queue.php), si solo se edita uno, los correos enviados por la otra vía seguirán usando mail().
  • Si en el futuro se actualiza Magento, los ficheros en app/code/local/ se mantendrán, pero conviene revisar que sigan siendo compatibles con la nueva versión.

Notas generales

  • La cuenta de correo usada para el envío SMTP debe existir, creada en cPanel.
  • Si al acceder al panel de administración tras instalar una extensión aparece una pantalla de mantenimiento, elimina el fichero maintenance.flag del directorio raíz de Magento.
  • Asegúrate de que la extensión de PHP OpenSSL está activa si planeas usar conexiones con cifrado TLS/SSL hacia servidores SMTP externos.