Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

diogopitz

Erro estranho com a função mail

Recommended Posts

Olá, pessoal!

Criei uma página com um formulário de e-mail. A ação do formulário é a própria página, onde com o PHP eu resgato os dados do form e envio o e-mail, tudo na mesma página.

 

<?php

	function valida_email($endereco){

		$pattern = "^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-]+\.[a-zA-Z0-9\-\.]+$";
			  if (eregi($pattern, $endereco)){
		 		return true;
			  }
			  else {
		 		return false;
			  }   
	  }

	function verificaForm($nome, $email, $msg) {
		$t = 1;
		if($nome == "" || !valida_email($email) || $msg == "") $t = 0;
		return $t;
	}
	
	$a = 0;
	if(isset($_GET["e"])) {
		$a = 1;
		$nome = $_POST["nome"];
		$email = $_POST["email"];
		$msg = $_POST["mensagem"];
		if(verificaForm($nome, $email, $msg)) {
			if(mail("meu@email.com", "Contato", $msg, "From: $nome<$email>"."\nContent-type: text/html")) print "Enviado...";
						else print "Erro...";
		}
		else print "Um ou mais campos apresentam erro.";
	}


?>

<html>
<head>
</head>

<body>
<form name="form1" method="post" action="?e">
	Nome:<br>
	<input type="text" name="nome" value="<?php print $a ? $nome : '' ?>"><br>
	E-mail:<br>
	<input type="text" name="email" value="<?php print $a ? $email : '' ?>"><br>
	Mensagem:<br>
	<textarea name="mensagem" rows="10" cols="50"><?php print $a ? $mensagem : '' ?></textarea><br>
	<input type="submit" value="Enviar">
	<input type="button" value="Limpar" onClick="java script:document.form1.reset();">
	
</form>

</body>
</html>

O e-mail simplesmente não chega, apesar de a função mail retornar true! Já tentei usar emails de destino diferentes. Pelo jeito o problema é simples de resolver.. sempre usei a função mail e nunca tive problema, mas agora tá dando isso, e não entendo por quê.

 

Obrigado,

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que MTA você está usando ? É na sua máquina que você está rodando o Apache ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não estou rodando na minha máquina. É num servidor da locaweb. O estranho é que, se eu crio um arquivo php simples, tipo

 

<?php

mail( ... . . .)

?>

 

o email chega ... mas desse jeito que mostrei não...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A hospedagem é Linux ou Windows ?

Posta aqui o jeito que você disse que funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

=S

fui fazer outro teste pra te mostrar o jeito que funcionava, e agora simplesmente funcionou o arquivo original, sendo que eu não alterei uma vírgula dele. de certo era alguma instabilidade no servidor!

 

o problema agora foi que o e-mail chegou na caixa de spam... qual a causa disso? como resolve?

 

valeu, abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

depende de muitos fatores.

primeiro me diga se o servidor é windows ou linux.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

 

// todo item dos cabeçalhos devem ser separados pelo line feed, no caso Linux é "\n"
$headers = "From: $nome<$email>\n";
$headers .= "Content-type: text/html\n"
if(mail("meu@email.com", "Contato", $msg, $headers)) print "Enviado...";
ALguns servidores exigem que valor do from no email enviado seja do mesmo domínio do site.

Outros exigem a passagem do cabeçalho reply-to:

$headers .= "Reply-to:fulano<email@dofulano>\n";
Testa aí e veja se deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Humm. Deixa eu ver como ficou o script que envia a mensagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Marcio! Desculpe a demora pra responder...

 

Então, agora fazendo outros testes, notei algo muito estranho... Quando o e-mail remetente é @gmail.com, a mensagem simplesmente não chega... se for outra domínio (testei vários) a mensagem chega normalmente. O que pode estar causando isso? Atualmente o código está assim: (embora eu não ache que o problema esteja nele).

 

<?php

	function valida_email($endereco){

		$pattern = "^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-]+\.[a-zA-Z0-9\-\.]+$";
			  if (eregi($pattern, $endereco)){
		 		return true;
			  }
			  else {
		 		return false;
			  }   
	  }

	function verificaForm($nome, $email, $msg) {
		$t = 1;
		if($nome == "" || !valida_email($email) || $msg == "") $t = 0;
		return $t;
	}
	
	$a = 0;
	if(isset($_GET["e"])) {
		$a = 1;
		$nome = $_POST["nome"];
		$email = $_POST["email"];
		$msg = $_POST["mensagem"];
		if(verificaForm($nome, $email, $msg)) {
			$headers = "From: $nome<$email>\n";
						$headers .= "Reply-to:$nome<$email>\n";
						$headers .= "Content-type: text/html\n";
			$envia = mail("contato@meusite.com.br", "Contato", $msg, $headers);
			if($envia) print "E-mail enviado com sucesso!";
			else print "Ocorreu um erro durante o envio.";
		}
		else print "Um ou mais campos apresentam erro.";
	}


?>

<html>
<head>
<style type="text/css">
<!--
body {
	font: 12px verdana, arial, helvetica, sans-serif;
}
input {  
	background: #FFFAFA;
	font: 12px verdana, arial, helvetica, sans-serif;
	color:#000;
	border:1px solid #FA8072;
}
textarea {
	background: #FFFAFA;
	font: 12px verdana, arial, helvetica, sans-serif;
	color:#000;
	border:1px solid #FA8072;
}
-->
</style>


</head>

<body>
<form name="form1" method="post" action="?arquivo=form_mail&e">
	Nome:<br>
	<input type="text" name="nome" value="<?php if(!$envia) print $a ? $nome : '' ?>"><br>
	E-mail:<br>
	<input type="text" name="email" value="<?php if(!$envia) print $a ? $email : '' ?>"><br>
	Mensagem:<br>
	<textarea name="mensagem" rows="10" cols="50"><?php if(!$envia) print $a ? $mensagem : '' ?></textarea><br>
	<input type="submit" value="Enviar">
	<input type="button" value="Limpar" onClick="java script:document.form1.reset();">
	
</form>

</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Experimenta colocar o quinto parâmetro da função:

 

$email_de_onde_esta_sendo_enviado = 'email@dominiodosite.com.br';
mail($to, $assunto', $mensagem, $headers, "-f$email_de_onde_esta_sendo_enviado");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa variável que você criou seria o valor digitado pelo usuário no campo e-mail? Se for, continua não funcionando... o que eu não entendo é pq só quando o remetente é do gmail que não funciona...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez o gmail exija que as mensagens recebidas sejam enviadas pelo servidor do mesmo domínio da assinatura. Isto deve ser uma medida anti-spam.

Pra mim funciona normalmente, pois sempre envio as mensagens usando uma conta de SMTP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

no ms-dos do windows ou no shell do linux execute

 

nslookup -type=MX dominio.do.seu.site

mostre aqui o que retornou se não for nada confidencial..

 

 

 

sample

nslookup -type=MX imasters.com.br

result:

Server:  UnKnown
Address:  192.168.1.1

Non-authoritative answer:
imasters.com.br MX preference = 5, mail exchanger = br03.dialhost.com.br

imasters.com.br nameserver = ns1.dialhost.com.br
imasters.com.br nameserver = ns2.dialhost.com.br
imasters.com.br nameserver = ns4.dialhost.com.br
imasters.com.br nameserver = ns3.dialhost.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

clinicapersonality.com.br MX preference = 10, mail exchanger = mx02.mx-server.net

clinicapersonality.com.br MX preference = 10, mail exchanger = mx01.mx-server.net

 

clinicapersonality.com.br nameserver = ns3.locaweb.com.br

clinicapersonality.com.br nameserver = ns1.locaweb.com.br

clinicapersonality.com.br nameserver = ns2.locaweb.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, isso elimina diversas possibilidades de erro

 

 

faça 2 testes simples

 

1.

tmp.php

<?php
echo ini_get( 'sendmail_from' );
?>

 

2.

email.php

<?php

$mail = array(

				   'FromMail' => 'usuario@gmail.com',
				   'FromName' => 'nome_do_remetente',

				   'ToMail' => 'email@do.destinatario',
				   'ToName' => 'nome_do_destinatario',

				   'ReturnMail' => 'usuario@gmail.com',
				   'ReturnName' => 'nome_do_remetente_ou_retorno',

				   'Subject'		  => 'teste_' . time(),
				   'Body'			 => 'Content Here',

				   'Content-type'		=> 'text/html',
				   'charset'				=> 'UTF-8',
				   'MIME-Version'	   => '1.0',
				   'Encoding'			 => '8bit',

				   'Header'				=> array(
							'From: ' . $mail['FromName'] . '<' . $mail['FromMail'] . '>',
							'To: ' . $mail['ToName'] . '<' . $mail['ToMail'] . '>',
							'Reply-To: ' . $mail['ReturnName'] . '<' . $mail['ReturnMail'] . '>',
							'Return-Path: ' . $mail['ReturnName'] . '<' . $mail['ReturnMail'] . '>',
							'MIME-Version: ' . $mail['MIME-Version'],
							'Content-type: ' . $mail['Content-type'] . ';',
							'	charset="' . $mail['charset'] . '"',
							'Content-Transfer-Encoding: ' . $mail['Encoding'],
				   );

);

ini_set( 'sendmail_from', $mail['FromMail'] );
mail( $mail['ToEmail'], $mail['Subject'], $mail['Body'], join( PHP_EOL, $mail['Header'] ) );

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tendo este mesmo problema, meu servidor também é Linux.

Aparentemente parece que envia mais não chega no destino e não mostra nenhum erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o segundo teste serviu apenas para ver o seu nível de atenção

pois coloquei alguns erros propositadamente

 

1

Parse error: parse error, expecting `')'' in C:\_w\tests\email.php on line 31

 

nesse trecho

'Content-Transfer-Encoding: ' . $mail['Encoding'],
				   );

corrigir retiranto o ";"

'Content-Transfer-Encoding: ' . $mail['Encoding'],
				   )

 

após a correção, outros erros serão apresentados:

 

2

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 23

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 23

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 24

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 24

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 25

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 25

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 26

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 26

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 27

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 28

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 29

Notice: Undefined variable: mail in C:\_w\tests\email.php on line 30

Notice: Undefined index: ToEmail in C:\_w\tests\email.php on line 36

 

 

o script completo, corrigido

 

email.php

<?php

$mail = array(
	'SMTP_HOST'   => 'localhost',
	'SMTP_PORT'   => 25,
	
	'FromMail'	=> email@gmail.com',
	'FromName'	=> 'nome do remetente',
	
	'ToMail'	  => 'teste@destinatario',
	'ToName'	  => 'destinatario',
	
	'ReturnMail'  => 'email@gmail.com',
	'ReturnName'  => 'nome do remetente',
	
	'Subject'	 => 'teste_' . time(),
	'Body'		=> 'Content Here',
	
	'Content-type'  => 'text/html',
	'charset'	   => 'UTF-8',
	'MIME-Version'  => '1.0',
	'Encoding'	  => '8bit',
);

$mail['Header'] = array(
		'From: ' . $mail['FromName'] . '<' . $mail['FromMail'] . '>',
		'To: ' . $mail['ToName'] . '<' . $mail['ToMail'] . '>',
		'Reply-To: ' . $mail['ReturnName'] . '<' . $mail['ReturnMail'] . '>',
		'Return-Path: ' . $mail['ReturnName'] . '<' . $mail['ReturnMail'] . '>',
		'MIME-Version: ' . $mail['MIME-Version'],
		'Content-type: ' . $mail['Content-type'] . ';',
		'	charset="' . $mail['charset'] . '"',
		'Content-Transfer-Encoding: ' . $mail['Encoding'],
);

ini_set( 'SMTP', $mail['SMTP_HOST'] );
ini_set( 'smtp_port', $mail['SMTP_PORT'] );
ini_set( 'sendmail_from', $mail['FromMail'] ); // for windows only
mail( $mail['ToMail'], $mail['Subject'], $mail['Body'], join( PHP_EOL, $mail['Header'] ) );

?>

 

 

Antes de executar o script acima, execute essa guia de configurações.

Será exibido as configurações do php.ini referente aos parâmetros listados no array:

 

errors_get.php

<?php

$n = array(
		'error_reporting',
		'display_errors',
		'display_startup_errors',
		'log_errors',
		'track_errors',
		'error_log',

		'smtp',
		'smtp_port',
		'sendmail_path',
);

foreach( $n as $k => $v )
{
	echo '<b>';
	echo $v;
	echo '</b>: ';
	echo ini_get( $v );
	echo '<br>';
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.