Neste artigo mostraremos duas funções muito úteis no PHP, são elas: O envio de e-mail autenticado e a geração de logs do sistema a fim de acompanhar erros e outros processos importantes.

Cenário para Envio de E-mails Autenticados

Podemos utilizar este tipo de função quando trabalha-se com sistemas que tem a opção de recuperação de senha, envio de e-mail com avisos, entre outras tarefas que são relacionadas a envio de email. É muito importante que este seja enviado através de um servidor SMTP autenticado, garantindo uma maior segurança para o usuário e principalmente que o e-mail irá chegar sem ser recusado por algum mecanismo “antifraude”.

Cenário para Utilização de Logs

É muito comum a utilização de logs nos sistemas atuais e até nos legados, independente da linguagem em que estejamos trabalhando. Ter um log eficiente com informações úteis pode poupar horas ou até dias para que você consiga descobrir porque determinado erro ocorreu.

Nas seções abaixo iremos implementar um sistema simples de LOG, que pode ser acoplado a qualquer sistema. Além disso, você poderá aumentar a robustez do mesmo, acrescentando mais complexidade ao mesmo.

Desenvolvimento a função para envio de E-mails autenticados

O primeiro passo é escolher a biblioteca que iremos utilizar. Neste caso, optamos por usar a PHPMailer. Faça o download e copie a pasta “phpmailer” para a raiz do seu projeto. Em seguida, crie uma página em PHP chamada “enviaemail.php” e coloque o código da Listagem 1 nela.

Listagem 1. Conteúdo da página enviaemail.php


  <?php
   
  require("phpmailer/class.phpmailer.php");
   
  function EnviarEmail($destino, $msg, $assunto) {
      $mail = new PHPMailer();
      $mail->IsSMTP(); // Define que a mensagem será SMTP
      $mail->Host = "host.com.br";
      $mail->SMTPAuth = true; // Autenticação
      $mail->SMTPSecure = "tls";
      $mail->Port = 587;
      $mail->Username = "usuario@host.com.br";
      $mail->Password = "suasenha";
      $mail->From = "usuario@host.com.br";
      $mail->FromName = "Email do Sistema ABC2014";
   
      $mail->AddAddress($destino);
      $mail->IsHTML(true); // Define que o e-mail será enviado como HTML
      $mail->CharSet = 'utf-8'; // Charset da mensagem (opcional)
   
      $mail->Subject = $assunto; // Assunto da mensagem
      $mail->Body = $msg;
   
      $enviado = $mail->Send();
      $mail->ClearAllRecipients();
      $mail->ClearAttachments();
   
      if ($enviado)
          return true;
      else
          return false;
  }
   
  ?>
  

As configurações acima são apenas de exemplo, você deve trocá-las pelas configurações utilizadas em seu domínio. Perceba que estamos utilizando em “SMTPSecure” o protocolo TLS, mas de acordo com sua necessidade você pode alterar para “SLL”, assim como a porta e as outras configurações.

Outro fator importante é que nossa mensagem está sempre em HTML, isso significa que podemos passar um código HTML completo que nosso PHPMailer irá renderizar a forma correta e enviar ao usuário. O foco aqui foi apenas mostrar como autenticar um e-mail através do PHPMailer, mas você pode aprofundar-se mais nessa biblioteca e utilizar funções como o anexo (Attachments), por exemplo.

Para usar a função acima é muito simples, vamos ver como fazer através da Listagem 2.

Listagem 2. Usando a função EnviarEmail()


  $msg = "Ola, <b>" . $pojoUsuario->getNome() . "</b><br />";
          $msg .= "Você solicitou a geração de uma nova Senha para o Sistema da
            ABC2014, segue abaixo os seus novos dados de acesso ao painel: 
             <br /><br />";
          $msg .= "<b>E-mail de Acesso:</b> " . $pojoUsuario->getEmail() . "<br />";
          $msg .= "<b>Senha de Acesso:</b> " . $nSenha . "<br /><br />";
          $msg .= "Atenção: Essas informações são sua 'chave de segurança' para 
           acesso ao painel, por isso não forneça as mesmas para ninguém.<br />";
          $msg .= "<b>Atenciosamente,</b> <br /> Sistema ABC2014"
   
          if (EnviarEmail('destino@dominio.com.br', $msg, "Recuperação de Senha ABC2014"))
              echo "<script type='text/javascript'>alert('As informações de login foram
               enviadas ao seu e-mail'); history.back();</script>";
   
          else
              echo "<script type='text/javascript'>alert('Não foi possível enviar as
               informações ao seu e-mail, verifique se digitou o e-mail corretamente 
               ou contate o suporte'); history.back();</script>";

No código acima estamos trabalhando com um objeto chamado $pojoUsuario (fictício), que possui todas as informações que precisamos sobre o usuário. Partindo deste princípio, montamos toda nossa mensagem na variável $msg, em HTML, como já havíamos explicado.

Depois chamamos o método “EnviarEmail(destino, mensagem, assunto)”, passando os parâmetros necessários. Caso este método retorne um valor verdadeiro, significa que a mensagem foi enviada com sucesso, então mostramos uma mensagem ao usuário e depois voltamos com history.back(), caso contrário mostraremos uma outra mensagem mas também voltamos com history.back().

Criando um Sistema de Log Simples

Iremos desenvolver agora um sistema simples que irá “logar” várias operações e erros do nosso sistema. Criaremos uma classe que irá usar o conceito do padrão de projeto Singleton para fazer tal tarefa.

Não iremos entrar em detalhes sobre o padrão de projeto singleton, mas ele garante que só existirá uma instância do nosso objeto durante a execução do sistema, assim evitamos que toda vez que quisermos logar alguma coisa, precisemos criar uma nova instancia da nossa classe em memória. Observe a Listagem 3.

Listagem 3. Criando a classe GeraLog


  <?php
   
  class GeraLog{
      
      public static $instance;    
      
      private function __construct() {
          //
      }
      
      public static function getInstance(){
          if (!isset(self::$instance))
          self::$instance = new GeraLog();        
          
          return self::$instance;
      }
      
      public function inserirLog($msg){
          $msg = "\r\n\r\n".$msg."\r\n\r\n Ocorrido em: ".date("d-m-Y, H:i:s")."\r\n -----------------------------------------------------------------------------------";
          $fp = fopen(CAMINHO_RAIZ."admin/logs/error_log_".date("d-m-Y").".txt",'a');
          fwrite($fp,$msg);
          fclose($fp);
      }
      
  }
  ?>

Veja que nossa classe é bem simples, onde apenas chamamos o método “inserirLog(msg)” e a classe se encarrega de salvar essa mensagem em um arquivo chamado “error_log”.

Nosso arquivo error_log é separado por dia, isso significa que a cada dia geramos um novo error_log, assim evitamos criar arquivos enormes que demorariam minutos ou até horas para abrir. Você pode aumentar a complexidade desta classe, inserindo parâmetros como, por exemplo: limite de tamanho por arquivo, caminho para salvar o arquivo, níveis de log (erro, informação, alerta e etc) e muitas outras funcionalidades.

Como usar nossa classe acima? Iremos mostrar na Listagem 4 o uso desta classe aplicado a uma consulta ao banco de dados, onde qualquer erro que ocorrer no banco de dados irá ser logado no nosso arquivo error_log. Assim podemos determinar uma série de problemas, sem precisar ficar tentando descobrir o que ocorreu com o sistema a 13 horas atrás.

Listagem 4. Usando a classe GeraLog


  public function Inserir(PojoUsuario $usuario) {
          try {
              $sql = "INSERT INTO usuario (             
                  nome,
                  email,
                  senha,
                  ativo,
                  cod_perfil)
                  VALUES (
                  :nome,
                  :email,
                  :senha,
                  :ativo,
                  :cod_perfil)";
   
              $p_sql = Conexao::getInstance()->prepare($sql);
   
              $p_sql->bindValue(":nome", $usuario->getNome());
              $p_sql->bindValue(":email", $usuario->getEmail());
              $p_sql->bindValue(":senha", $usuario->getSenha());
              $p_sql->bindValue(":ativo", $usuario->getAtivo());
              $p_sql->bindValue(":cod_perfil", $usuario->getPerfil()->getCod_perfil());
   
   
              return $p_sql->execute();
          } catch (Exception $e) {
              print "Ocorreu um erro ao tentar executar esta ação, foi gerado um 
               LOG do mesmo, tente novamente mais tarde.";
              GeraLog::getInstance()->inserirLog("Erro: Código: " . $e->getCode() . 
                " Mensagem: " . $e->getMessage());
          }
      }
  

Estamos utilizando acima PDO para realizar as operações com o banco de dados, mas isso não é importante agora. O que precisamos notar é que os erros que são capturados através do bloco “catch” são inseridos no error_log através do “GeraLog::getInstance()->inserirLog(msg)”.

O uso de logs hoje em dia é essencial para uma auditoria eficaz e manutenção rápida e de qualidade em sistemas de informação.

Existem frameworks eficazes que realizam o log de operações nas mais diversas linguagens, tais como o log4j no Java, muito conhecido e utilizado para logar operações em diversos níveis. Nosso objetivo com a criação de um log simples é possibilitar a criação de seu próprio sistema de log robusto e eficaz.