Configurações do Magento 2

Magento 2 não envia e-mail de pedido: async sending e cron parado

Antes de sair instalando módulo de SMTP: em Magento Open Source 2.4.7 e 2.4.8, o e-mail de pedido que “não sai” quase sempre está preso no envio assíncrono. O Magento marca o pedido para mandar depois, quem faz o depois é o cron, e cron parado é e-mail que nunca chega.

Olhe a configuração antes de tudo

sudo -u www-data bin/magento config:show sales_email/general/async_sending
sudo -u www-data bin/magento config:show system/smtp/disable

Se o primeiro devolve 1, o envio é assíncrono. Se o segundo devolve 1, a loja está com toda a comunicação por e-mail desligada e nem o assíncrono salva. Quando o comando responde que o valor não existe, vale o padrão do módulo, que é 0 nos dois casos.

A fila mora na sales_order

Com o assíncrono ativo, o pedido nasce com send_email = 1 e email_sent nulo. O cron varre essa coluna e envia em lote:

SELECT entity_id, increment_id, send_email, email_sent, created_at
FROM sales_order
ORDER BY entity_id DESC
LIMIT 10;

Uma coluna email_sent cheia de NULL confirma o diagnóstico. Quem faz esse trabalho é o job sales_send_order_emails, do grupo default, agendado de minuto em minuto pelo Magento_Sales.

O cron está mesmo rodando?

crontab -u www-data -l | grep magento
sudo -u www-data bin/magento cron:run --group=default

Se a primeira passada não mandar nada, rode de novo: uma execução gera o agendamento e a seguinte processa o que ficou pendente. Saiu o e-mail? Faltava o crontab do sistema, que se instala com bin/magento cron:install — sempre como o usuário do web server, porque bin/magento rodado como root deixa var/ e generated/ com dono errado e derruba a loja logo depois. Vale conferir a tabela cron_schedule atrás de linhas com status missed ou error nesse job.

Para tirar a dúvida rápido em homologação, desligue o assíncrono com bin/magento config:set sales_email/general/async_sending 0 seguido de cache:flush. Só lembre que isso vale para pedidos novos: os antigos continuam esperando o cron que você ainda precisa consertar.

Post Recentes

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

18 horas atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

1 dia atrás

CodeIgniter 4 tela branca: CI_ENVIRONMENT e o erro que sumiu

Página em branco no CodeIgniter 4, sem nenhuma mensagem? O ambiente está em production e escondeu o erro. Troque o…

2 dias atrás

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

3 dias atrás

Módulos PHP 8.3 faltando na Saúde do site do WordPress: como instalar

A tela Saúde do site avisa que faltam extensões como intl, imagick ou zip: instale no PHP 8.3, reinicie o…

3 dias atrás

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

Chegou um chamado sem passo a passo e sem exemplo. Veja como virar esse relato em um caso de teste…

4 dias atrás