PHP: Usando PHPMailer para envio de email com anexo

PHPMailer é uma classe PHP utilizada para envio de emails, por todo o mundo.

Primeiro você precisa fazer o download clicando aqui.

Após o download, descompacte o arquivo e coloque os arquivos class.phpmailer.php e class.smtp.php em uma pasta de sua preferência.

Vamos a um exemplo simples e prático:

O script abaixo mostra como enviar um email contendo anexo.

# email-com-anexo.php

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Enviar e-mail com anexo</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="?acao=enviar" enctype="multipart/form-data">
   <table width="500" border="0" align="center" cellpadding="0" cellspacing="2">
   <tr>
     <td align="right">Nome:</td>
     <td><input type="text" name="nome" id="nome" /></td>
   </tr>
   <tr>
     <td align="right">Assunto:</td>
     <td><input type="text" name="assunto" id="assunto" /></td>
   </tr>
   <tr>
     <td align="right">Mensagem:</td>
     <td><textarea name="mensagem" id="mensagem" cols="45" rows="5"></textarea></td>
   </tr>
   <tr>
     <td align="right">Anexo:</td>
     <td><input type="file" id="arquivo" name="arquivo" /></td>
   </tr>
   <tr>
     <td colspan="2" align="center"><input type="submit" value="Enviar" /></td>
   </tr>
   </table>
</form>
 
<?
if($_GET['acao'] == 'enviar'){
 $nome 	    = $_POST['nome'];
 $assunto   = $_POST['assunto'];
 $mensagem  = $_POST['mensagem'];
 $arquivo   = $_FILES["arquivo"];
 
 $corpoMSG = "<strong>Nome:</strong> $nome<br> <strong>Mensagem:</strong> $mensagem";
 // chamada da classe		
 require_once('class.phpmailer.php');
 // instanciando a classe
 $mail   = new PHPMailer();
 // email do remetente
 $mail->SetFrom('remetente@dominio.com.br', 'remetente');
 // email do destinatario
 $address = "destinatario@dominio.com.br";
 $mail->AddAddress($address, "destinatario");
 // assunto da mensagem
 $mail->Subject = $assunto;
 // corpo da mensagem
 $mail->MsgHTML($corpoMSG);
 // anexar arquivo
 $mail->AddAttachment($arquivo['tmp_name'], $arquivo['name']  );
 
 if(!$mail->Send()) {
   echo "Erro: " . $mail->ErrorInfo;
  } else {
   echo "Mensagem enviada com sucesso!";
  }
}
?>
</body>
</html>

Dentre as diversas possibilidades da classe PHPMailer, está o envio de email via SMTP autenticado, diminuindo a chance do seu email cair em SPAM.

Até a próxima!

26 thoughts on “PHP: Usando PHPMailer para envio de email com anexo

  • 4 de fevereiro de 2015 em 10:25
    Permalink

    Muito bom, simples e objetivo.

    Resposta
  • 4 de abril de 2015 em 22:57
    Permalink

    Aonde alocar os arquivos de download? Sem essa informação o post não tem muito sentido, para mim!

    Resposta
    • 18 de maio de 2015 em 10:55
      Permalink

      Como o arquivo vai ser enviado por e-mail, não há necessidade de alocar.

      Resposta
  • 28 de julho de 2015 em 23:18
    Permalink

    Muito bom o tutorial, já usava o phpmailer mas nunca havia feito inserção de arquivo. Me ajudou bastante, valeu!

    Só uma dúvida, é possível limitar o tamanho do arquivo? pra evitar que o cara tente enviar um arquivo de 2gb por exemplo e trave o email rs

    valeu

    Resposta
  • 1 de novembro de 2015 em 1:01
    Permalink

    Muito bom seu código depois de muito exemplos que vi pela a internet a fora o seu é de longe o melhor! Parabéns e obrigado por compartilhar seu conhecimento conosco. Abraço!

    Resposta
  • 28 de janeiro de 2016 em 12:09
    Permalink

    Otimo post, uma duvida como faço para enviar mais de um anexo?

    Resposta
    • 8 de fevereiro de 2018 em 7:59
      Permalink

      Olá Cassio,

      vc deve usar mais de uma vez $mail->AddAttachment():

      segue exemplo:

      <form action="upload.php" method="post" enctype="multipart/form-data">
        Envie esses arquivos:<br />
        <input name="arquivo[]" type="file" /><br />
        <input name="arquivo[]" type="file" /><br />
        <input type="submit" value="Enviar arquivos" />
      </form>
       
      $total = count($_FILES['arquivo']['name']);
       
      for($i=0; $i<$total; $i++) {
        // arquivo temporário
        $temp = $_FILES['arquivo']['tmp_name'][$i];
        $arquivo = $_FILES['arquivo']['name'][$i];
       
        $mail->AddAttachment($temp, $arquivo);
      }
      Resposta
      • 21 de maio de 2020 em 11:34
        Permalink

        Bom dia,
        Antes, muito obrigada pelo conteúdo.

        Estou tentando implementar o envio de vários anexos na minha aplicação, porém quando coloco mais de um input, não funciona. o Script tá igualzinho, com apenas 1 input envia lindamente. Apenas quando coloco mais inputs ou multiple file, a tela fica em branco e não faz nada.

        Seguem códigos:

        if (isset($_FILES[‘VarAnex’][‘name’])) {
        $count = count($_FILES[‘VarAnex’][‘tmp_name’]);
        for ($i = 0; $i AddAttachment($temp,$arquivo);
        //$anexo = true;
        }
        }

        Assim já não funciona mais:

        Alguém poderia me dar uma luz?

        Desde já agradeço.

        Resposta
        • 21 de maio de 2020 em 11:37
          Permalink

          Não apareceram os HTML.

          FUNCIONA:
          div class=”campo” style=”height: 50%”
          input type=”file” id=”VarAnex” name=”VarAnex[]”/
          input type=”hidden” name=”MAX_FILE_SIZE” value=”10000000″
          /div

          Não Funciona:
          div class=”campo” style=”height: 50%”
          input type=”file” id=”VarAnex” name=”VarAnex[]”
          input type=”file” id=”VarAnex” name=”VarAnex[]”
          input type=”hidden” name=”MAX_FILE_SIZE” value=”10000000″
          /div

          Resposta
  • 17 de abril de 2016 em 11:42
    Permalink

    Muito Obrigado, me ajudou muito 😀

    Resposta
  • 6 de fevereiro de 2018 em 12:19
    Permalink

    Opa, tudo bem?
    Então…
    o e-mail foi enviado corretamente, mas o anexo não foi…
    e também não acusou nenhum erro…

    Resposta
    • 8 de fevereiro de 2018 em 7:49
      Permalink

      Fala Marcio.

      Veja se o arquivo está sendo enviado com um simples comando:

      if($_GET['acao'] == 'enviar'){
      var_dump($_FILES);
      exit();
      Resposta
      • 28 de fevereiro de 2018 em 15:08
        Permalink

        Olá Tiago!
        Primeiramente, obrigado pela resposta e ajuda.
        Usei o comando conforme falou, mas o anexo continua não vindo…só o e-mail…

        olha a resposta do comando que forneceu:
        array(1) { [“arquivo”]=> array(5) { [“name”]=> string(36) “gifs-sentimentos-sobre-comida_31.gif” [“type”]=> string(9) “image/gif” [“tmp_name”]=> string(14) “/tmp/phpiQNfSu” [“error”]=> int(0) [“size”]=> int(403109) } }

        Resposta
  • 16 de setembro de 2019 em 15:19
    Permalink

    Fantástico. Resolveu um problema persistente num processo operacional que tínhamos por aqui.
    Muito obrigado! Desejo que alguém possa te ajudar como você me ajudou.

    Resposta
  • 10 de dezembro de 2019 em 23:56
    Permalink

    Ainda não tinha conhecido essa função. Obrigado por postar. Um abraço.

    Resposta
  • 8 de janeiro de 2020 em 14:59
    Permalink

    Cara, não consegui implementar a solução.
    Lá no começo do artigo você diz pra baixar aquele zip, que é o pacote com os fontes e outros arquivos da biblioteca phpmailer. Depois você diz pra copiar os arquivos “class.phpmailer.php” e “class.smtp.php” para uma pasta da minha preferência.
    Mas esses arquivos não estão no zip.
    Eu também tentei usar o composer pra instalar mas não gera as classes. De onde eu baixo essa classes?

    Resposta
      • 14 de março de 2022 em 11:59
        Permalink

        Tiago, sou no em php

        estou usando dois arquivos um html e outro php,
        o email é enviado mas com anexo sempre dá erro e não envia, voce pode me ajudar ?

        meu html vai chamar o php via ajax
        ajaxobjd18 = criaajax();
        var url = “enviarpropemail.php”;
        var dados = “assunto=” + “Proposta: ” + arquivocompletp;
        dados = dados + “&eemailven=” + weemailven;
        dados = dados + “&eemailcli=” + weemailcli;
        dados = dados + “&eemailage=” + weemailage;
        dados = dados + “&arquivo=” + file.name;

        ajaxobjd18.onreadystatechange = function()
        {
        if (ajaxobjd18.readyState == 4 && ajaxobjd18.status == 200)
        {
        var retorno = ajaxobjd18.responseText;
        alert(“Mensagem ” + retorno);
        }
        }
        ajaxobjd18.open(“POST”, url, true);
        ajaxobjd18.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
        ajaxobjd18.send(dados);

        meu php
        …..
        $arquivo = $_FILES[‘arquivo’];

        $mail->AddAttachment($arquivo[‘tmp_name’], $arquivo[‘name’] );

        $mail->send();

        Resposta
  • 4 de março de 2020 em 9:50
    Permalink

    Parabéns pelo script. Nunca entendi muito bem o phpmailer e agora deixei ele de lado.

    Resposta
  • 26 de maio de 2021 em 15:05
    Permalink

    Então, estou tentando anexar uma imagem ao corpo do e-mail e estou fazendo assim:

    $mensagem = “;

    $mail = new PHPMailer();

    $mail->IsSMTP();
    $mail->IsHTML(true);
    $mail->SMTPAuth = true;
    $mail->CharSet = ‘UTF-8’;
    $mail->Host = ‘smtp.’.substr(strstr($serverEmail, ‘@’), 1);
    $mail->Port = ‘587’;
    $mail->Username = $serverEmail;
    $mail->Password = $serverPassword;
    $mail->From = $senderEmail;
    $mail->FromName = $senderName;
    $mail->Subject = $sunject;
    $mail->AddEmbeddedImage(dirname(__DIR__) . “/../public/assets/imgs/logo.png”, “logo”);
    $mail->Body = $messageConcatenated;
    $mail->AddAddress($sendToEmail,utf8_decode($sendToName));
    $mail->SMTPDebug = 2;

    O e-mail vai corretamente.

    Problema:

    No GMAIL e no HOTMAIL a imagem aparece corretamente no corpo do e-mail

    No BOL, a imagem não aparece. O que aparece é aquele viagenzinha de que a imagem não foi encontrada. No entanto, ao exibir o código fonte, aparece apenas a tag img

    Parece que o BOL não sabe tratar a incorporação dessa forma pois, ao colocar a imagem normalmente, tipo:

    ,

    funciona no BOL mas não funciona nos demais

    Alguém sabe como resolver isso?

    Resposta
    • 26 de maio de 2021 em 15:11
      Permalink

      Então, estou tentando anexar uma imagem ao corpo do e-mail e estou fazendo assim:

      $mensagem = \”\;

      $mail = new PHPMailer();

      $mail->IsSMTP();
      $mail->IsHTML(true);
      $mail->SMTPAuth = true;
      $mail->CharSet = ‘UTF-8’;
      $mail->Host = ‘smtp.’.substr(strstr($serverEmail, ‘@’), 1);
      $mail->Port = ‘587’;
      $mail->Username = $serverEmail;
      $mail->Password = $serverPassword;
      $mail->From = $senderEmail;
      $mail->FromName = $senderName;
      $mail->Subject = $sunject;
      $mail->AddEmbeddedImage(dirname(__DIR__) . “/../public/assets/imgs/logo.png”, “logo”);
      $mail->Body = $messageConcatenated;
      $mail->AddAddress($sendToEmail,utf8_decode($sendToName));
      $mail->SMTPDebug = 2;

      O e-mail vai corretamente.

      Problema:

      No GMAIL e no HOTMAIL a imagem aparece corretamente no corpo do e-mail

      No BOL, a imagem não aparece. O que aparece é aquele viagenzinha de que a imagem não foi encontrada. No entanto, ao exibir o código fonte, aparece apenas a tag img

      \\

      Parece que o BOL não sabe tratar a incorporação dessa forma pois, ao colocar a imagem normalmente, tipo:

      \,\

      funciona no BOL mas não funciona nos demais

      Alguém sabe como resolver isso?

      Obs.: foi necessário adicionar barra invertida senão a tag da imagem não aparecerá aqui

      Resposta
  • 28 de junho de 2021 em 16:18
    Permalink

    Subi os 2 arquivos, o que expõe aqui nessa pagina criando a pagina email-com-anexo.php e na mesma pasta joguei os 2 que sugere class.smtp.php e o class.phpmailer.php simplesmente carrega o formulario novamente ao enviar e não envia o email, no arquivo class.smtp.php editei as portas de 25 para 587 também e nada…

    tem que editar algo mais?

    Resposta

Deixe uma resposta

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