Ajuda em script para envio de mail por php

Started by t_e_e_m, June 21, 2009, 09:52:52 PM

Previous topic - Next topic

t_e_e_m

Boas. num site estou a querer colocar um formulario para contacto atraves de php.

o formulario:

o codigo em html fica:

<form name="form1" method="post" action="email.php">
  <table width="100" border="0" cellspacing="0" cellpadding="0" align="center">
    <tr bgcolor="#F4F4F4">
      <td valign="top" width="100" nowrap><h3><font class="texto">Nome:</font></h3></td>
      <td>
        <input class="form_campos" type="text" name="nome" size="34">      </td>
    </tr>
    <tr bgcolor="#EFEFEF">
      <td valign="top" width="100" nowrap><h3><font class="texto">E-mail:</font></h3></td>
      <td>
        <input class="form_campos" type="text" name="email" size="34">      </td>
    </tr>
    <tr bgcolor="#F4F4F4">
      <td valign="top" width="100" nowrap><h3><font class="texto">Assunto:</font></h3></td>
      <td>
        <select class="form_campos" name="assunto">
          <option class="form_campos" value="Opinião" selected>Opinião</option>
          <option class="form_campos" value="Sugestão">Sugestão</option>
          <option value="Marcação">Marcação</option>
          <option class="form_campos" value="Reclamação">Reclamação</option>
          <option class="form_campos" value="Outros">Outros</option>
        </select>      </td>
    </tr>
    <tr bgcolor="#EFEFEF">
      <td valign="top" width="100" nowrap><h3><font class="texto">Mensagem:</font></h3></td>
      <td>
        <textarea class="form_campos" name="mensagem" cols="34" rows="4"></textarea>      </td>
    </tr>
    <tr bgcolor="#F4F4F4">
      <td colspan="2" valign="middle">
        

        <div align="center">
          <input class="form_botao" type="submit" name="Enviar" value="Enviar Mensagem">
          <input class="form_botao" type="reset" name="Limpar" value="Limpar">
        </div>      </td>
    </tr>
  </table>
</form>




um codigo php da configuração

config.php

<?
/*
* Configurações do formulário de Contato
* Altere a variavel $mail_destino para o seu email
*
*/

//Seu email, para onde irao as informações do formulário
$mail_destino      = "xxxxxxxx@sapo.pt";

//Mensagem de cabeçalho do email
$mail_header      = "Mensagem enviada pelo formulário do Formulário de Contato.";

//Mensagem para o email de resposta
$msg_reply         = " $nome, recebemos o seu email com o assunto $assunto. Obrigado por nos contactar";

//Mensagem de Erro
$msg_erro         = "Os campos <font color=$cor_site>Nome, Mensagem e E-mail</font> não podem estar em branco.";
?>

ficheiro php email_form.php

<form name="form1" method="post"  action="email.php"
  <table width="100" border="0" cellspacing="0" cellpadding="0" align="center">
    <tr bgcolor="">
      <td valign="top" width="100" nowrap><font class="texto">Nome:</font></td>
      <td>
        <input class="form_campos" type="text" name="nome" size="29">      </td>
    </tr>
    <tr bgcolor="">
      <td valign="top" width="100" nowrap><font class="texto">E-mail:</font></td>
      <td>
        <input class="form_campos" type="text" name="email" size="29">      </td>
    </tr>
    <tr bgcolor="">
      <td valign="top" width="100" nowrap><font class="texto">Assunto:</font></td>
      <td>
        <select name="assunto" class="form_campos">
          <option class="form_campos" value="Opinião" selected>Opinião</option>
          <option class="form_campos" value="Marcação">Marcação</option>
          <option class="form_campos" value="Sugestão">Sugestão</option>
          <option class="form_campos" value="Reclamação">Reclamação</option>
          <option class="form_campos" value="Sem assunto">Outros</option>
         
        </select>      </td>
    </tr>
    <tr bgcolor="">
      <td valign="top" width="100" nowrap><font class="texto">Mensagem:</font></td>
      <td>
        <textarea class="form_campos" name="mensagem" cols="29" rows="4"></textarea>      </td>
    </tr>
    <tr bgcolor= bgcolor="">
      <td colspan="2" valign="middle">
        

        <div align="center">
          <input class="form_botao" type="submit" name="Enviar" value="Enviar Mensagem">
          <input class="form_botao" type="reset" name="Limpar" value="Limpar">
        </div>      </td>
    </tr>
  </table>
</form>


 e por fim


Ficheiro email.php


<?php

include("config.php");

//Testa campos obrigatórios
if ($nome!="" and $mensagem!="" and $email!="")
   {
   $msg.="Nome: $nome\n";
   $msg.="E-mail: $email\n";
   $msg.="Assunto: $assunto\n";
   $msg.="$mensagem\n";
   
   if (@ mail ($mail_destino, $assunto, $msg, $mail_header))
      {
      //Imprimindo confirmação de envio
      echo
         "
         <html>
         <meta http-equiv=refresh content=5;URL=formcall.html></html>";
         echo "$nome, a mensagem:
 $mensagem
.Foi enviada com sucesso!
";
         echo "Obrigado!


         ";
      //Enviando mensagem de confirmação para o email do internauta
      @ mail ($email, "Re: $assunto", $msg_repy, $mail_header);
      }
      else
      echo
         "
         <meta http-equiv=refresh content=5;URL=formcall.html>
         </html><center>

<font color=red>
         Erro ao enviar e-mail!
         </font></center>
         ";
   }
else
   {
   //Alerta sobre os campos obrigatórios
   echo
      "
      

<center>
      $msg_erro


      <a href=\"java script:window.history.go(-1)\" class=\"links\">Preencha correctamente os campos.</a>
      </center>
      ";
   }
?>


TAl ccomo podem constactar este codigo tem uma confrimação de preencimento dos campos nome, mensagem e e-mail. aqquando o preenchimento do fromulario apesar de ter toos os campos preenchidos, aparece sempre a informação de que  os campos em causa nao estao preenchidos, e nao é enviada a mensagem.

O que estarei a afzer mai, o servidor suporta php.

Teotónio Ricardo

Por uma vista rápida, tu não estás a declarar a variável $nome...

t_e_e_m

[quote name=\'cenourinha]Por uma vista rápida\' date=\' tu não estás a declarar a variável $nome...[/quote\']


Mais concretamente, onde pode ver essa falta??

ORiOn16

Alguns servidores tem o envio de email desactivado no PHP. Onde é que estás?

Teotónio Ricardo

Quoteif ($nome!="" and $mensagem!="" and $email!="")

Isto nunca vai ocorrer, por as variáveis vão dar sempre vazio. Tens que dar um valor antes a variável.

$nome = $_POST['nome'];
$mensagem = $_POST['mensagem'];
$email = $_POST['email'];

Algo deste género, que vai associar as variáveis o valor do formulário.

t_e_e_m

Quote from: ORiOn16Alguns servidores tem o envio de email desactivado no PHP. Onde é que estás?


alojamentogratuito.com

Quote from: cenourinhaIsto nunca vai ocorrer, por as variáveis vão dar sempre vazio. Tens que dar um valor antes a variável.

$nome = $_POST['nome'];
$mensagem = $_POST['mensagem'];
$email = $_POST['email'];

Algo deste género, que vai associar as variáveis o valor do formulário.


entao sera aqui que tenho de alterar ???

//Testa campos obrigatórios
if ($nome!="" and $mensagem!="" and $email!="")
{
$msg.="Nome: $nome\n";
$msg.="E-mail: $email\n";
$msg.="Assunto: $assunto\n";
$msg.="$mensagem\n";

if (@ mail ($mail_destino, $assunto, $msg, $mail_header))
{

t_e_e_m

ninguem, tem mais nada para me ajudar???

ilovehentai

#7
O que provavelmente se passa é que quem criou esse script tinha as register_globals on, se não souberes o que isso é vê aqui,
http://pt2.php.net/manual/en/ini.core.php#...egister-globals

Provavelmente o teu servidor tem e diga-se de passagem muito correctamente as register_globals OFF visto ser um buraco de todo tamanho na segurança, o que tens que fazer é meramente declarar as tuas variáveis passando os valores do POST do formulário

Podes saber mais acerca de POST aqui : -> http://www.w3schools.com/php/php_post.asp

Assim:

$nome = $_POST['nome'];
$email = $_POST['email'] ;
$assunto= $_POST['assunto'] ;
$mensagem = $_POST['mensagem'];

antes da validação que tens ou seja antes de

if ($nome!="" and $mensagem!="" and $email!="")


Para concluir o código que tens aí está pobremente construido, muito mau e com imensas falhas de segurança
Força aí


t_e_e_m

Quote from: ilovehentaiO que provavelmente se passa é que quem criou esse script tinha as register_globals on, se não souberes o que isso é vê aqui,
http://pt2.php.net/manual/en/ini.core.php#...egister-globals

Provavelmente o teu servidor tem e diga-se de passagem muito correctamente as register_globals OFF visto ser um buraco de todo tamanho na segurança, o que tens que fazer é meramente declarar as tuas variáveis passando os valores do POST do formulário

Podes saber mais acerca de POST aqui : -> http://www.w3schools.com/php/php_post.asp

Assim:

$nome = $_POST['nome'];
$email = $_POST['email'] ;
$assunto= $_POST['assunto'] ;
$mensagem = $_POST['mensagem'];

antes da validação que tens ou seja antes de

if ($nome!="" and $mensagem!="" and $email!="")


Para concluir o código que tens aí está pobremente construido, muito mau e com imensas falhas de segurança
Força aí


Com essa alteração fica seguro??

ilovehentai

Fica meramente mais seguro em relação as register_globals, mas no fundo não, repara por exemplo a única validação que tens para o email é ver se o valor do campo de email não está vazio, quando fazes no if $email != "" a única coisa que tás a fazer é ver se o valor $email é diferente de vazio, significa que facilmente poderia colocar o que quiser no valor do email basta la colocar um simples "a" ou fazer um ataque por injecção no email , saber mais aqui -> http://www.bl0g.co.uk/20060214/php-mail-em...-to-send-email/

Cuidado com os cabeçalhos do e-mail

O que podes fazer para resolver isso mais simplesmente é fazer uma validação do valor do e-mail por expressão regular

$regexp = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/";
if (preg_match($regexp, $email)) {
echo "Email address is valid.";
} else {
echo "Email address is not valid.";
}

Acima de tudo, estudar mais um pouco e procurares saber quais os problemas existem ao enviar mails pela função mail() do PHP

t_e_e_m

[quote name=\'ilovehentai]Fica meramente mais seguro em relação as register_globals\' date=\' mas no fundo não, repara por exemplo a única validação que tens para o email é ver se o valor do campo de email não está vazio, quando fazes no if $email != "" a única coisa que tás a fazer é ver se o valor $email é diferente de vazio, significa que facilmente poderia colocar o que quiser no valor do email basta la colocar um simples "a" ou fazer um ataque por injecção no email , saber mais aqui -> http://www.bl0g.co.uk/20060214/php-mail-em...-to-send-email/

Cuidado com os cabeçalhos do e-mail

O que podes fazer para resolver isso mais simplesmente é fazer uma validação do valor do e-mail por expressão regular

$regexp = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/";
if (preg_match($regexp, $email)) {
echo "Email address is valid.";
} else {
echo "Email address is not valid.";
}

Acima de tudo, estudar mais um pouco e procurares saber quais os problemas existem ao enviar mails pela função mail() do PHP[/quote]

Então acha arriscado ter o formulario num site?
 
eu não percebop muito de php. Eu vou alterar o codigo e depois posso pedir para que me reveja o mesmo?

t_e_e_m

#12
Agora coloquei assim o codigo:


<?php

include("config.php");

//Testa campos obrigatórios
if ($nome!="" and $mensagem!="" and $email!="")

$nome = $_POST['nome'];
$email = $_POST['email'] ;
$assunto= $_POST['assunto'] ;
$mensagem = $_POST['mensagem'];

   if (@ mail ($mail_destino, $assunto, $msg, $mail_header))
      {
      //Imprimindo confirmação de envio
      echo
         "
         <html>
         <meta http-equiv=refresh content=5;URL=formcall.html></html>";
         echo "$nome, a mensagem:
 $mensagem
.Foi enviada com sucesso!
";
         echo "Obrigado!


         ";
      //Enviando mensagem de confirmação para o email do internauta
      @ mail ($email, "Re: $assunto", $msg_repy, $mail_header);
      }
      else
      echo
         "
         <meta http-equiv=refresh content=5;URL=formcall.html>
         </html><center>

<font color=red>
         Erro ao enviar e-mail!
         </font></center>
         ";
   }
else
   {
   //Alerta sobre os campos obrigatórios
   echo
      "
      

<center>
      $msg_erro


      <a href=\"java script:window.history.go(-1)\" class=\"links\">Preencha correctamente os campos.</a>
      </center>
      ";
   }
?>







Mas ao enviar a mensagem aparece a seguointe mensagem:


Parse error: syntax error, unexpected '}' in /home/crbpt/public_html/email.php on line 34

Alguem me pode ajudar neste problema!! ainda nao consegui por isto de pé e estou mesmo a precisar de uma coisa deste genero.


Podem dar uma maozinha?

Teotónio Ricardo

Acho que já te respondemos a tudo... deves analisar a informação que te foi passada e tirar proveito dela.

t_e_e_m

Quote from: cenourinhaAcho que já te respondemos a tudo... deves analisar a informação que te foi passada e tirar proveito dela.

E agradeço bastante a informação passado, mas tentei fazer o que ilovehentai e da o erro que citei em cima.

ilovehentai

Na linha 34 tens uma chaveta a mais ou então esquecestes do ponto e vírgula, confirma

t_e_e_m

Tirei a chaveta e da erro na linha 25!! lol

ilovehentai

Moço precisas de começar pelo básico mesmo antes de te aventurar mais, quando inicias uma condição um IF por exemplo usas as chavetas para englobar o procedimento a tomar caso essa condição for verdadeira

assim temos

if($condicao){

  //procedimento da condição 1 caso ela seja veradeira

}else if($condicao2){

  //caso a condição tiver sido falsa e a condição 2 verdadeira executa este procedimento

}else{


  // se nenhuma das anteriores for veradeiras executa o que tiver aqui

}


No teu caso o script é assim

include("config.php");

//Testa campos obrigatórios
if ($nome!="" && $mensagem!="" && $email!=""){

$nome = $_POST['nome'];
$email = $_POST['email'];
$assunto= $_POST['assunto'];
$mensagem = $_POST['mensagem'];

if (@mail($mail_destino, $assunto, $msg, $mail_header))
{
//Imprimindo confirmação de envio
echo
"

";
echo "$nome, a mensagem:
 $mensagem
.Foi enviada com sucesso!
";
echo "Obrigado!


";
//Enviando mensagem de confirmação para o email do internauta
@mail($email, "Re: $assunto", $msg_repy, $mail_header);
}else{
echo
"




Erro ao enviar e-mail!

";
}

}else{

//Alerta sobre os campos obrigatórios
echo
"



$msg_erro


Preencha correctamente os campos.

";

}

?>

t_e_e_m

Passado algum tempo cá estou eu, por questões de saude tive de me ausentar.

eu coloquei o codigo que o  ilovehentai me indicou corrigido, e mantem os erros! o que se passara?

t_e_e_m

apesar de completar todos os campos, da a informação que nao preenchi os dados.