Computador gamer barato para as férias
![](http://dudaskank.com/wp-content/uploads/2015/06/img18_mini-604x270.jpg)
As férias estão logo ali, e o pessoal que ainda está estudando vai ter algum tempo livre para passear e se divertir, e muitos de nós gostamos de nos divertir jogando alguma coisa. Leia mais
As férias estão logo ali, e o pessoal que ainda está estudando vai ter algum tempo livre para passear e se divertir, e muitos de nós gostamos de nos divertir jogando alguma coisa. Leia mais
Recentemente precisei montar um formulário de contato em PHP com a possibilidade de enviar um arquivo anexado, e percebi que o PHP não suporta isso nativamente pela função mail(). Como eu não quis usar nenhuma biblioteca de terceiros pronta, vi que seria necessário alterar o header do e-mail e acrescentar nele o anexo.
Para alcançar esse resultado, primeiramente precisei alterar o meu formulário. Este abaixo serve como exemplo, note o atributo enctype="multipart/form-data"
, sem ele não vai funcionar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!-- form.php --> <form action="envio.php" method="post" enctype="multipart/form-data"> <p> <label for="nome">Nome</label> <input type="text" name="nome" id="nome" required="" /> </p> <p> <label for="email">Email</label> <input type="email" name="email" id="email" required="" /> </p> <p> <label for="anexo">Anexo</label> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> <input type="file" id="anexo" name='anexo' /> </p> </form> |
No script que vai receber os dados para envio, verifico a existência do anexo, já que ele é opcional, e codifico ele no header do e-mail. Aproveito e também dou uma limpada nos textos enviados, para evitar o chamado Email injection, já que não devemos confiar em textos enviados pelo usuário.
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 67 68 69 70 71 72 73 74 |
<?php // evitar email injection function clean_string($string) { $bad = array( "content-type", "bcc:", "to:", "cc:", "href" ); return str_replace($bad, "", $string); } //variáveis $status = false; $nome = clean_string($_POST['nome']); $email = clean_string($_POST['email']); $mensagem = "Enviado pelo <strong>formulário de contato</strong>"; $assunto = "Contato"; // Assunto do E-mail // se o nome temporário do arquivo estiver vazio, ele não foi enviado if (empty($_FILES['anexo']['tmp_name'])) { //cabeçalho $headers = "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: $nome <$email>\r\n"; //E-Mail do destinatário $headers .= "Reply-To: $email\r\n"; //envio $status = mail ($destino, $assunto, $observacao, $headers); } else { // inicialmente, abre o arquivo e converte ele para base64 $file = $_FILES['anexo']['tmp_name']; $originalFile = $_FILES['anexo']['name']; $file_size = filesize($file); $handle = fopen($file, "rb"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); // separador aleatório necessário para enviar conteúdo mixed $separator = md5(time()); // fim de linha (usando uma constante do PHP para fim de linha) $eol = PHP_EOL; // cabeçalho principal (multipart obrigatório) $headers = "From: $nome <$email>" . $eol; $headers .= "MIME-Version: 1.0" . $eol; $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol . $eol; $headers .= "Content-Transfer-Encoding: 8bit" . $eol; $headers .= "This is a MIME encoded message." . $eol . $eol; // mensagem (apenas formato html aqui) $headers .= "--" . $separator . $eol; $headers .= "Content-Type: text/html; charset=\"utf-8\"" . $eol; $headers .= $mensagem . $eol . $eol; // anexo usando o nome do arquivo original $headers .= "--" . $separator . $eol; $headers .= "Content-Type: application/octet-stream; name=\"" . $originalFile . "\"" . $eol; $headers .= "Content-Transfer-Encoding: base64" . $eol; $headers .= "Content-Disposition: attachment" . $eol . $eol; $headers .= $content . $eol . $eol; $headers .= "--" . $separator . "--"; // enviar email $status = mail($destino, $assunto, "", $headers); } if ($status) { echo "Envio com sucesso"; } else { echo "Ocorreu um erro no envio"; } |
Pronto, com isso agora o formulário é capaz de enviar os anexos corretamente.
Fontes
Aqui no trabalho eu estava desenvolvendo a página para envio de formulário de contato através de e-mail e, ao copiar o site para a minha instalação do XAMPP, ao invés do site aparecer surgiu na verdade o meu código PHP na janela do Browser.
Pesquisei sobre o assunto e há uma resposta bem completa no Stack Overflow sobre esse assunto, e no meu caso era pelo código estar abrindo as tags php com <?
ao invés de usar <?php e uma pesquisa rápida no meu código mostrou 785 ocorrências de todas as aberturas do PHP.
Por sorte, o Notepad++ conta com recursos bem interessantes na hora de localizar e substituir trechos em arquivos, e só precisei fazer uns testes usando o site regexpal para encontrar a expressão regular correta.
Inicialmente, busquei todas as tags que não tinham php, e a expressão regular usada foi <\?(?!php)
. Fiz um teste para ver se funcionava como esperado, e substitui por “<?php "
como deveria ser. Sem as aspas, elas estão aí apenas para evidenciar o espaço extra adicionado ao final.
Ao rodar o site, resolveu o problema.
Durante e depois da minha recente atualização no meu servidor, percebi que diversas vezes apareciam caracteres que não faziam sentido, sempre quando haviam acentos ou nas aplicações para configuração, onde são desenhadas algumas caixas no terminal. Não foi difícil perceber que o sistema estava tentando mandar para a tela caracteres UTF-8 e ela não estava esperando por isso.
Confirmei através do comando locale
que eu já estava com a configuração correta, pt_BR.UTF-8. Através de uma pesquisa, descobri os comandos necessários para configurar o terminal corretamente:
1 2 3 |
sudo dpkg-reconfigure locales sudo apt-get install console-data sudo dpkg-reconfigure console-data |
Minha escolha de opções aqui foi a seguinte:
Altere isso conforme sua necessidade, em seguida entre o comando:
1 |
sudo dpkg-reconfigure console-setup |
E selecione o encoding UTF-8, em seguida escolhi Latin 1, Fixed, 16. Pronto, agora o terminal está exibindo os caracteres corretamente e ainda posso usar acentos pelo teclado.
Após um longo período sem usar (provavelmente mais de um ano), resolvi atualizar o meu pequeno servidor caseiro que estava funcionando como servidor para Minecrat e que originalmente seria o meu NAS de baixo custo.
Pesquisando encontrei rapidamente a forma como fazer isso, e é através do comando:
do-release-upgrade
Fonte: https://help.ubuntu.com/lts/serverguide/installing-upgrading.html