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!
Novamente me salvando, valeu pela grande ajuda.
Muito bom, simples e objetivo.
Aonde alocar os arquivos de download? Sem essa informação o post não tem muito sentido, para mim!
Como o arquivo vai ser enviado por e-mail, não há necessidade de alocar.
Massa demais, super funcional, simples e resolveu meu problema!
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
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!
Otimo post, uma duvida como faço para enviar mais de um anexo?
Olá Cassio,
vc deve usar mais de uma vez $mail->AddAttachment():
segue exemplo:
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.
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
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;
}
Muito Obrigado, me ajudou muito 😀
Show de Bola
muito bommmmm… maravilhaaa
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…
Fala Marcio.
Veja se o arquivo está sendo enviado com um simples comando:
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) } }
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.
Ainda não tinha conhecido essa função. Obrigado por postar. Um abraço.
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?
Mauricio,
baixe o arquivo neste link https://github.com/PHPMailer/PHPMailer/tree/5.2-stable
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();
Parabéns pelo script. Nunca entendi muito bem o phpmailer e agora deixei ele de lado.
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?
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
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?
boa tarde galera tudo bem ? quero enviar 2 anexo pelo formulario para nao consegui executar isto alguem pode me ajudar ?