Essa dica vai para quem está precisando fazer a integração do PHPMailer para envio de e-mails no PHP usando o Ajax. Confesso que passei horas até descobrir o que estava acontecendo e acredito que essa dica possa evitar possíveis dores de cabeça de outros programadores que querem usar essa solução em seus projetos web.

O problema que vinha enfrentando é que o Ajax retornava uma condição de erro todas as vezes que eu incluía uma chamada a uma função que criei para envio de e-mails usando o PHPMailer. Apesar de estar tudo configurado e funcionando perfeitamente de forma independente, quanto eu incluía a chamada à função no arquivo que fazia a validação dos dados enviados pelo Ajax, sempre retornava em condição de erro.

 

Usando o Ajax para validação de dados de formulário

Ao integrar o Ajax com o PHP devemos nos preocupar basicamente com 4 coisas:

  1. Declarar como e quais dados serão enviados via Ajax para validação.
  2. Tratar a condição de sucesso, ou seja, o que acontecerá quando os dados forem validados com sucesso.
  3. Tratar a condição de falha, ou seja, o que acontecerá quando os dados tiverem insucesso na validação.
  4. Tratar a condição de erro, ou seja, a condição que o Ajax encontra algum problema durante sua execução e retorna erro.

Seguindo os passos acima, decidi usar o Ajax para enviar os dados de registro de um usuário para validação usando a codificação JSON. Neste processo é esperado que o código siga o seguinte fluxo:

Codificar os dados em JSON -> enviá-los via método POST para outro arquivo PHP -> Processar informações no arquivo PHP -> Retornar a resposta para a função Ajax.

No arquivo PHP responsável pela validação devemos decodificar o JSON, testar as condições que queremos validar e em seguida codificar o resultado da validação em JSON novamente.

Assim, o Ajax espera receber de retorno no cabeçalho da página o código 200, ou seja, a informação de que o processamento foi OK e também o resultado dos dados validados: Se sucesso ou insucesso.

Em todo este processo existe uma peculiaridade do Ajax que é onde está a dica que estou abordando neste artigo. Para o retorno do resultado da validação devemos codificar a variável novamente no formato JSON usando a função json_encode(), declarar o cabeçalho da resposta que os dados estão no formato JSON e dar um “echo” destes dados. O trecho de código abaixo demonstra bem estes passo:

<?php
header('Content-type: application/json');
echo json_encode($data);
exit;

Se por algum motivo, em algum momento, nosso código de validação dos dados Ajax retornar um “echo” de qualquer outro tipo de dado que NÃO esteja no formato JSON, o Ajax receberá uma exceção e retornará a condição de erro.

 

Configuração padrão PHPMailer

Por padrão, em algumas classes do PHPMailer, são utilizados “echos” para o propósito de debug e por este motivo, quando fazia-se a chamada da função e por consequência das classes envolvidas para envio de e-mail, sempre retornava condição de exceção no Ajax, pois o formato dos dados era diferente do esperado.

 

Como resolver?

Então a dica rápida é implementar pequenas mudanças na configuração das classes envolvidas no envio de e-mail. Para o envio de e-mails, as classes que devem ser modificadas são:

  • class.phpmailer.php
  • class.smtp.phpmailer.php

Abra cada uma das classes acima, procure pela seguinte linha:

public $Debugoutput = 'echo';

em seguida mude de ‘echo’ para ‘error_log’.

public $Debugoutput = 'error_log';

Assim, o PHPMailer irá parar de retornar echo como debug e passará apenas a gravar os dados em um arquivo previamente definido no php.ini (Padrão).

Com isso o problema de exceção no Ajax é resolvido e ele passa a receber os resultados das validações perfeitamente como esperado.