Envio Ficheiros Por Formulário Para Email

Hoje gostaria de implementar no nosso Blog um assunto simples, porém, de grande importância: Envio de Ficheiros por Formulário Para Email.

Quem utiliza o PHP de forma profissional, certamente já encontrou algum cliente com necessidade de enviar ficheiro por formulário (especialmente gráficas que precisam receber ficheiro em formato do Corel ou Photoshop e muitas vezes, esses ficheiros não chegam por email, por causa de seu tamanho).

Através desta solução, você poderá implementar o script em seu site e resolver este problema!

Como fazemos em todas as nossas matérias, em anexo temos disponível os ficheiros para que tu possa estudar e testar a matéria que estamos lhe explicando.

Formulário Em HTML

Antes de partirmos para a programação, é importante analisar o formulário que vamos preencher para enviar o ficheiro. Por isso, abra o ficheiro index.php (disponível no arquivo em anexo – conforme o código e imagem a seguir).


<html>
<head>
<title>.:: WebMaster.PT :: Enviando Ficheiros ::.</title>
</head>
<body>
<table>
<form action='envia_email.php' method='post' enctype='multipart/form-data'>
<tr>
    <td>Nome:</td>
    <td><input type='text' name='nome'></td>
</tr>
<tr>
    <td>E-mail:</td>
    <td><input type='text' name='email'></td>
</tr>
<tr>
    <td>Assunto:</td>
    <td><input type='text' name='assunto'></td>
</tr>
<tr>
    <td>Mensagem:</td>
    <td><textarea name='msg' cols='30' rows='5'></textarea></td>
</tr>
<tr>
    <td>Ficheiro:</td>
    <td><input type='file' name='arquivo'></td>
</tr>
<tr>
    <td><input type='submit' value='Enviar'></td>
</tr>
</form>
</table>
</body>
</html>

FORMULÁRIO DE ENVIO

Copie e cole os ficheiros disponíveis em anexo em seu Servidor.

Preencha os dados disponíveis no formulário e selecione o ficheiro a ser enviado (conforme a imagem a seguir).

PREENCHIMENTO DO FORMULÁRIO

Após preencher todos os dados, clique no botão Enviar para efetuar o envio da mensagem.

Feito isso, a mensagem será enviada com sucesso.

OBS.: Não esqueça de alterar o email de recebimento nas linhas 22 e 28 do ficheiro “envia_email.php”.

Veja na imagem a seguir o exemplo de recebimento:

EMAIL RECEBIDO

Script De Envio Em PHP

Vamos analisar um pouco mais sobre o ficheiro “envia_email.php”.


----- Linha 3 a linha 6 -----
$nome     = $_POST['nome'];
$email    = $_POST['email'];
$assunto  = $_POST['assunto'];
$msg      = $_POST['msg'];

No trecho acima, recebemos as variáveis do ficheiro “index.php”.

OBS.: Não trouxemos o ficheiro, pois pretendemos fazer abaixo.


----- Linha 8 -----

$corpo = "Nome: $nome<br>E-mail: $email<br>Mensagem: $msg";

Através da linha acima, traremos os campos necessários para a apresentação do conteúdo em tela.

OBS.: Trata-se de uma apresentação simples e objetiva. Caso queira melhorar esta apresentação, apenas comente a linha 8 e insira o script abaixo logo na linha a seguir:


$corpo = "
<center><table width='500' border='0' cellspacing='1' cellpadding='4' bgcolor='#4a66a3'>
<tr>
    <td bgcolor='white' valign='top'><img src='IMAGEM DO TOPO' border='0'>
       <link rel='important stylesheet' href='chrome://messenger/skin/messageBody.css'>
       <style type='text/css' media='screen'>
       <!-- td { color: #069; font-size: 8pt; font-family: Arial, Verdana, Arial, Helvetica, sans-serif } --></style>
         <br>
        <p align='justify'><STRONG>Prezado Administrador</STRONG>, <br><br>
        Recebemos através do site SEUSITE.COM.PT a mensagem abaixo:<br>

          <br>
          <b>Nome:</b> $nome<br>
          <b>EMail:</b> $email<br>
          <b>Mensagem:</b> <br>$msg<br><br>
          
            Atenciosamente,<br><br>
            
             Central de Relacionamentos<br>
            <b>Sua Empresa ©</b><br>
            </font> <br>
            <b><font color='#7694CB' size='1' face='Verdana, Arial, Helvetica, sans-serif'>
            :: Politica de Privacidade::<br>
            </font></b> <font color='#7694CB' size='1' face='Verdana, Arial, Helvetica, sans-serif'>
            O envio e recebimento de nossas mensagens procura estar alinhado com o C&oacute;digo de &Eacute;tica Anti-SPAM que objetiva reger e orientar a comunica&ccedil;&atilde;o institucional, comercial e publicit&aacute;ria enviada sob a forma de mensagens eletr&ocirc;nicas.</font> <br>
          <hr size='1'>
       <font size='1' face='Verdana, Arial, Helvetica, sans-serif'>
       Temos a forte convic&ccedil;&atilde;o de que o rela&ccedil;&atilde;o entre cliente e empresa deve ser marcada pelo conceito de parceria, fortalecendo o v&iacute;nculo estabelecido em bases de confian&ccedil;a e apoio m&uacute;tuo.</font>
              </td></tr></table></center>";

OBS.: Altere informações como “Sua Empresa”, “Imagem” para personalizar este trecho do código.


----- Linha 10 a linha 16 -----

if (($fp = fopen($_FILES['arquivo']['tmp_name'],"rb")))
{
$anexo = fread($fp,filesize($_FILES['arquivo']['tmp_name']));
$anexo = base64_encode($anexo);
fclose($fp);
$anexo = chunk_split($anexo);
}

O trecho acima trata o recebimento do ficheiro que está sendo enviado.


----- Linha 17 a linha 25 -----

if ($anexo)
{
$mensagem = "--$bound\nContent-type: text/html\nContent-Transfer-Encoding: 7bit\n\n$corpo\n\n"
. "--$bound\nContent-type: $_FILES[arquivo][type]\nContent-Disposition: attachment; filename=" . $_FILES['arquivo']['name']

. "\nContent-Transfer-Encoding: base64\n\n$anexo\n"
. "--$bound\r\n";
mail("seuemail@webmaster.pt",$assunto,$mensagem,"From: $email\nMIME-Version: 1.0\nContent-type: multipart/mixed;

boundary=\"$bound\"");
print("Mensagem Enviada com Sucesso!");
//print($fp);
}

Se houver ficheiro a ser enviado, o sistema efetuará o envio para a conta de email acima descrita, (para o correto funcionamento, onde está escrito “seuemail@webmaster.pt”, altere para a sua conta de email).


----- Linha 26 a linha 30 -----

else
{
mail("seuemail@webmaster.pt",$assunto,$corpo,"From: $email\nContent-type: text/html");
print("Mensagem Enviada com Sucesso - Sem Anexo");
}

Se não houver ficheiro em anexo, o sistema efetuará o envio para a caixa de mensagens acima descrita sem o ficheiro, (para o correto funcionamento, onde está escrito “seuemail@webmaster.pt”, altere para a sua conta de email).

Trata-se de um script simples e poderá ser modificado de acordo com suas necessidades.

Ficamos por aqui em mais uma matéria! Esperamos tê-lo ajudado em algo…

Envie-nos suas dúvidas e dê sugestões para as próximas matérias! Nosso compromisso é lhe ajudar!

Download do código fonte utilizado neste tutorial: Envio Ficheiros Por Formulário Para Email

Be Sociable, Share!

17 Comentários

  1. Antonio Alves

    Como não percebo nada de php
    é possível explicar melhor o ficheiro envia_email.php tipo o código completo?
    Obrigado

  2. joao

    da linha 3 à 6 não se vê nada na primeira imagem, porque nao colocaram o código todo seguido, agora dá-me erro… n sei pk

    há partes nas imagens de baixo que nao sei onde se completam na de cima… como faço para meter o meu mail?

  3. Olá, eu gostaria de te perguntar aonde encontro um formulario do tipo: ENVIE SUA RECEITA AQUI. aí a pessoa escreve a receita e se tiver alguma foto da mesma vai no icone procurar e adiciona a imagem da receita. Apos isso ela envia e eu recebo no email, analiso e posto. Voce poderia me ajudar.

    Obrigado. Um abraço ….Marcos

  4. ola, eu fiz o download desse formulario, personalizei conforme a minha necessidade, porem, toda vez que tento enviar o formulario sem arquivo anexo da o seguinte erro: 

    " Warning: fopen() [function.fopen]: Filename cannot be empty in /home/netwanin/web/netwan/envia_trabalhe.php on line 107
    Mensagem Enviada com Sucesso – Sem AnexoMensagem Enviada com Sucesso – Sem Anexo "

    Você pode me ajudar a solucionar esse erro? 
    Ja sentei com o meu chefe, tentamos de varias maneiras que pareciam logicas mas nao conseguimos resolver.

    Obrigado, Wesley

    • Vitor Alves

      A mim também dá este erro, como dá para resolver? e quando tem o ficheiro, dá mensagem que $anexo é desconhecido!
      Será que dá para ajudar?

  5. Olá, só passo aqui para agradecer e parabenizar, ótimo post e de fácil compreensão para pessoas como eu que conhece muito pouco de web, procurei muito na internet sobre o assunto mas não conseguir encontrar nada tão bem explicado e de fácil aplicação. Você não tem ideia de como isso vai me ajudar.

    Abraço e parabéns novamente.

  6. Flávio Davila

    Olá!
    Primeiramente, Muito Obrigado pelo arquivo disponibilizado.
    Me serviu muito bem cara. foi 10! não foi 1000 kkkk.
    Eu só gostaria de saber como faço pra que nesse código um cliente possa me mandar ao invés de uma, varias fotos.
    Pode me ajudar?
    Grato!

  7. Rina

    Este realmente funciona! Obrigado por esta contribuição.

  8. Vitor Alves

    Boa tarde, ocorreu o seguinte erro:

    Warning: fopen() [function.fopen]: Filename cannot be empty in /"o_meu_endereço"/formulario.php on line 20
    Mensagem Enviada com Sucesso – Sem Anexo " 

    Será que me podem ajudar a solucionar este erro?

    Obrigado

    Continuação de excelente trabalho.

  9. Rafael

    Excelente. Depois de procurar bastante na internet esse foi o que funcionou melhor!

    Very good job! Work very well. Thank you very much.

  10. yurigutierres

    e como eu faço um formulário desse para o blog wordpress?

  11. victor

    Boa noite pessoal pra arrumar esse ero apenas adiciona  na primeira linha   " <? "     "<?php"   é um erro do IE

    abraços !

  12. Xolrac Ecap

    Quemuel obrigado! Ajudou muito e foi muito claro também.  Se eu quiser deixar o assunto fixo, para que o e-mail chegue sempre com o mesmo assunto onde devo alterar? Um abraço  e parabéns

  13. Rafael

    Alguém sabe como arrumar?
    Warning: fopen() [function.fopen]: Filename cannot be empty in D:weblocaluserxxxwwwenvia_email.php on line 10

    não consegui com a dica do victor!

  14. Renan

    Como faria para restringir o tipo de arquivo que pudesse ser enviado? Se, por exemplo, eu quiser que só me enviem arquivos .doc ?

    Obrigado

  15. karla

    Eu baixei em código mas não funcionou apresenta o seguinte erro, poderia me ajudar por favor?
    Ficarei muito grata!.

    E-mail: $email
    Mensagem: $msg"; $bound = "XYZ-" . date("dmYis") . "-ZYX"; if (($fp = fopen($_FILES['arquivo']['tmp_name'],"rb"))) { $anexo = fread($fp,filesize($_FILES['arquivo']['tmp_name'])); $anexo = base64_encode($anexo); fclose($fp); $anexo = chunk_split($anexo); } if ($anexo) { $mensagem = "–$boundnContent-type: text/htmlnContent-Transfer-Encoding: 7bitnn$corponn" . "–$boundnContent-type: $_FILES[arquivo][type]nContent-Disposition: attachment; filename=" . $_FILES['arquivo']['name'] . "nContent-Transfer-Encoding: base64nn$anexon" . "–$boundrn"; mail("cenartec.unn@gmail.com",$assunto,$mensagem,"From: $emailnMIME-Version: 1.0nContent-type: multipart/mixed; boundary="$bound""); print("Mensagem Enviada com Sucesso!"); //print($fp); } else { mail("cenartec.unn@gmail.com",$assunto,$corpo,"From: $emailnContent-type: text/html"); print("Mensagem Enviada com Sucesso – Sem Anexo"); } ?> 

    Obrigada

Participa! Comenta...