{"id":1107,"date":"2020-10-29T19:06:10","date_gmt":"2020-10-29T19:06:10","guid":{"rendered":"https:\/\/www.leandroip.com\/?p=1107"},"modified":"2022-09-27T11:34:53","modified_gmt":"2022-09-27T14:34:53","slug":"emails-com-anexo","status":"publish","type":"post","link":"https:\/\/www.leandroip.com\/?p=1107","title":{"rendered":"Enviando E-mails com Anexo Usando BOOTSTRAP, PHP, JQuery e phpmailer"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">O email \u00e9 uma das ferramentas mais importantes para qualquer neg\u00f3cio. Atrav\u00e9s deles neg\u00f3cios s\u00e3o consolidados todos os dias. E, tamb\u00e9m atrav\u00e9s deles, pessoas s\u00e3o lembradas de suas obriga\u00e7\u00f5es como pagamentos a efetuar, compras para concretizar, e ainda s\u00e3o avisadas do estado de suas compras, por exemplo. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E nesse post, vou deixar pronta uma fun\u00e7\u00e3o chamada <code>sendHtmlEmail<\/code> para voc\u00ea automatizar o envio de emails com <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/PHPMailer\/PHPMailer\" target=\"_blank\">phpmailer<\/a> seja no seu site ou sistema em PHP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>De brinde<\/strong>, vamos fazer nesse exemplo um simples formul\u00e1rio de contato, que voc\u00ea pode at\u00e9 adaptar para o seu site. Ele usar\u00e1 <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">JQuery<\/a> para enviar os dados, o que significa que n\u00e3o precisar\u00e1 recarregar a p\u00e1gina para enviar os dados. Ao inv\u00e9s disso, aparecer\u00e1 um gif animado mostrando que est\u00e1 em processamento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O que vou mostrar a seguir serve pra voc\u00ea entender o que est\u00e1 acontecendo, mas n\u00e3o \u00e9 o c\u00f3digo completo. No final desse post coloquei um link para baixar o c\u00f3digo completo para testar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiro, vamos ao layout. Bom, essa parte \u00e9 simples e vou usar <a href=\"https:\/\/getbootstrap.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">BOOTSTRAP<\/a> pra voc\u00ea se familiarizar (caso n\u00e3o conhe\u00e7a). A primeira parte fica assim:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>&lt;h1 id=&quot;contato&quot;&gt;Teste do Formul\u00e1rio de Contato&lt;\/h1&gt;\n&lt;p&gt;Um exemplo de uso do phpmailer&lt;\/p&gt;\n&lt;div id=&quot;formResult&quot;&gt;&lt;\/div&gt;\n&lt;div id=&quot;formDiv&quot;&gt;\n   &lt;form id=&quot;messageForm&quot; method=&quot;POST&quot; action=&quot;post_contato.php&quot;&gt;\n      &lt;div class=&quot;form-group&quot;&gt;\n         &lt;label&gt;Nome&lt;\/label&gt;\n         &lt;input type=&quot;text&quot; name=&quot;nome&quot; class=&quot;form-control&quot; placeholder=&quot;Seu Nome&quot; required&gt;\n      &lt;\/div&gt;\n      &lt;div class=&quot;form-group&quot;&gt;\n         &lt;label&gt;Email&lt;\/label&gt;\n         &lt;input type=&quot;email&quot; name=&quot;email&quot; class=&quot;form-control&quot; placeholder=&quot;name@example.com&quot; required&gt;\n      &lt;\/div&gt;\n      &lt;div class=&quot;form-group&quot;&gt;\n         &lt;label&gt;Mensagem&lt;\/label&gt;\n         &lt;textarea name=&quot;mensagem&quot; class=&quot;form-control&quot; id=&quot;txtMensagem&quot; rows=&quot;5&quot;&gt;&lt;\/textarea&gt;\n      &lt;\/div&gt;\n      &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;Enviar&lt;\/button&gt;\n   &lt;\/form&gt;\n&lt;\/div&gt;<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">E o resultado ser\u00e1 este:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"517\" src=\"https:\/\/www.leandroip.com\/wp-content\/uploads\/2020\/10\/formcontatoprint.png\" alt=\"\" class=\"wp-image-1112\" srcset=\"https:\/\/www.leandroip.com\/wp-content\/uploads\/2020\/10\/formcontatoprint.png 650w, https:\/\/www.leandroip.com\/wp-content\/uploads\/2020\/10\/formcontatoprint-600x477.png 600w, https:\/\/www.leandroip.com\/wp-content\/uploads\/2020\/10\/formcontatoprint-300x239.png 300w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><figcaption>Formul\u00e1rio de Contato<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, temos que enviar os dados do formul\u00e1rio para o servidor via JQuery (ajax). Ent\u00e3o acrescentamos uma por\u00e7\u00e3o de javascript:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>&lt;script&gt;\n    \/\/ Attach a submit handler to the form\n    $(&quot;#messageForm&quot;).submit(function(event) {\n      $(document).scrollTop($(&quot;#contato&quot;).offset().top);\n      $(&quot;#formDiv&quot;).slideUp();\n      $(&quot;#formResult&quot;).empty().append(&quot;&lt;div style=&#39;text-align:center&#39;&gt;&lt;img src=&#39;images\/ajax-loader.gif&#39;&gt;&lt;\/div&gt;&quot;);\n      \/\/ Stop form from submitting normally\n      event.preventDefault();\n\n      \/\/ Get some values from elements on the page:\n      var $form = $(this),\n        nome = $form.find(&quot;input[name=&#39;nome&#39;]&quot;).val(),\n        email = $form.find(&quot;input[name=&#39;email&#39;]&quot;).val(),\n        mensagem = $(&quot;#txtMensagem&quot;).val(),\n        url = $form.attr(&quot;action&quot;);\n\n      \/\/ Send the data using post\n      var posting = $.post(url, {\n          nome: nome,\n          email: email,\n          mensagem: mensagem,\n        },\n        function(data) {\n          $(&quot;#formResult&quot;).empty().append(data);\n        });\n    });\n  &lt;\/script&gt;<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Resumindo, a ideia desse trecho \u00e9:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Quando o usu\u00e1rio clicar em enviar <code>$(\"#messageForm\").submit<\/code><\/li><li>Rolar a tela para a posi\u00e7\u00e3o do formul\u00e1rio de contato, pois ele sumir\u00e1 dando lugar ao gif animado.<\/li><li>Evitar que o browser fa\u00e7a o envio padr\u00e3o do formul\u00e1rio, o que iria recarregar toda a p\u00e1gina.<\/li><li>Pegar os dados do formul\u00e1rio e enviar usando <code>$.post<\/code> para o script <code>post_contato.php<\/code> <\/li><li>Colocar o resultado no lugar do gif animado.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Agora vamos ao <code>post_contato.php<\/code>. Esse arquivo fica no servidor e tem a fun\u00e7\u00e3o de receber os dados e disparar o email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui eu vou resumir este arquivo para explicar, mas voc\u00ea pode baix\u00e1-lo completo no final desse post. <strong>Na linha 40 a m\u00e1gica \u00e9 feita.<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nrequire_once &#39;mailfunction.php&#39;;\n$webSiteEmail = &quot;fale@iotbras.com&quot;;\n$result = 0;\nif (isset($_POST[&quot;nome&quot;])) {\n  \/\/Dados do formul\u00e1rio\n  $nome = $_POST[&quot;nome&quot;];\n  $email = $_POST[&quot;email&quot;];\n  $message = $_POST[&quot;mensagem&quot;];\n  $messageHTML = str_replace(&quot;\\n&quot;, &quot;&lt;br\/&gt;&quot;, $_POST[&quot;mensagem&quot;]);\n\n  \/\/A vers\u00e3o HTML do email\n\/****************************************************** *\/\n  $msgHtml = &lt;&lt;&lt;HTML\n  &lt;div style=&quot;font-family:  &#39;Bookman Old Style&#39;&quot;&gt;\n    ...resumido...\n  &lt;\/div&gt;\nHTML; \/\/Este fechamento de heredoc n\u00e3o deve ser identado\n  \/\/Mantenha sempre na coluna 0, mesmo se for colocado dentro de uma fun\u00e7\u00e3o.\n\n  \/\/A vers\u00e3o texto da mensagem      \n\/****************************************************** *\/\n  $msgPlain = &lt;&lt;&lt;TXT\nSEU SITE\n-------------\n...resumido...\nwww.seusite.com.br\nTXT;\n\/****************************************************** *\/\n\n  \/\/Enviar para o cliente e tamb\u00e9m para mim\n  \/\/coloque aqui o email que quiser receber o contato\n  \/\/Neste caso, estou usando $webSiteEmail, pois checo ele diariamente\n  \/\/se for algo do tipo noreply, mude o $webSiteEmail para algumemailseu@seusite.com.br\n  $to_ar = array($webSiteEmail, $email);\n  $subject = &quot;Contato no Site&quot;;\n  $from_name = $_POST[&quot;email&quot;];\n\n  if (sendHtmlEmail($to_ar, $subject, $msgHtml, $msgPlain, \n      [&quot;ArquivoAnexo.txt&quot;], $sendHtmlEmail_config)) {\n    $result = 1;\n  }\n}\n?&gt;\n\n&lt;div class=&quot;alert &lt;?php echo ($result == 1) ? &quot;alert-success&quot; : &quot;alert-danger&quot;; ?&gt;&quot;&gt;\n  ...resumido html que mostra o resultado para o usu\u00e1rio...\n&lt;\/div&gt;\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, a fun\u00e7\u00e3o sendHtmlEmail eu deixei num arquivo separado para voc\u00ea poder reaproveitar. Segue:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nfunction sharedf_autoload($className)\n{\n    $filename = &#39;phpmailer\/class.&#39; . strtolower($className) . &#39;.php&#39;;\n    if (is_readable($filename)) {\n        require $filename;\n    } else {\n        \/\/ Error Generation Code Here\n        echo &quot;Class not founded: &quot; . $className;\n        die();\n    }\n}\nspl_autoload_register(&quot;sharedf_autoload&quot;);\n\n\/\/Essas configura\u00e7\u00f5es normalmente ficam num arquivo de configura\u00e7\u00e3o\n\/\/preencha com os dados do seu provedor de email.\n\/\/Op\u00e7\u00e3o com SSL\n$sendHtmlEmail_config = [\n    &quot;mail_from&quot; =&gt; &quot;fale@seuSiteAqui.com&quot;,\n    &quot;mail_host&quot; =&gt; &quot;mail.seuSiteAqui.com&quot;,\n    &quot;mail_user&quot; =&gt; &quot;fale@seuSiteAqui.com&quot;,\n    &quot;mail_pass&quot; =&gt; &quot;senhaAqui&quot;,\n    &quot;mail_port&quot; =&gt; 465\n];\n\nfunction sendHtmlEmail(\n    $to_ar, \/\/Um array de emails para enviar com copias\n    $subject, \/\/Assunto da mensagem\n    $msgHtml, \/\/Conte\u00fado em HTML\n    $msgPlain, \/\/Conte\u00fado em texto normal\n    $attach = [], \/\/Anexos\n    $configs \/\/Configura\u00e7\u00f5es do servidor de emails\n) {\n    $mail = new PHPMailer;\n    \/\/$mail-&gt;Timeout  =  10;\n    $mail-&gt;CharSet = &#39;UTF-8&#39;;\n\n    \/\/$mail-&gt;SMTPDebug = 3;  \/\/Ativar saida de erros (escreve erros na saida)\n\n    $mail-&gt;isSMTP();\n    $mail-&gt;Host = $configs[&quot;mail_host&quot;];\n    $mail-&gt;SMTPAuth = true;\n    $mail-&gt;Username = $configs[&quot;mail_user&quot;];\n    $mail-&gt;Password = $configs[&quot;mail_pass&quot;];\n    $mail-&gt;SMTPSecure = &#39;ssl&#39;;\n    \/\/$mail-&gt;SMTPSecure = &#39;tls&#39;;\n    $mail-&gt;Port = $configs[&quot;mail_port&quot;];\n\n    $mail-&gt;setFrom($configs[&quot;mail_from&quot;], $configs[&quot;mail_from&quot;]);\n    foreach ($to_ar as $v) {\n        $mail-&gt;addAddress($v);\n    }\n    $mail-&gt;isHTML(true);\n\n    $mail-&gt;Subject = $subject;\n    $mail-&gt;Body = $msgHtml;\n    $mail-&gt;AltBody = $msgPlain;\n\n    if (count($attach) &gt; 0) {\n        foreach ($attach as $v) {\n            $mail-&gt;AddAttachment($v);\n        }\n    }\n\n    if (!$mail-&gt;send()) {\n        \/\/Acao extra caso ocorra um erro, salve no seu arquivo de log.\n        \/\/Descomente a seguir se estiver tendo problemas, ou salve para o log\n        \/\/echo &#39;Mailer Error: &#39; . $mail-&gt;ErrorInfo;\n    } else {\n        \/\/echo &#39;Message has been sent&#39;;\n        return true;\n    }\n    return false;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Agora \u00e9 s\u00f3 incorporar no seu site. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estes s\u00e3o os arquivos para download. Lembre de configurar o seu email no arquivo <code>mailfunction.php<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-e5e3a83d-4cdc-4d22-b589-a440cd8c0105\" href=\"https:\/\/www.leandroip.com\/wp-content\/uploads\/2020\/10\/formcontato.zip\">formcontato<\/a><a href=\"https:\/\/www.leandroip.com\/wp-content\/uploads\/2020\/10\/formcontato.zip\" class=\"wp-block-file__button\" download aria-describedby=\"wp-block-file--media-e5e3a83d-4cdc-4d22-b589-a440cd8c0105\">Baixar<\/a><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Pra voc\u00ea aprender<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Agora, para conseguir desenvolver solu\u00e7\u00f5es aos mais diversos problemas, voc\u00ea precisa aprender a partir de um conte\u00fado mais completo e organizado. <\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Aqui tem um curso que vai acelerar a sua carreira no desenvolvimento WEB: <\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><a href=\"https:\/\/go.hotmart.com\/I75250507G\">Curso Desenvolvimento WEB e Aplicativo Flutter<\/a><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Aprenda desenvolvimento WEB e Aplicativo de forma integrada. Afinal, os aplicativos mais lucrativos sempre contam com uma plataforma WEB de suporte!!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O email \u00e9 uma das ferramentas mais importantes para qualquer neg\u00f3cio. Atrav\u00e9s deles neg\u00f3cios s\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1126,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[9,14,8,13,15,12,10,7,11],"class_list":["post-1107","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sistemas-web","tag-ajax","tag-anexo","tag-bootstrap","tag-contact","tag-email","tag-javascript","tag-jquery","tag-php","tag-phpmailer","entry","grid"],"_links":{"self":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/1107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1107"}],"version-history":[{"count":16,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/1107\/revisions"}],"predecessor-version":[{"id":1361,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/1107\/revisions\/1361"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/media\/1126"}],"wp:attachment":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}