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!

28 comentários em “PHP: Usando PHPMailer para envio de email com anexo”

  1. 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

    1. 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);
      }
      1. Rhaisa M Guedes

        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.

        1. Rhaisa M Guedes

          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

          1. boa tarde Rhaisa tudo bem ?
            fiz igual o seu e nao funcionou aqui

            input id=”files” name=”files[]”

            send.php

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

    1. Fala Marcio.

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

      if($_GET['acao'] == 'enviar'){
      var_dump($_FILES);
      exit();
      1. 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) } }

  2. 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.

  3. Mauricio José Souza Cardoso

    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?

      1. 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();

  4. 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?

    1. 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

  5. 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?

Deixe um comentário

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

Rolar para cima