Enviando E-mails com Anexo Usando BOOTSTRAP, PHP, JQuery e phpmailer

O email é uma das ferramentas mais importantes para qualquer negócio. Através deles negócios são consolidados todos os dias. E, também através deles, pessoas são lembradas de suas obrigações como pagamentos a efetuar, compras para concretizar, e ainda são avisadas do estado de suas compras, por exemplo.

IMPORTANTE: Já vou avisar logo no começo que você pode criar sites e fazer outros trabalhos importantes apenas aprendendo através da internet. Existe muita gente que fez dessa forma, mas muitos levaram muito tempo até aprender o jeito certo. Por isso, recomendo que faça um curso na área para incrementar a sua carreira de desenvolvedor, como por exemplo o curso deste link.

E nesse post, vou deixar pronta uma função chamada sendHtmlEmail para você automatizar o envio de emails com phpmailer seja no seu site ou sistema em PHP.

De brinde, vamos fazer nesse exemplo um simples formulário de contato, que você pode até adaptar para o seu site. Ele usará JQuery para enviar os dados, o que significa que não precisará recarregar a página para enviar os dados. Ao invés disso, aparecerá um gif animado mostrando que está em processamento.

O que vou mostrar a seguir serve pra você entender o que está acontecendo, mas não é o código completo. No final desse post coloquei um link para baixar o código completo para testar.

Primeiro, vamos ao layout. Bom, essa parte é simples e vou usar BOOTSTRAP pra você se familiarizar (caso não conheça). A primeira parte fica assim:

<h1 id="contato">Teste do Formulário de Contato</h1>
<p>Um exemplo de uso do phpmailer</p>
<div id="formResult"></div>
<div id="formDiv">
   <form id="messageForm" method="POST" action="post_contato.php">
      <div class="form-group">
         <label>Nome</label>
         <input type="text" name="nome" class="form-control" placeholder="Seu Nome" required>
      </div>
      <div class="form-group">
         <label>Email</label>
         <input type="email" name="email" class="form-control" placeholder="name@example.com" required>
      </div>
      <div class="form-group">
         <label>Mensagem</label>
         <textarea name="mensagem" class="form-control" id="txtMensagem" rows="5"></textarea>
      </div>
      <button type="submit" class="btn btn-primary">Enviar</button>
   </form>
</div>

E o resultado será este:

Formulário de Contato

Em seguida, temos que enviar os dados do formulário para o servidor via JQuery (ajax). Então acrescentamos uma porção de javascript:

<script>
    // Attach a submit handler to the form
    $("#messageForm").submit(function(event) {
      $(document).scrollTop($("#contato").offset().top);
      $("#formDiv").slideUp();
      $("#formResult").empty().append("<div style='text-align:center'><img src='images/ajax-loader.gif'></div>");
      // Stop form from submitting normally
      event.preventDefault();

      // Get some values from elements on the page:
      var $form = $(this),
        nome = $form.find("input[name='nome']").val(),
        email = $form.find("input[name='email']").val(),
        mensagem = $("#txtMensagem").val(),
        url = $form.attr("action");

      // Send the data using post
      var posting = $.post(url, {
          nome: nome,
          email: email,
          mensagem: mensagem,
        },
        function(data) {
          $("#formResult").empty().append(data);
        });
    });
  </script>

Resumindo, a ideia desse trecho é:

  • Quando o usuário clicar em enviar $("#messageForm").submit
  • Rolar a tela para a posição do formulário de contato, pois ele sumirá dando lugar ao gif animado.
  • Evitar que o browser faça o envio padrão do formulário, o que iria recarregar toda a página.
  • Pegar os dados do formulário e enviar usando $.post para o script post_contato.php
  • Colocar o resultado no lugar do gif animado.

Agora vamos ao post_contato.php. Esse arquivo fica no servidor e tem a função de receber os dados e disparar o email.

Aqui eu vou resumir este arquivo para explicar, mas você pode baixá-lo completo no final desse post. Na linha 40 a mágica é feita.

<?php

require_once 'mailfunction.php';
$webSiteEmail = "fale@iotbras.com";
$result = 0;
if (isset($_POST["nome"])) {
  //Dados do formulário
  $nome = $_POST["nome"];
  $email = $_POST["email"];
  $message = $_POST["mensagem"];
  $messageHTML = str_replace("\n", "<br/>", $_POST["mensagem"]);

  //A versão HTML do email
/****************************************************** */
  $msgHtml = <<<HTML
  <div style="font-family:  'Bookman Old Style'">
    ...resumido...
  </div>
HTML; //Este fechamento de heredoc não deve ser identado
  //Mantenha sempre na coluna 0, mesmo se for colocado dentro de uma função.

  //A versão texto da mensagem      
/****************************************************** */
  $msgPlain = <<<TXT
SEU SITE
-------------
...resumido...
www.seusite.com.br
TXT;
/****************************************************** */

  //Enviar para o cliente e também para mim
  //coloque aqui o email que quiser receber o contato
  //Neste caso, estou usando $webSiteEmail, pois checo ele diariamente
  //se for algo do tipo noreply, mude o $webSiteEmail para algumemailseu@seusite.com.br
  $to_ar = array($webSiteEmail, $email);
  $subject = "Contato no Site";
  $from_name = $_POST["email"];

  if (sendHtmlEmail($to_ar, $subject, $msgHtml, $msgPlain, 
      ["ArquivoAnexo.txt"], $sendHtmlEmail_config)) {
    $result = 1;
  }
}
?>

<div class="alert <?php echo ($result == 1) ? "alert-success" : "alert-danger"; ?>">
  ...resumido html que mostra o resultado para o usuário...
</div>

Finalmente, a função sendHtmlEmail eu deixei num arquivo separado para você poder reaproveitar. Segue:

<?php

function sharedf_autoload($className)
{
    $filename = 'phpmailer/class.' . strtolower($className) . '.php';
    if (is_readable($filename)) {
        require $filename;
    } else {
        // Error Generation Code Here
        echo "Class not founded: " . $className;
        die();
    }
}
spl_autoload_register("sharedf_autoload");

//Essas configurações normalmente ficam num arquivo de configuração
//preencha com os dados do seu provedor de email.
//Opção com SSL
$sendHtmlEmail_config = [
    "mail_from" => "fale@seuSiteAqui.com",
    "mail_host" => "mail.seuSiteAqui.com",
    "mail_user" => "fale@seuSiteAqui.com",
    "mail_pass" => "senhaAqui",
    "mail_port" => 465
];

function sendHtmlEmail(
    $to_ar, //Um array de emails para enviar com copias
    $subject, //Assunto da mensagem
    $msgHtml, //Conteúdo em HTML
    $msgPlain, //Conteúdo em texto normal
    $attach = [], //Anexos
    $configs //Configurações do servidor de emails
) {
    $mail = new PHPMailer;
    //$mail->Timeout  =  10;
    $mail->CharSet = 'UTF-8';

    //$mail->SMTPDebug = 3;  //Ativar saida de erros (escreve erros na saida)

    $mail->isSMTP();
    $mail->Host = $configs["mail_host"];
    $mail->SMTPAuth = true;
    $mail->Username = $configs["mail_user"];
    $mail->Password = $configs["mail_pass"];
    $mail->SMTPSecure = 'ssl';
    //$mail->SMTPSecure = 'tls';
    $mail->Port = $configs["mail_port"];

    $mail->setFrom($configs["mail_from"], $configs["mail_from"]);
    foreach ($to_ar as $v) {
        $mail->addAddress($v);
    }
    $mail->isHTML(true);

    $mail->Subject = $subject;
    $mail->Body = $msgHtml;
    $mail->AltBody = $msgPlain;

    if (count($attach) > 0) {
        foreach ($attach as $v) {
            $mail->AddAttachment($v);
        }
    }

    if (!$mail->send()) {
        //Acao extra caso ocorra um erro, salve no seu arquivo de log.
        //Descomente a seguir se estiver tendo problemas, ou salve para o log
        //echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        //echo 'Message has been sent';
        return true;
    }
    return false;
}

Agora é só incorporar no seu site.

Estes são os arquivos para download. Lembre de configurar o seu email no arquivo mailfunction.php.

Novamente, reforço que muitos programadores iniciantes abandonam a área ou não crescem simplesmente porque demoraram muito para aprender. Faça este ou outro curso, mas invista na sua carreira: link de um curso.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *