Enviar E-mail com anexo utilizando a classe PHPMailer – PHP

Uma função constantemente solicitada em projetos WEB é o envio de e-mail via sistema, seja para solicitar confirmação de um novo cadastro de usuário, emitir uma mensagem de boas vindas ou recuperação de senha, quase sempre é necessário implementar o envio automático de mensagens. Desde a versão 4 do PHP que podemos contar com uma função nativa para esta tarefa, trata-se da função mail().

Com a função mail() é muito fácil desenvolver um método que envia mensagens simples de e-mail pelo sistema e por conta desta facilidade a função nativa conquistou muitos adeptos, porém quando se faz necessário o envio de mensagens mais complexas, com envio de arquivos anexos, por exemplo, começa a complicar um pouco já que a função não é tão bem especificada como deveria, por conta disto costumo utilizar a classe PHPMailer nos projetos onde é necessário o envio de mensagens por e-mail.

Como Enviar e-mail com anexos

O primeiro passo para enviar e-mail com anexos utilizando o PHPMAiler é baixar a classe que é distribuída livremente e você encontra o link no site oficial do projeto PHPMailer. Após baixar descompacte o arquivo e vamos começar a trabalhar.

Abaixo segue o código de um formulário simples em HTML e logo em seguida o código, comentado, para o envio da mensagem com o anexo.

Arquivo form.php

1
2
3
4
5
6
7
8
<h1>Envio de e-mail com arquivo anexo</h1>
<form action="envio.php" method="post" enctype="multipart/form-data" />
   <label for="nome">Nome</label> <input type="text" name="nome" id="nome" /><br />
    <label for="email">E-mail</label> <input type="text" name="email" id="email" /><br />
    <label for="mensagem">Mensagem</label> <input type="text" name="mensagem" id="mensagem" /><br />
    <label for="arquivo">Arquivo</label> <input type="file" name="arquivo" id="arqivo" />
    <input type="submit" value="ok" />
</form>

Um erro comum que costumo ver em alguns scripts é a falta do atributo ectype="multipart/form-data" na tag

, observem na linha 2. O enctype só precisa ser informado quando vamos enviar algum arquivo via formulário, como normalmente os formulários não enviam arquivos é comum não utilizar este atributo e por conta disto acabamos esquecendo de utilizar quando é necessário. Se você tem certeza que o código PHP esta correto, a pasta que vai receber o arquivo tem permissão de escrita mas mesmo assim não consegue fazer upload lembre-se, o erro pode estar ai.

Arquivo envio.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
/**
 * Código para envio de e-mail utilizando a classe PHPMailer
 *
 * @author Leo Baiano <leobaiano@leobaiano.com>
 * @version 1.0
*/
 
// Chama a classe PHPMailer (pode baixar ela aqui: http://phpmailer.sourceforge.net)
require_once('phpmailer/class.phpmailer.php');
 
// Instancia o objeto $mail a partir da Classe PHPMailer
$mail = new PHPMailer();
 
// Recupera os dados do formulário
$nome       = $_POST['nome'];
$email      = $_POST['email'];
$mensagem   = $_POST['mensagem'];
$arquivo    = $_FILES["arquivo"];
 
// Recupera o nome do arquivo
$arquivo_nome = $arquivo['name'];
 
// Recupera o caminho temporario do arquivo no servidor
$arquivo_caminho = $arquivo['tmp_name'];
 
// Monta a mensagem que será enviada
$corpo = "
            <strong>Nome:</strong> $nome<br />
	    <strong>E-mail:</strong> $email<br />				
	    <strong>Messagem:</strong><br /><br />
	    $mensagem
	";
$corpoSimples = "
            Nome: $nome\n
	    E-mail: $email\n				
	    Messagem:\n\n
	    $mensagem
	";
 
// Informo o Host, From, subject e para quem o e-mail será enviado
$mail->Host = 'mail.dominio.com';
$mail->From = $email;
$mail->Subject = 'Assunto da mensagem';
$mail->AddAddress('email@email.com');
 
// Informa que a mensagem deve ser enviada em HTML
$mail->IsHTML(true);
 
// Informa o corpo da mensagem
$mail->Body = $corpo;
 
// Se o e-mail destino não suportar HTML ele envia o texto simples
$mail->AltBody = $corpoSimples;
 
// Anexa o arquivo
$mail->AddAttachment($arquivo_caminho, $arquivo_nome);
 
// Tenta enviar o e-mail e analisa o resultado
if ($mail->Send()) {
    echo 'E-mail enviado co sucesso';
}
else {
    echo 'Erro:' . $mail->ErrorInfo;
}
?>

Uma das coisas que gostaria de comentar é o método AltBody, ele é utilizado para incluir uma mensagem alternativa, sem HTML, para o caso do recipiente que receberá a mensagem não aceitar HTML.

Outra coisa, é possível gerar um arquivo anexo a mensagem a partir de uma string com o método AddStringAttachament. Vamos imaginar que você precisa enviar, por e-mail, um arquivo com dados gerados a partir de uma busca no banco de dados, você pode salvar o conteúdo em uma string e enviar utilizando o método supra citado, a sintaxe é:

1
$mail->AddStringAttachament($texto, 'arquivo.txt');

Vale muito a pena estudar a classe PHPMailer se você precisa de um sistema que envie mensagens complexas por e-mail.

Tentei comentar ao máximo o código acima então não vou entrar em detalhes, o post já ficou bem grande, mas se tiver alguma dúvida ou encontrar alguma dificuldade é só escrever nos comentários do post que terei o maior prazer em ajudar.

Se você gostou deste post, escreva um comentário e/ou cadastre-se em nosso feed.

Comentários

Ainda não há comentários.

Escreva um Comentário

(obrigatório)

(obrigatório)