O pedido cai na loja, muda para “Processando” e o cliente jura que não recebeu nada. A dúvida é sempre a mesma: o WooCommerce não disparou o e-mail ou o servidor não entregou? Dá para responder isso em dois comandos, usando um pedido que já está no banco.
Dispare o e-mail do pedido na mão
Pegue o ID de um pedido em processamento e mande o próprio mailer do Woo trabalhar. O e-mail vai de verdade para o cliente daquele pedido, então escolha um pedido de teste ou um que seja seu. Troque 4021 pelo número:
sudo -u www-data wp eval 'WC()->mailer()->emails["WC_Email_Customer_Processing_Order"]->trigger( 4021 );' --path=/var/www/sualoja/html
Chegou na caixa? Então o envio funciona e o buraco está no gatilho: status que muda por plugin de pagamento sem passar pelo hook padrão, ou o e-mail desmarcado em WooCommerce > Configurações > E-mails.
Separe o Woo do servidor
Se nada chegou, tire o WooCommerce da jogada e teste a função que ele usa por baixo:
sudo -u www-data wp eval 'add_action( "wp_mail_failed", function ( $e ) { echo $e->get_error_message(); } );
var_dump( wp_mail( "[email protected]", "teste", "corpo" ) );'
bool(true) quer dizer que o PHPMailer entregou a mensagem para o sendmail ou para o SMTP sem reclamar, e aí o problema é reputação: SPF, DKIM ou porta 587 fechada na saída. bool(false) mostra o motivo real na hora, que costuma ser autenticação recusada.
A fila que ninguém lembra
Alguns plugins de performance ligam o filtro woocommerce_defer_transactional_emails. Com ele ativo o e-mail não sai na requisição: vai para o processo em segundo plano do Woo, que guarda os lotes em wp_options e é acordado por um loopback para o admin-ajax, com o WP-Cron de rede de segurança. Loopback bloqueado mais DISABLE_WP_CRON no wp-config.php e nenhum cron de verdade no servidor, a fila fica parada.
sudo -u www-data wp option list --search='*wc_background_emailer*' --fields=option_name
sudo -u www-data wp cron event list | grep -i emailer
Linha sobrando ali confirma o entupimento. Antes de sair trocando de plugin de SMTP, olhe também WooCommerce > Status > Logs, que lê os arquivos de wp-content/uploads/wc-logs.