Ir ao conteúdo

Formulario php uolhost


sagits4

Posts recomendados

Postado

Olá, estou tendo diversos problemas em colocar um formulário em php com autenticação smtp (necessária pela uolhost) no meu site, procurei pela internet e vi que muita gente está com este problema, mas os tópicos, estão todos sem solução, portanto criei este tópico afim de que possamos resolver este problema.

Alguém que utilize o uolhost sabe de alguma coisa? Pelo que pesquisei ele só aceita o from: de [email protected]. Fui orientado no servidor windows a utilizar o endereço dominio.com.br invés de mail.dominio.com.br, mas mesmo assim nada de dar certo, e via smtp.dominio também não da certo, se alguém tiver alguma dica estarei agradecido.

OBS: link da uol host para um script próprio (que não funciona) de form php autenticado (para windows) http://200.98.199.177.static.uol.com.br/index.php?p=resposta&res=1288#rmcl

E o para linux: http://ajuda.uolhost.com.br/index.php?p=resposta&res=1323#rmcl (também não funciona)

A diferença seria só a quebra de linha, r/n para windows.

  • Moderador
Postado

Use a classe phpmailer que vai poder utilizar o autenticador.

A maioria, senão todos, é recomendado utilizar esta classe php para envio de emails. Por favor pesquise aqui na sessão web o uso da classe phpmailer que existe vários tópicos, inclusive mostrando como utilizar a classe. Mas isso não é problema o google provê N blogs que ensinam a usar esta clase também.

Postado

O problema é que ja testei com o php mailer e também não consegui fazer funcionar, ja fiz inúmeras pesquisas, realmente não é preguiça, é porque não tenho conseguido, e vejo inúmeras pessoas com o mesmo problema na internet.

  • Moderador
Postado

Bem, então é problema da uolhost que não suporta php então. Nunca tive problemas de autenticação com o phpmailer, mesmo testando em localhost e online.. ambos funcionaram bem com autenticação do meu servidor.

entre em contato com eles para que eles que resolvam este problema.

Uso essa classe a muito tempo, e digo que não tem misterio usar ela.. basta carregar a classe, instanciar o objeto, informar que usará com o SMTP com a funçao isSMTP(), definir a porta que seu servidor usa, definir o SMTPAuth como true, definir o SMTPSecure como "ssl", usar seu Username e seu Password como credencial.

essa classe funciona perfeitamente na maioria( ou tudos) dos hosts que suportam php.

Amigo, em momento algum mencionei que seria preguiça sua perguntar. pelo contrário, eu apenas incentivei mais a sua procura, pois só assim a pessoa aprende. Eu poderia colar aqui um código de envio.. mas não é esse o objetivo.

Tente novamente usar a classe, e poste o SEU código para analizarmos

Abraço

Postado

pois é, creio ser problema deles mesmo, abri um chamado. A questão não é um código pronto amigo, tenho 6 tipos diferentes na minha conta, a questão é um erro de servidor que poderia ser contornado por algum usuário mais experiente, estou utilizando exatamente o que enviei, o sem o r/n (teoricamente para linux) chega a dar a msg de enviado mas não envia, e o outro excede o limite (60sec) e da o erro de execução.

  • Moderador
Postado

Olhei aqueles codigos. nao vi nenhuma diferença em si. Codigos php funcionam igualmente tanto em linux quanto em windows.

Agora vou te contar heim.. porque que a uolhost complica com aquele código horroroso...

a classe phpmailer é bem mais clara e fácil de entender.. enfim.. só tem duas explicações para seu problema:

1- erros no seu código quando tentou implementar. normal errar, as vezes um ponto e virgula ou uma variavel escrita errada já zica todo o código.

2- problemas no servidor.

recomendo que poste aqui o SEU código, sem ser os exemplos que postou mais acima.

Postado

Ok, eu consegui resolver com o php mailler, pedi suporte e nem o próprio suporte conseguiu usar os scripts prontos. Estou usando o seguinte:


<?php

require_once('phpmailer/class.phpmailer.php');

$erros = "";

if(empty($_POST['nome'])){
$erros .= "O nome deve ser preenchido.";
}

if(empty($_POST['email']) ){
$erros .= "O E-mail deve ser preenchido.";
}else{
$email = $_POST['email'];
eregi("([\._0-9A-Za-z-]+)@([0-9A-Za-z-]+)(\.[0-9A-Za-z\.]+)",$email,$match);
if(!isset($match)){
$erros .= "O e-mail informado é inválido.";
}
}

if(empty($_POST['mensagem'])){
$erros .= "A mensagem deve ser preenchida.";
}

if( empty($erros) ){

$phpmail = new PHPMailer();

$phpmail->IsSMTP(); // envia por SMTP
$phpmail->Host = "seudominio.com.br"; // SMTP servers
$phpmail->SMTPAuth = true; // Caso o servidor SMTP precise de autenticação
$phpmail->Username = "[email protected]"; // SMTP username
$phpmail->Password = "senha"; // SMTP password

$phpmail->IsHTML(true);

$phpmail->From = '[email protected]';
$phpmail->FromName = $_POST['nome'];

$phpmail->AddAddress("[email protected]");
$phpmail->Subject = $assunto;
$phpmail->Body .= "Nome: ".$_POST['nome']."";
$phpmail->Body .= "E-mail: ".$_POST['email']."";
$phpmail->Body .= "Telefone: ".$_POST['telefone']."";
$phpmail->Body .= "Assunto: ".$_POST['assunto']."";
$phpmail->Body .= "Mensagem: ".nl2br($_POST['mensagem'])."";

$send = $phpmail->Send();

if($send){
echo "A Mensagem foi enviada com sucesso.";
}else{
echo "Não foi possível enviar a mensagem. Erro: " .$phpmail->ErrorInfo;
}

}else{
echo $erros;
}

?>

form.html abaixo


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Formulário de Contato</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<form action="nomedophp.php" method="post">
<fieldset>
<center><legend>Formulário de Contato</legend></center> <br />
<label for="nome"><h1>Nome</h1></label>
<input name="nome" size="40" type="text" /><br />
<label for="email"><h1>E-mail:</h1></label>
<input name="email" size="40" type="text" /><br />
<label for="telefone"><h1>Telefone</h1></label>
<input name="telefone" size="20" type="text" /><br />
<label for="assunto"><h1>Assunto</h1></label>
<input name="assunto" size="40" type="text" /><br />
<label for="mensagem"><h1>Mensagem</h1></label>
<textarea cols="40" rows="4" name="mensagem"></textarea>
<input type="submit" value="Enviar" />
</fieldset>
</form>
</body>
</html>

Coloque os 2 numa pasta (fora da php mailler) e a pasta php mailler no mesmo diretorio (funciona no uol host).

Estou sem um link pro php mailler, se alguem tiver poste por favor

------------------------------------------------------------------

Comentário aparte, quando termina de executar o php e vai pro echo, ele abre uma nova pagina em branco (novo doc html), teria algum jeito de somente abrir um alert "formulario enviado" e ficar na pagina onde esta (sem dar reload na pagina)? Se tiver algum metodo de ao final do script não ir pro script.php ja teria como por um alert via onclick no enviar, mas não sei se é possivel.

  • Moderador
Postado

Basta fazer assim:


if($send){
echo "<script>
alert('OK Enviado!')
</script>";
}else{
echo "<script>
alert('Putz, deu zica aqui!')
</script>";
}

}else{
echo $erros;
}

Uma dica: Use requisições ajax para não ter reloads. por exemplo use o jquery e pegue os dados dos campos com a funçao serialize() para que não precise criar uma variavel para cada campo do seu formulário e use a funçao $.ajax() que permite mais de um callback.

detalhe: se usar com ajax, não precisa colocar as tags do script dentro echo, basta a frase para que o script jquery insira o callback onde você desejar ( seja em uma div ou caixa de alerta)

Postado

Ei dif, eu consegui fazer do jeito que você falou, obrigado pela ajuda, mas ainda estou com um problema, eu adicionei o seguinte ajax:

	<script type="text/javascript">

jQuery(document).ready(function(){
jQuery('#ajax_form').submit(function(){
var dados = $(erros);

jQuery.ajax({
type: "POST",
url: "env.php",
data: dados,
success: function( data )
{
alert( "mensagem enviada com sucesso" );
}
});

return false;
});
});
</script>

A mensagem (alert) aparece, independente dos erros no php que postei acima. Queria que o echo do $erros e do $send aparece-se no alert, procurei bastante, mas infelizmente tenho pouco conhecimento em ajax, e usando o json_encode não consegui adaptar, você poderia me dar uma ajuda? Obrigado.

  • Moderador
Postado

Olá,

noto algumas coisas: no seu código que vou destacar:


<script type="text/javascript">

jQuery(document).ready(function(){
jQuery('#ajax_form').submit(function(){
[COLOR="Red"]var dados = $(erros);[/COLOR]

jQuery.ajax({
type: "POST",
url: "env.php",
[COLOR="Red"]data: dados[/COLOR],
success: function([COLOR="Red"] data[/COLOR] )
{
alert( "mensagem enviada com sucesso" );
}
});

return false;
});
});
</script>

a variavel dados está recebendo erros, mas esse erros não existe e também não há onde você receba os dados do fórmulário. logo seu alert aparce independe se funcionar ou não.

poderias fazer desta forma:


<script type="text/javascript">

jQuery(document).ready(function(){
jQuery('#ajax_form').submit(function(e){
[COLOR="Red"] e.preventDefault();
var dados = $("#ajax_form").serialize();[/COLOR]

jQuery.ajax({
type: "POST",
url: "env.php",
data: dados,
success: function(data){
alert(data);
},
error: function(data){
alert(data);
}
});
});
});
</script>

note a variavel dados está sendo atribuido a funçao serialize para o formulario com o ID #ajax_form. neste caso a funçao serialize() pega todos os valores dos campos do formulário e organiza em forma de array e envia ao arquivo env.php pelo metodo post.

ps: Note que existe um parametro na funçao do submit. o e.preventDefault() é a mesma coisa usar o return false no fim do código.

no env.php os dados podem ser recebidos normalmente como por exemplo desta maneira:



<?php
$nome = $POST_["nome"];
$idade = $_POST["idade"];
$email = $POST_["email"];

if( empty($nome) or empty($idade) or empty($email)){
echo "Por favor preencha todos os campos!";
exit;
}


include "conexao.php";

$cadastro = mysql_query("INSERT INTO usuarios(nome, idade, email) VALUES('$nome', '$idade', '$email')");

if($cadastro){
echo "Os dados foram inseridos corretamente.";

}else{
echo "Ops.. Hove um erro. Cadastro não realizado.";
}

?>

perceba que nos IF de verificação de campos vazios, contem apenas um echo sem o alert, certo? este echo será a mensagem retorno que será inserido no alert contido no seu parametro sucess, onde é armazenado pela variavel data.

isso vale para todos os echos, serão as mensagens que serao inclusas no alert definido no seu script.

Veja que na funçao $.ajax() possui varios parametros como por exemplo o beforeSend que serve para inserir coisas antes de enviar o formulario ( o melhor exemplo disso é aquelas coisinhas que ficam girando enquanto carrega).

O complete é outro que serve para quando o formulário for completado, útil quando quer mostrar mensagens bem sucedidas ou outros avisos apos completar o envio.

bem tente isso e veja se funciona. lembre que tudo que eu coloquei sao exemplos, pois não conheço seu formulario. mas use para adaptar.

abraço

Postado

O que seria este conexao.php? teria que criar mais um arquivo ou ele só referencia o codigo que vem logo abaixo? Bom, vou testar de qualquer forma, muito obrigado =].

Aproveitando, no meu php tudo gira em torno da variável $erros, ela recebe o echo do php referente a erros e se tudo der certo ela vira um $send, que recebe o echo "tudo deu certo", teria como adaptar para invés do serialize, apenas ler esta variavel dentro do alert? Obrigado.

  • Moderador
Postado

acredito que nao há como.

pois a funçao serialize é para pegar os dados do formulário.

o mecanismo funciona da seguinte maneira:

o método serialize pega cada valor dos campos do formulário e organiza em forma de vetor da seguinte maneira:

dados: [v1, v2, v3] e agrega a URL em forma de query string assim:

env.php?dados=v1&v2&v3

você obrigatoriamente precisa dos dados para enviar. se nao usar o serialize(), terias que pegar todos os campos separadamente como por exemplo:

$("#campo_nome").val();

-----------------------------

Agora reveja seu código no seu post #7

veja que na variave $erros, você não colocou o echo na frente da variavel. se nao colocar, a mensagem de erro nao vai ser inserida como o callback do seu codigo jquery.

o conexao.php é apenas a conexao com o banco de dados que eu coloquei no exemplo, no seu caso nao precisa. recomendo que utilize o código jquery que eu passei por ultimo e acrescente um echo na frente da variavel $erros dentro de seus ifs.

abraço

Postado

Entendi, obrigado novamente, desculpe tomar seu tempo. Mas seria possível via json_encode, colocando encode na frente de todos os $erros, e depois utilizando na var do próprio ajax (no lugar do data), não seria? Abraço.

  • Moderador
Postado

Não, o data é um parametro da funçao $.ajax() para enviar os dados.

Analisando seu código novamente do #7, tomei a liberdade de mexer no seu código. Tente desta maneira para ver se funciona:


<?php

require_once('phpmailer/class.phpmailer.php');


if(empty($_POST['nome'])){
[COLOR="Red"] echo[/COLOR] "O nome deve ser preenchido.";
}

if(empty($_POST['email']) ){
[COLOR="Red"]echo[/COLOR] "O E-mail deve ser preenchido.";
}else{
$email = $_POST['email'];
eregi("([\._0-9A-Za-z-]+)@([0-9A-Za-z-]+)(\.[0-9A-Za-z\.]+)",$email,$match);
if(!isset($match)){
[COLOR="Red"]echo[/COLOR] "O e-mail informado é inválido.";
}
}

if(empty($_POST['mensagem'])){
[COLOR="Red"] echo[/COLOR] "A mensagem deve ser preenchida.";
}

$phpmail = new PHPMailer();

$phpmail->IsSMTP(); // envia por SMTP
$phpmail->Host = "seudominio.com.br"; // SMTP servers
$phpmail->SMTPAuth = true; // Caso o servidor SMTP precise de autenticação
$phpmail->Username = "[email protected]"; // SMTP username
$phpmail->Password = "senha"; // SMTP password

$phpmail->IsHTML(true);

$phpmail->From = '[email protected]';
$phpmail->FromName = $_POST['nome'];

$phpmail->AddAddress("[email protected]");
$phpmail->Subject = $assunto;
$phpmail->Body .= "Nome: ".$_POST['nome']."";
$phpmail->Body .= "E-mail: ".$_POST['email']."";
$phpmail->Body .= "Telefone: ".$_POST['telefone']."";
$phpmail->Body .= "Assunto: ".$_POST['assunto']."";
$phpmail->Body .= "Mensagem: ".nl2br($_POST['mensagem'])."";

$send = $phpmail->Send();

if($send){
[COLOR="Red"] echo[/COLOR] "A Mensagem foi enviada com sucesso.";
}else{
[COLOR="Red"]echo[/COLOR] "Não foi possível enviar a mensagem. Erro: " .$phpmail->ErrorInfo;
}

?>

Veja os destaques em vermelho.

cada echo desses, é o callback que será inserido no alert de acordo com o evento ocorrido.

agora ligue os "pontos" com o código ajax. o alert da função do parametro sucess recebera os echos bem sucedidos como por exemplo o echo do send.

O alert da funçao do parametro error receberá os echos dos erros. no caso else de send e o echo dos demais blocos de ifs de verificação.

dicas:

cogite na possibilidade de acrescentar um exit; no final de cada if para encerrar o script quando der um erro. ( nao tenho certeza se com jquery e ajax precise disso.) Caso precise veja o exemplo com a verificaçao do nome:


if(empty($_POST['nome'])){
[COLOR="Red"] echo[/COLOR] "O nome deve ser preenchido.";
[COLOR="Purple"]exit; [/COLOR]
}

abraço

Postado

Consegui, obrigado dif. Utilizei o seu código, apenas adicionei um else antes do new php mailer, que, na lógica do código inicial, serviria pra somente fazer a requisição caso não houvessem erros nos campos. Você esqueceu do else ou adotou outra lógica/a minha esta errada?

OBS: Qual a forma mais indicada para criar alguma proteção para não haver envio de e-mail em massa por bots e etc?

Arquivado

Este tópico foi arquivado e está fechado para 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...