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>
 
<?php
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!

15 comentários em “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
  • 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

Deixe uma resposta

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