Jump to content


Photo

Adaptar Form Com Anexo


  • Faça o login para participar
6 replies to this topic

#1 Loi

Loi

    12 Horas

  • Usuários
  • 128 posts
  • Sexo:Não informado

Posted 12/12/2009, 19:50

Olá!
Estou "queimando" meus neurônios (pelo menos é difícil pra mim que não programo em PHP)! É o seguinte: arrumei um script pronto de formulário com anexo que está funcionando direitinho! Mas tem um problema: Só envia a mensagem se tiver um anexo! Quando vai somente texto, dá uma mensagem de erro! Quero que o usuário tenha opção de enviar anexo ou somente uma mensagem. Será que alguém pode me ajudar? Segue o código:

:<?
//pega os dados enviados pelo usuário
$nome = $_POST["nome"];
$body = "Nome: $nome
Telefone: $telefone
Mensagem: $mensagem";
$to = "luiz.noronha@terra.com.br"; //Coloque aqui o seu email
$from = $_POST["email_from"];
$subject = "Contato via website"; //Coloque aqui o assunto da mensagem enviada para o seu email
$attach = $_FILES["arquivo"]["tmp_name"];
$attach_name = $_FILES["arquivo"]["name"];
$attach_size = $_FILES["arquivo"]["size"];
$attach_type = $_FILES["arquivo"]["type"];

//verifica se o email do remetente é válido
if (!ereg("^([0-9,a-z,A-Z]+)([.,_]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([0-9,a-z,A-Z]){2}([0-9,a-z,A-Z])?$", $from)){

echo "<center>Erro: Digite um e-mail válido</center>";
exit;

}

//define os headers de envio
$mailheaders = "From: \"$nome\" <$from>\r\n";
$mailheaders .= "Reply-To: $from\n";
//e define a mensagem tirando barras para evitar problemas no script
$msg_body = stripslashes($body);


//verifica se tem arquivo anexo, o if é se tiver e o else se não tiver anexo
if ($attach !=null)
{
//abre o arquivo para codificá-lo no formato de email
$file = fopen($attach, "r");
$contents = fread($file, $attach_size);
$encoded_attach = chunk_split(base64_encode($contents));
fclose($file);
//define os headers do anexo e da mensagem
$mailheaders .= "MIME-version: 1.0\n";
$mailheaders .= "Content-type: multipart/mixed; ";
$mailheaders .= "boundary=\"Message-Boundary\"\n";
$mailheaders .= "Content-transfer-encoding: 7BIT\n";
$mailheaders .= "X-attachments: $attach_name";

$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";

$msg_body = $body_top . $msg_body;

$msg_body .= "\n\n--Message-Boundary\n";
$msg_body .= "Content-type: $attach_type; name=\"$attach_name\"\n";
$msg_body .= "Content-Transfer-Encoding: BASE64\n";
$msg_body .= "Content-disposition: attachment; filename=\"$attach_name\"\n\n";
$msg_body .= "$encoded_attach\n";
$msg_body .= "--Message-Boundary--\n";
//envia o email para as variáveis já definidas e tratadas e mostra mensagem de sucesso
mail($to, stripslashes($subject), $msg_body, $mailheaders);
header("Location:confirmacao_recebimento.html");
}
else{
//se não tiver anexo ele envia só a mensagem com esses headers
echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";
exit;
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: \"$nome\" <$from>\r\n";

mail($to, stripslashes($subject), $msg_body, $mailheaders);
header("Location:confirmacao_recebimento.html");
}
?>

Obrigado!
[],
Loi

#2 Augusto Saggese

Augusto Saggese

    12 Horas

  • Usuários
  • 218 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro
  • Interesses:(X)HTML, CSS, PHP, MySQL, ASP, JAVASCRIPT entre outros!

Posted 12/12/2009, 23:12

Seu erro é simples:

else{
//se não tiver anexo ele envia só a mensagem com esses headers
echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";
exit;
...

Voce da um exit; antes da execução do programa, ou seja exatamente aonde termina a msg de erro.

tente colocar o exit; no final do programa!

Tem que ficar assim:

else{
//se não tiver anexo ele envia só a mensagem com esses headers
echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: \"$nome\" <$from>\r\n";

mail($to, stripslashes($subject), $msg_body, $mailheaders);
header("Location:confirmacao_recebimento.html");
exit;
}

?>

:)

Edição feita por: Augusto Saggese, 12/12/2009, 23:16.

www.augustosaggese.com - "Na batalha da vida, só existem homens fortes, e um homem forte, sempre determina o seu destino".

#3 Loi

Loi

    12 Horas

  • Usuários
  • 128 posts
  • Sexo:Não informado

Posted 13/12/2009, 07:12

Seu erro é simples:

else{
//se não tiver anexo ele envia só a mensagem com esses headers
echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";
exit;
...

Voce da um exit; antes da execução do programa, ou seja exatamente aonde termina a msg de erro.

tente colocar o exit; no final do programa!

Tem que ficar assim:

else{
//se não tiver anexo ele envia só a mensagem com esses headers
echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: \"$nome\" <$from>\r\n";

mail($to, stripslashes($subject), $msg_body, $mailheaders);
header("Location:confirmacao_recebimento.html");
exit;
}

?>

:)



Augusto,
Fiz exatamente como vc respondeu e não deu certo! Dá uma msg de erro assim:

Erro: Envio de ficheiro obrigatório!!!

Warning: Cannot modify header information - headers already sent by (output started at /home/projetom/public_html/envia.php:64) in /home/projetom/public_html/envia.php on line 71

:(

#4 Augusto Saggese

Augusto Saggese

    12 Horas

  • Usuários
  • 218 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro
  • Interesses:(X)HTML, CSS, PHP, MySQL, ASP, JAVASCRIPT entre outros!

Posted 13/12/2009, 17:24

Deu certo sim, só que ai voce cometeu outro erro!

a função header não pode ficar dentro de saidas html.

Faça o redirecionamento em JS, ou jogue todo esse codigo em php antes de todos os codígos html, em cima do:

<?php

todo php aqui....

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Outra coisa para ser claro, caso não entenda o esquema do header.

Logo aqui já existem saida html

echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";

Mude isso:
header("Location:confirmacao_recebimento.html");

por isso:
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=confirmacao_recebimento.html\">";

Edição feita por: Augusto Saggese, 13/12/2009, 17:14.

www.augustosaggese.com - "Na batalha da vida, só existem homens fortes, e um homem forte, sempre determina o seu destino".

#5 Loi

Loi

    12 Horas

  • Usuários
  • 128 posts
  • Sexo:Não informado

Posted 14/12/2009, 08:17

Deu certo sim, só que ai voce cometeu outro erro!

a função header não pode ficar dentro de saidas html.

Faça o redirecionamento em JS, ou jogue todo esse codigo em php antes de todos os codígos html, em cima do:

<?php

todo php aqui....

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Outra coisa para ser claro, caso não entenda o esquema do header.

Logo aqui já existem saida html

echo "<center>Erro: Envio de ficheiro obrigatório!!!</center>";

Mude isso:
header("Location:confirmacao_recebimento.html");

por isso:
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=confirmacao_recebimento.html\">";


Agora sim! Muito obrigado. :)

#6 Augusto Saggese

Augusto Saggese

    12 Horas

  • Usuários
  • 218 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro
  • Interesses:(X)HTML, CSS, PHP, MySQL, ASP, JAVASCRIPT entre outros!

Posted 15/12/2009, 15:35

hehe abraços!
www.augustosaggese.com - "Na batalha da vida, só existem homens fortes, e um homem forte, sempre determina o seu destino".

#7 Valderes Zimmer

Valderes Zimmer

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 11/01/2010, 09:05

hehe abraços!

Olá, Bom dia.

Estou usando o mesmo script descrito acima, e estou tendo outro problema:

O email chega corretamente, mas sem o anexo.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq