Ir ao conteúdo
  • Cadastre-se

Retorno pos envio email


Posts recomendados

Olá pessoal queria tirar uma dúvida de algo que eu não me lembro.

 

Por exemplo eu tenho uma pagina html com um form de contato, nesse form eu chamo uma pagina php para fazer o envio.

<form  name="contatc" enctype="multipart/form-data"  action="contactMail.php" accept-charset="ISO-8859-1" method="post">

Até o envio do email não é o problema, eu gostaria de saber como faço para dar um altert somente ao voltar para a pagina com o form de contato

Eu quero evitar usar

echo '<script>alert("XXXXX");</script>';

. Obs essa pagina que tem o form, não possui código ativo algum (PHP, Java,Ruby) somente Javascript.

 

No caso são dois alerts um de tiver Ok e um se der erro.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark Olá, seja bem vindo em nosso Clube do Hardware.

 

Bem, no momento penso em duas soluções:

1) Usar o alert que você disse que queria evitar em conjunto com o history.go(-1)  que faz voltar para o formulário.

 

2) Usar Ajax e requisitar o envio de email de forma assíncrona sem sair do formulário.

 

Dentre os dois, o segundo eu acho melhor. Mas nesse caso é mais simples fazer com jQuery. 

Link para o comentário
Compartilhar em outros sites

DiF, eu não me lembro o nome, mas ha um tempo atras eu fiz uma pagina tipo portfólio com HTML5, onde o formulário de contato, ele envia para uma pagina PHP e ela devolve para a mesma pagina mas com dados na URL; tipo http://index.html#contact ?resp=. O que eu não estou me lembrando é como faço esse tipo de retorno, depois que meu HD deu pau to tentando recriar minhas lib de programação. Abs

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark Não é  uma prática ideal fazer isso.

Visto que o GET aceita apenas  1024 caracteres.

 

Se for para envio de poucos dados, serve. Como por exemplo na pesquisa do google. Note que quando faz uma pesquisa aparece na url as palavras que você procurou.

 

Mas para envio de contatos, GET não serve. Melhor ser via POST.

 

5 minutos atrás, lakesidepark disse:

HTML5, onde o formulário de contato, ele envia para uma pagina PHP e ela devolve para a mesma magina

Desconheço  este modo, sem ser por requisição assíncrona( sem sair da página) ou usar o history.go(-1) para voltar ao formulário.

Link para o comentário
Compartilhar em outros sites

por exemplo na pagina index.html, o form de contato envia via POST para a contactMail.php

 

a contactMail.php, iria retornar somente um código tipo, via javascript ou PHP, ou Jquery

index.html#contact?code=112

Na pagina index iria executar alguma coisa tipo Javascript, Jquery

if $code==112
     {
             window.alert("Email Enviado"):
      }

 

adicionado 13 minutos depois
function queryString(parameter) {  
              var loc = location.search.substring(1, location.search.length);   
              var param_value = false;   
              var params = loc.split("&");   
              for (i=0; i<params.length;i++) {   
                  param_name = params[i].substring(0,params[i].indexOf('='));   
                  if (param_name == parameter) {                                          
                      param_value = params[i].substring(params[i].indexOf('=')+1)   
                  }   
              }   
              if (param_value) {   
                  return param_value;   
              }   
              else {   
                  return false;   
              }   
        }

var variavel = queryString("minhaVariavel");

Sorte minha achei uma parte do que preciso em um backup antigo, agora no html5 onde a navegação é de id ex: #produtos ou #contato, 

 

quando no PHP eu executar Header ou Echo

window.location.replace='index.html#contato?code=112'

qual comando fica melhor para eu chamar a queryString, no Onload ou onselect

 

 

Fluxo -> index.html#contato -> contactMail.php -> index.html#contato ---> Alert

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark Nunca desenvolvi algo como isso, até onde sabia não tinha como você enviar dados a um arquivo php e depois o resultado do php trazer de volta a página anterior.

 

Poderia fazer isso, se o formulário e o recebimento dos dados e retorno seja no mesmo arquivo index.php por exemplo.  Mas de forma separada não. Para trazer o alert sem ser por ajax teria que incorporar direto no php dentro do echo.

 

Porém, com HTML 5, há um método chamado Local storage, que pode armazenar no próprio navegador alguma coisa e depois recuperar de novo.. mas não sei se entra nesse caso.

 

Gostaria de saber, porque você não faz de forma assíncrona com retorno de alert na mesma página?

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark  Vamos lá!

 

Primeiro você precisa importar a bliblioteca jQuery no seu index.html

Antes deveria ser dentro de <head>, mas pelas boas práticas atuais, pode-se colocar os arquivos .js  no final da página antes do <body>  ser finalizado. ( o jquery precisar ser o primeiro arquivo .js  a ser carregado)

 

Para importar você tem duas opções:

Usar o CDN online  ou baixar o arquivo e importar direto do seu servidor.

No exemplo vou usar o CDN online

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

Com ele importado agora estamos aptos para escrever o código em jQuery.

 

Primeiro você retira o action do formulário, porque vamos chama-lo no jQuery.

 

Coloque um identificador no botão submit, seja ID ou Class. Por exemplo  id="btn_enviar" ou class="btn_enviar"

 

No jQuery:

//Quando o documento estiver pronto
$(document).ready(function(){
  
  /*
    variável que armazena a identidicação do botão
    Se usar class troque para $(".btn_enviar")
  */
  var btn = $("#btn_enviar");
  
  
  //Atribuimos o evento de click no botão
  btn.on("click", function(){
      var dados = $("#form_envio").serialize();
      
      //chama a função ajax()
      $.ajax({
           url: "contactMail.php",
           datatype: "HTML",
           method: "POST",
           data: dados
      }).done(function(retorno){
           alert(retorno);
      }).fail(function(retorno){
           alert(retorno); 
      }); 
     
  });
});

Desta forma fazemos a requisição assíncrona do arquivo conctactMail.php.

Lá no arquivo contactMail.php,  ao fazer a verificação se foi enviada ou não, você apenas colocar textos por exemplo:

 

if(enviado):
   echo "Obrigado! Foi enviado corretamente";
else:
   echo "Algo deu errado. :( ";
endif;

 No jQuery, aquela variável retorno como parâmetro dentro de done() ou fail()  são o echo apresentado lá na verificação do envio do e-mail.

 

É por aí a coisa.   Sugestão, combine o jQuery ajax  com o PHPmailer   que é uma bibiloteca php própria para envios de e-mail. Que por sinal é a melhor que tem.  A função nativa de envio no php é bem ruim!

 

No mais, qualquer coisa prende o grito aqui  que eu  tento ajudar de novo :thumbsup:

Link para o comentário
Compartilhar em outros sites

Dif, bom dia

 

 só para eu tirar uma dúvida para uso do Jquery meu form deixa de ser assim:

<form  name="contatc" enctype="multipart/form-data"  action="contactMail.php" accept-charset="ISO-8859-1" method="post">
									<div>

e fica assim

 

<form  name="contatc" enctype="multipart/form-data"  accept-charset="ISO-8859-1">
							

Uma dúvida que me surgiu, antes eu validava campos como e-mail, nome, no PHP, vale a pena manter no PHP, sendo as funções de validação as primeiras a serem chamadas?

function validaemail()
{
	$_mail=$_POST['email'];
	//verifica se e-mail esta no formato correto de escrita
	if (!ereg('^([a-zA-Z0-9.-])*([@])([a-z0-9]).([a-z]{2,3})',$_mail))
	{
		$mensagem='E-mail Invalido!';
		return $mensagem;
	}
	else
	{
		//Valida o dominio
		$dominio=explode('@',$_mail);
		if(!checkdnsrr($dominio[1],'A'))
		{
			$mensagem='E-mail Invalido!';
			return $mensagem;
		}
		else
		{return true;} // Retorno true para indicar que o e-mail é valido
	}
}


	//echo "OK POST EXISTE L104";
	if(validaemail()=='1' or validaemail()==1)
	{	
		
		if(smtpmailer()==1)
    	{	
			echo "Obrigado! Foi enviado corretamente";			
    	}
    	else
		{ 	
			echo "Erro no envio do e-mail!";			
		}	
	     
	}
	else if(!validaemail())
	{
		echo "O E-mail informado é invalido.";			
	}	
}

 

 

no meu PHP eu chamo a phpmailer

 require("servletPHP/class.phpmailer.php");

Abs

 

 

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark

No form, dê um ID para ele, por exemplo id="form_envio"   justamente para pegar os dados dele  com o serialize()

 

5 horas atrás, lakesidepark disse:

vale a pena manter no PHP, sendo as funções de validação as primeiras a serem chamadas?

Sim!   valide pelo php também, embora no html 5 possa ter uma validação por parte de cliente!

 

No caso do seu phpmailer,

a versão mais recente chama um arquivo de autoload, encarregado de carregar os arquivos do phpmailer necessário.

 

 

PS: agora que eu vi, você está enviando arquivo junto com o formulário, com o enctype="multipart/form-data"

 

Nesse caso, precisa ser um pouco diferente, usar o FormData:

var dados = new FormData();
$.each($('#file')[0].files, function(i, file) {
    data.append('file-'+i, file);
});


$.ajax({
    url: 'contactMail.php',
    data: dados,
    cache: false,
    contentType: false,
    processData: false,
    type: 'POST'
    
}).done(function(retorno){
    alert(retorno);

});

Veja que como é arquivo, precisa forçar o cache como  false, contentType como false e processData como false.

 

Se o objetivo é mandar  texto e arquivos juntos veja este link:

https://stackoverflow.com/questions/10899384/uploading-both-data-and-files-in-one-form-using-ajax

 

Na segunda postagem onde diz:  <275> The problem I had was using the wrong jQuery identifier.

Link para o comentário
Compartilhar em outros sites

Dif, esculpa essa trabalheira que eu to te dando.

 

Vamos lá;

 

Meu Form 

 

<form  name="contatc" id="form_envio" accept-charset="ISO-8859-1" enctype="multipart/form-data"> <!--action="contactMail.php    " -->
									<div>
										<div class="row">
											<div class="6u 12u$(mobile)">
												<input type="text" name="name" placeholder="Name" autocomplete="off" />
											</div>
											<div class="6u$ 12u$(mobile)">
												<input type="text" name="email" placeholder="Email" autocomplete="off" />
											</div>
											<div class="12u$">
												<input type="text" name="subject" placeholder="Subject" autocomplete="off"/>
											</div>
											<div class="12u$">
												<textarea name="message" placeholder="Message" rows="8"></textarea>
											</div>
											<div class="12u$">
												<input type="button" id="btn_enviar" value="Enviar" onClick="this.form.submit(); this.disabled=true; this.value='Enviando…'; " />
											</div>
										</div>
									</div>
								</form>

Meu JQuery /Ajax 

 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
		<script>
		//Quando o documento estiver pronto
		$(document).ready(function(){
  
			/*
				variável que armazena a identidicação do botão
				Se usar class troque para $(".btn_enviar")
			*/
			var btn = $("#btn_enviar");
    
			//Atribuimos o evento de click no botão
			btn.on("click", function(){
			var dados = $("#form_envio").serialize();
      
			//chama a função ajax()
			$.ajax({
				url: "contactMail.php",
				datatype: "HTML",
				method: "POST",
				data: dados
				}).done(function(retorno){
           alert(retorno);
			}).fail(function(retorno){
				alert(retorno); 
			}); 
     
			});
		});
		</script>


Até aqui sem problemas está enviando normalmente e os e-mails estão chegando.

 

O problema que está aparecendo para mim, é o retorno da contactMail.php, e o retorno está caindo no .fail e o alert não está aparecendo algumas menssagens, está assim:  [ Object Object ];

<?php

// Inclui o arquivo class.phpmailer.php localizado na pasta phpmailer
require_once("servletPHP/class.phpmailer.php");
require_once("servletPHP/class.smtp.php");   


define('GUSER', 'contato.fast***@gmail.com');	// <-- Insira aqui o seu GMail
define('GPWD', '***');		// <-- Insira aqui a senha do seu GMail


function smtpmailer()
{
	
	global $error; 
	global $htmlbody;
	
	
	$para="comercial@****.com.br";
	
	
	$mail = new PHPMailer(true);
	$mail->IsSMTP();			// Ativar SMTP
	$mail->SMTPDebug = 1;		// Debugar: 1 = erros e mensagens, 2 = mensagens apenas
	$mail->SMTPAuth = true;		// Autenticação ativada
	$mail->SMTPSecure = 'ssl';	// SSL REQUERIDO pelo GMail
	$mail->Host = 'smtp.gmail.com';	// SMTP utilizado
	$mail->Port = 465;  		// A porta 587 deverá estar aberta em seu servidor
	$mail->Username = GUSER;
	$mail->Password = GPWD;
    $mail->CharSet = "UTF-8";
							date_default_timezone_set('America/Sao_Paulo');
	$mail->Subject = "Contato Via Website ".date("d/m/y")."  ".date("h:i");
	$mail->SetFrom($_POST['email'],$_POST['name']);
	$mail->AddReplyTo($_POST['email'], $_POST['name']);	
	$mail->Sender=$_POST['email'];
	$mail->AddAddress($para);	
	$mail->isHTML(true);
	$mail->CharSet = 'ISO-8859-1';	
		
    
    $htmlbody="";
	$htmlbody.='<table>';
	$htmlbody.='<tr>';
	$htmlbody.='<td width="80px">&nbsp;</td>';
	$htmlbody.=' <td width="84%" align="left" valign="top"><p><font style="font-family: Georgia, Times, serif; color:#010101; font-size:24px"><strong><em>Contato Website,</em></strong></font><br/>';
	$htmlbody.='</p>';
	$htmlbody.='<p><font style="font-family: Verdana, Geneva, sans-serif; color:#666766; font-size:13px; line-height:21px">Nome:'.$_POST['name'].'</font></p>';
	$htmlbody.='<p><font style="font-family: Verdana, Geneva, sans-serif; color:#666766; font-size:13px; line-height:21px">Email:'.$_POST['email'].'</font></p>';
	$htmlbody.=' <p><font style="font-family: Verdana, Geneva, sans-serif; color:#666766; font-size:13px; line-height:21px">Assunto:'.$_POST['subject'].'</font></p>';
	$htmlbody.='<p><font style="font-family: Georgia,  Times, serif; color: #010101; font-size: 16px"><strong><em>Enviou a seguinte mensagem,</em></strong></font></p>';
	$htmlbody.='<p><font style="font-family: Verdana, Geneva, sans-serif; color:#666766; font-size:13px; line-height:21px"> ......'.$_POST['message'].'<br/>';
	$htmlbody.='<br/>';
	$htmlbody.='</font></p></td>';
	$htmlbody.='<td width="8%">&nbsp;</td>';
	$htmlbody.='</tr>';
	$htmlbody.='<tr>';
	$htmlbody.='<td>&nbsp;</td>';
	$htmlbody.='</tr>';
	$htmlbody.='</table>';
	
	
    $mail->MsgHTML($htmlbody);	
	
	if(!$mail->Send()) 
	{
		$error = 'Mail error: '.$mail->ErrorInfo; 
		return false;
	} 
	else 
	{
		$error = 'Mensagem enviada!';
		return true;
	}	
}


function validaemail()
{
	$_mail=$_POST['email'];
	//verifica se e-mail esta no formato correto de escrita
	if (!ereg('^([a-zA-Z0-9.-])*([@])([a-z0-9]).([a-z]{2,3})',$_mail))
	{
		$mensagem='E-mail Invalido!';
		return $mensagem;
	}
	else 
	{
		//Valida o dominio
		$dominio=explode('@',$_mail);
		if(!checkdnsrr($dominio[1],'A'))
		{
			$mensagem='E-mail Invalido!';
			return $mensagem;
		}	
		else 
		{
			return true; // Retorno true para indicar que o e-mail é valido	
		} 
	}
}



	
	if(validaemail()=='1' or validaemail()==1)
	{				
		if(smtpmailer()==1)
    	{
			echo "Obrigado! Foi enviado corretamente";
			exit();
    	}
    	else
		{ 	
			echo "Houve um erro ao enviar o e-mail";
			exit();
		}    	   
	}
	else 
	{
		echo "O E-mail informado é invalido.";		
	}	



?>

 

contactMail.7z

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark Então,

Achei que você estava tentando enviar um formulário com o campo file junto. Não é o caso, então desconsidera meus post anterior #10.

 

Vamos lá.

 

No seu formulário, retire o atributo enctype porque você não vai enviar arquivo, então ele é desnecessário.

Ainda no formulário, altere o botão de enviar de tipo button, para  submit.

 

No php, noto que você esta usando a forma antiga de usar a classe phpmailer.

 

Acesse o Github do phpmailer aqui: https://github.com/PHPMailer/PHPMailer

Baixe  esta nova versão.

 

Ela muda algumas coisas como a chamada de um arquivo chamado autoload.

Lá no github, se rolar a página verá um código de exemplo para você seguir!  Tente fazer exatamente como eles mostram, só alterando para suas credenciais  e variáveis.

 

No seu php, vejo que você seta o charset duas vezes, em UTF-8 e ISO-8859-1

 

Esta função  $mail->MsgHTML($htmlbody);     pode não ser mais existente na versão.

 

Na verificação de email enviado,  não precisa do return false ou true.

 

Use sempre, o exemplo oficial no github!  ele é o modelo perfeito para entender a classe!

 

 

Link para o comentário
Compartilhar em outros sites

Então, mas para validar o campo e-mail, e os demais para que não possa ser enviado, e-mail digitado incorretamente, e algum campo faltante, o posso chamar em uma função dentro do meu PHP, validar e executar o

 if(!$mail->send()) 

ou seria mais fácil, fazer isso no Ajax/JQuery.

 

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark Você pode validar pelo cliente sim,  via jquery antes de enviar o formulário.. ou validar no php,

Muito desenvolvedor  gosta de validar nos dois, outros preferem validar no cliente  por ser mais rápido.

Pois validando no php, primeiro tem que ser feita a requisição no servidor.  No cliente é direto.

 

Mas não entendi porque você perguntou desta parte do if  "not"

Ali ele testa se NÃO foi enviado.  

Link para o comentário
Compartilhar em outros sites

  • Moderador

@lakesidepark Você fez alguma coisa errada ali... não sei dizer com certeza.  Mas aparecer o código em php no alert  tem cara de que o php não foi interpretado.

 veja se o apache estava parado na hora disso.

 

4 horas atrás, lakesidepark disse:

quando a volta da classe php para o ajax eu tenho que converter para string o valor da variável de retorno?

Não!  No php não precisa converter nada.

 

O retorno sempre será uma string aqui:

if(!$mail->send()) {
    //estes dois echos devem ser mostrados no alert
    //caso o email não seja enviado
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    //este é a mensagem de que foi enviado.
    //será mostrado no alert
    echo 'Message has been sent';
}

Por gentileza, poste seu código de novo só do php para eu poder analisar

Link para o comentário
Compartilhar em outros sites

DIf, bom dia, depois de muito dor de cabeça consegui resolver todos meus problemas, melhorei minha validação de email, e  enxuguei minha classe sendMail.php.

 

Uma dúvida, após a alert com a mensagem  como faço para limpar ; a URL  para não ficar assim:

http://index.html?name=JJL&email=petero%40gmail.com&subject=Teste&message=Teste#contact

Ou redir para outra pagina eu tentei adicionar, window.location.href=""; após o alert mas não acontece nada.

 

Att

Link para o comentário
Compartilhar em outros sites

Mas eu estou enviando por POST

 

//Quando o documento estiver pronto
		$(document).ready(function(){
  
			/*
				variável que armazena a identidicação do botão
				Se usar class troque para $(".btn_enviar")
			*/
			var btn = $("#btn_enviar");
    
			//Atribuimos o evento de click no botão
			btn.on("click", function(){
			var dados = $("#form_envio").serialize();
      
			//chama a função ajax()
			$.ajax({
				url: "sendMail.php",
				datatype: "HTML",
				method: "POST",
				data: dados
				}).done(function(retorno){
           alert(retorno);
		   
			}).fail(function(retorno)
			{
				//alert(retorno+" dd");
				alert("Email enviado com sucesso.");				
			}); 
     
			});
		});

 

Link para o comentário
Compartilhar em outros sites

A não ser que seja erro do Xampp. O que não é de duvidar.

adicionado 45 minutos depois

Resolvido, alterei meu form, agora a URL fica limpa após o envio.

 

<form  name="contatc" id="form_envio" enctype='application/x-www-form-urlencoded' method='POST'>
									<div>
										<div class="row">
											<div class="6u 12u$(mobile)">
												<input type="text" name="name" placeholder="Name" autocomplete="off" />
											</div>
											<div class="6u$ 12u$(mobile)">
												<input type="text" name="email" placeholder="Email" autocomplete="off" />
											</div>
											<div class="12u$">
												<input type="text" name="subject" placeholder="Subject" autocomplete="off"/>
											</div>
											<div class="12u$">
												<textarea name="message" placeholder="Message" rows="8"></textarea>
											</div>
											<div class="12u$">
												<input type="button" id="btn_enviar" value="Enviar" onClick="this.form.submit(); this.disabled=true; this.value='Enviando…'; " /><!-- type="submit" -->
											</div>
										</div>
									</div>
								</form>

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...