Sites e aplicações

Configurar o Magento 1.9 e anteriores para o envio de e-mails por SMTP

Revisto a 10 min de leitura SMTP Magento

O Magento 1.x (incluindo a 1.9) envia os e-mails com a função mail() do PHP. Esses e-mails saem sem autenticação, e fornecedores como o Gmail, o Hotmail ou a Orange enviam-nos para o spam ou rejeitam-nos. A solução é enviá-los por SMTP autenticado com uma conta de correio do seu domínio.

Ao contrário do Magento 2, o Magento 1 não traz uma opção de SMTP na administração. Tem duas formas de o fazer: com uma extensão (recomendada) ou editando o código.

O Magento 1 deixou de receber atualizações de segurança em junho de 2020. Se a sua loja ainda estiver nele, pondere passar para o OpenMage, a sua continuação mantida (este guia também serve para o OpenMage), ou para o Magento 2.

Antes de começar, crie no cPanel a conta de correio a partir da qual sairão os e-mails, por exemplo tienda@tudominio.com.

Opção 1: extensão SMTP Pro (recomendada)

O SMTP Pro Email da ASchroder é uma extensão gratuita e de código aberto, compatível com o Magento 1.x até à 1.9.4.x e com o OpenMage, que a recomenda na sua documentação. A última versão publicada é a 2.0.7.

Instalá-la

Entre por SSH na pasta do Magento (normalmente public_html), descarregue a versão 2.0.7 e copie a sua pasta app por cima da da loja:

cd ~/public_html
wget https://github.com/aschroder/Magento-SMTP-Pro-Email-Extension/archive/refs/tags/2.0.7.zip -O smtp-pro.zip
unzip smtp-pro.zip
cp -r Magento-SMTP-Pro-Email-Extension-2.0.7/app/* ./app/
rm -rf Magento-SMTP-Pro-Email-Extension-2.0.7 smtp-pro.zip

Se a sua loja for um OpenMage instalado com o Composer, pode instalá-la com composer require aschroder/smtp_pro.

Esvazie a cache em System > Cache Management: selecione todos os tipos e clique em Refresh. Também o pode fazer por SSH:

rm -rf var/cache/*

Depois termine sessão na administração e volte a entrar; caso contrário, a secção de configuração da extensão dá um erro 404.

Configurá-la

Na administração, vá a System > Configuration e, no menu da esquerda, a ASCHRODER EXTENSIONS > SMTP Pro. Preencha:

Campo Valor
Email Connection Custom SMTP
Authentication Login
Username a conta de correio completa, por exemplo tienda@tudominio.com
Password a palavra-passe dessa conta
Host localhost
Port 25
SSL Security None

Usamos localhost, a porta 25 e sem encriptação porque a ligação é feita dentro do mesmo servidor e não sai para a Internet. Se enviar com uma conta externa (Gmail, Microsoft 365…), use o servidor, a porta e a encriptação indicados por esse fornecedor, por exemplo a porta 587 com TLS.

Clique em Save Config no canto superior direito.

Testá-la

No mesmo ecrã do SMTP Pro, clique no botão Test: a extensão envia um e-mail de teste e mostra-lhe se a ligação funcionou. Depois faça um teste real, como uma encomenda de teste ou uma mensagem a partir do formulário de contacto, e verifique se chega.

Opção 2: editar o código (sem extensão)

Se não puder instalar extensões, pode obrigar o Magento a usar SMTP modificando os dois ficheiros que enviam o correio: Template.php (envios diretos) e Queue.php (envios em fila, desde o Magento 1.9.1).

Não edite os originais de app/code/core/, porque uma atualização substituí-los-ia. Copie os ficheiros para app/code/local/, que tem prioridade sobre core e não é alterada ao atualizar.

1. Copie os ficheiros para app/code/local

Por SSH, a partir da pasta do Magento:

mkdir -p app/code/local/Mage/Core/Model/Email/
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
chmod 600 app/code/local/Mage/Core/Model/Email/*.php

O chmod 600 faz com que só o seu utilizador possa ler os ficheiros, que vão conter a palavra-passe do correio. A pasta app já está protegida pelo .htaccess do Magento, pelo que não podem ser descarregados a partir do navegador.

2. Edite o Template.php

Abra app/code/local/Mage/Core/Model/Email/Template.php e procure o método getMail():

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

Substitua-o por:

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' => 'tienda@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. Edite o Queue.php

Abra app/code/local/Mage/Core/Model/Email/Queue.php e, dentro do método send(), procure estas linhas:

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

Substitua-as por:

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

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

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

No mesmo método, procure este bloco e apague-o ou comente-o, porque, se houver um Return-Path configurado, volta a colocar o envio por Sendmail e anula o SMTP:

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

Nos dois ficheiros, substitua tienda@tudominio.com e tu_contraseña pelos dados da sua conta de correio.

4. Reveja as definições de envio

Na administração, vá a System > Configuration > Advanced > System > Mail Sending Settings e verifique:

  • Disable Email Communications: No.
  • Host: localhost.
  • Port (25): 25.
  • Set Return-Path: No. O Template.php também tem um bloco que muda para o Sendmail quando esta opção está ativa.

O código lê o host e a porta daqui, com Mage::getStoreConfig('system/smtp/host') e Mage::getStoreConfig('system/smtp/port').

5. Esvazie a cache e recompile

Se tiver o compilador ativado (vê-o em System > Tools > Compilation), recompile para que o Magento use os ficheiros novos:

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

E esvazie a cache:

rm -rf var/cache/*

Edite sempre os dois ficheiros: se só alterar um, os e-mails que saem pelo outro caminho continuarão a usar a mail(). Se atualizar o Magento ou o OpenMage, compare as suas cópias de app/code/local com os ficheiros novos de core e volte a aplicar as alterações se tiverem mudado.

Se algo falhar

  • Os e-mails das encomendas não saem, mas o de teste sim: desde o Magento 1.9.1, os e-mails das encomendas vão para uma fila que é processada com o cron. Verifique se tem uma tarefa cron que executa cron.sh ou cron.php a cada poucos minutos.
  • Ecrã de manutenção depois de instalar a extensão: apague o ficheiro maintenance.flag da pasta do Magento.
  • Erro de ligação a um servidor externo: para usar TLS ou SSL, a extensão do PHP OpenSSL deve estar ativa no seletor de PHP do cPanel.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.