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