Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
robison_cwb

Erro usando Return-Path

Question

Como colocar corretamente o cabeçalho Return-Path nos e-mails usando PHP

Para quem não sabe para que serve o Return-Path, este cabeçalho é usado quando você manda um e-mail para determinado endereço e este endereço não existe, ai o servidor se encarrega de devolver o e-mail (juntamente com uma mensagem de erro) para o endereço que está especificado no cabeçalho Return-Path. Sendo assim este cabeçalho é muito importante quando você manda um e-mail porque se o e-mail não chegar em seu destino por algum motivo você receberá a notificação disso poucos minutos depois.

Mas, como eu disse anteriormente, eu nunca vi um código que soubesse usar este cabeçalho corretamente, incluindo o PHP-Nuke. Vou mostrar o porquê. Vejam o trecho do código abaixo que eu extrai do módulo Your_Account do PHP-Nuke; este é o trecho do código que avisa o usuário por e-mail de que ele se cadastrou no portal:

$message = _WELCOMETO . " $sitename ($nukeurl)!";

$message .= _YOUUSEDEMAIL . " $user_email " . _TOREGISTER . " $sitename.";

$message .= _FOLLOWINGMEM . "rn" . _UNICKNAME . " $username" . _UPASSWORD . " $user_password";

$subject = _REGISTRATIONSUB;

$from = "From: $adminmail";

$from .= "Reply-To: $adminmail";

$from .= "Return-Path: $adminmail";

mail($user_email, $subject, $message, $from);

Notem que o autor do código colocou na sua penúltima linha, na variável $from, o cabeçalho Return-Path e este cabeçalho vai receber o valor da variável $adminmail (que é o e-mail do administrador do portal que você especificiou nas preferências do PHP-Nuke). Bem, sendo assim, quando qualquer pessoa se cadastrar em seu portal e receber um e-mail dizendo que precisa confirmar seu cadastro ou então - para as pessoas que desativaram a confirmação do cadastro por e-mail - receber por e-mail a confirmação que já está cadastrada, neste e-mail enviado por seu site o seu cabeçalho Return-Path DEVERIA conter o e-mail que você configurou na administração de seu portal, certo?

Errado!!!

Se quiserem comprovar fazam um teste. Criem uma nova conta de usuário em seu portal e nesta conta de usuário especifique um endereço de e-mail que você poderá checar depois. Depois de feito o cadastro você receberá um e-mail e ao recebê-lo verifique o seu cabeçalho e procura pelo campo Return-Path. O que foi que você achou? =)

Eu já sei que o que você vai ver lá não será o e-mail que está configurado em seu portal, mas provavelmente um outro endereço de e-mail da empresa de hospedagem onde seu site está. E este problema não acontece apenas com os e-mails que são enviados quando alguém se cadastra; o mesmo ocorre quando o Fórum de seu portal envia algum e-mail dizendo que um tópico foi respondido, que uma mensagem privada chegou... praticamente todas as funções de e-mail do PHP-Nuke não enviam suas mensagem com o cabeçalho Return-Path adequado. Isto quer dizer: se por algum motivo você precisar saber se os e-mails que seu portal está enviando estão realmente chegando aos seus destinatários você nunca saberá disso porque as mensagens vão pra empresa de hospedagem e não você.

Isto tudo acontece pelo seguinte: os MTAs (Message Transfer Agents) ou Agentes de Transferência de Mensagens que ficam nos servidores (no caso dos servidores Linux em 99% dos casos é o sendmail) geralmente são configurados para que o cabeçalho Return-Path tenha apenas um endereço especificado pelo administrador do servidor e este valor que o administrador especifica sempre sobreescreve qualquer outro valor que você coloque no cabeçalho de seus e-mails. Melhor dizendo: mesmo que você crie um e-mail com o cabeçalho Return-Path: [email protected] quando esta mensagem passar pelo sendmail ele irá trocar este cabeçalho para Return-Path: [email protected] - Portanto, no código que eu mostrei acima não faz diferença nenhuma colocar:

$from .= "Return-Path: $adminmail";

porque ele será substituido pelo servidor antes da mensagem ser enviada.

Mas não se preocupem porque existe uma solução para isso! =))))

A partir da versão 4.0.5 do PHP se tornou possível passar para MTA um quinto parâmetro da função mail() fazendo com que o sendmail mude o valor do Return-Path temporariamente apenas para aquele e-mail (Obs.: este quinto parâmetro já existia na função mail() nas versões anteriores do PHP 4.0.5, mas tinha outras finalidades). Então para mandar um e-mail com o Return-Path personalizado é só usar o seguinte código, chamando a função mail() com 5 parâmetros:

mail("endereço do destinatario", "assunto", "mensagem", "cabeçalhos adicionais", "-f endereço de retorno")

Os três primeiros parâmetros são bem fáceis de entender, não é? O quarto parâmetro corresponde a possíveis cabeçalhos (From, Reply-To, etc) que você queria colocar no e-mail (MENOS o Return-Path - a gente já viu que ele não funciona se for colocado aqui). Agora, o quinto parâmetro é o mais importante neste caso: é através dele que vamos mudar o valor do Return-Path. Neste quinto parâmetro você deve colocar "-f [email protected]"

Explicando melhor, este último parâmetro significa o seguinte. Ao enviar a sua mensagem a função mail() vai passar para o servidor o parâmetro -f que fará o sendmail entender que deve mudar o valor do cabeçalho Return-Path na próxima mensagem que será enviada, e o endereço que vem logo após o -f é justamente o e-mail que o sendmail colocará no Return-Path.

Pronto! Fazendo isto o seu e-mail será enviado corretamente com o Return-Path que você especificou. Para vocês terem uma idéia melhor de como o código fica, eu vou reescrever agora o código corrigido que mostrei lá em cima para enviar e-mail para os usuários que se cadastram em seu portal:

$message = _WELCOMETO . " $sitename ($nukeurl)!";

$message .= _YOUUSEDEMAIL . " $user_email " . _TOREGISTER . " $sitename.";

$message .= _FOLLOWINGMEM . "rn" . _UNICKNAME . " $username" . _UPASSWORD . " $user_password";

$subject = _REGISTRATIONSUB;

$from = "From: $adminmail";

$from .= "Reply-To: $adminmail";

mail($user_email, $subject, $message, $from, "-f $adminmail");

Acho que é isso. Espero ter ajudado à aqueles que pensam em desenvolver alguma coisa (bloco, módulo ou qualquer script PHP) que precise usar e-mail. Quem quiser arrumar também suas funções de envio de e-mail do PHP-Nuke já sabem como fazer isso.

SENDO ASSIM ESCREVI O SEGUINTE CÓDIGO:

<?php

//CONFIGURAÇÕES SOBRE SEU SITE

$date = date("d/m/Y h:i");

$empresa="Nome da Empresa";

$destinatario = "[email protected]";

$nome_destinatario = "Fulano de Tal";

$exibir='http://www.nomedaempresa.com.br/retorno.php';

//campos do formulário

$projeto = $_POST['projeto'];

$nome = $_POST['nome'];

$empresa = $_POST['empresa'];

$fone= $_POST['fone'];

$url= $_POST['url'];

$conexao= $_POST['conexao'];

$prodserv= $_POST['prodserv'];

$areaatuacao= $_POST['areaatuacao'];

$concorrencia= $_POST['concorrencia'];

$referencia= $_POST['referencia'];

$obs= $_POST['obs'];

// elimina os erros mais comuns na digitação de e-mails

$email = str_replace (" ", "", $email);

$email = str_replace ("/", "", $email);

$email = str_replace ("@.", "@", $email);

$email = str_replace ("[email protected]", "@", $email);

$email = str_replace (",", ".", $email);

$email = str_replace (";", ".", $email);

$erro=0;

//ESSA VARIAVEL DEFINE SE É O USUARIO QUEM DIGITA O ASSUNTO OU SE DEVE ASSUMIR O ASSUNTO DEFINIDO

//POR VOCÊ CASO O USUARIO DEFINA O ASSUNTO PONHA "s" NO LUGAR DE "n" E CRIE O CAMPO DE NOME

//'assunto' NO FORMULARIO DE ENVIO

$assunto="n";

//CONFIGURAÇOES DA MENSAGEM ORIGINA

$html = "Content-type: text/html; charset=iso-8859-1\n";

$cabecalho_da_mensagem_original="From: $nome\n";

$assunto_da_mensagem_original="Contato pelo Site K2 - [briefing Online]";

$configuracao_da_mensagem_original="<html> aqui vai o conteudo </html>

";

//CONFIGURAÇÕES DA MENSAGEM DE RESPOSTA

// CASO $assunto="s" ESSA VARIAVEL RECEBERA AUTOMATICAMENTE A CONFIGURACAO

// "Re: $assunto"

$assunto_da_mensagem_de_resposta = "EMAIL RECEBIDO - Nome da Empresa";

$cabecalho_da_mensagem_de_resposta = "From: $nome_destinatario - $empresa <$destinatario>\n";

$configuracao_da_mensagem_de_resposta="Obrigado por entrar em contato!\nEstaremos respondendo em breve...\nAtenciosamente,\n$nome_destinatario - $empresa\n\nEnviado em: $date";

//ENVIO DA MENSAGEM ORIGINAL

$headers = "$html\n$de\n,$cabecalho_da_mensagem_original\n";

if ($assunto=="n")

{

$assunto = "$assunto_da_mensagem_original";

};

$seuemail = "$destinatario";

$mensagem = "$configuracao_da_mensagem_original";

mail($seuemail,$assunto,$mensagem,$headers, "-f $email");

//ENVIO DE MENSAGEM DE RESPOSTA AUTOMATICA

$headers = "$cabecalho_da_mensagem_de_resposta";

if ($assunto=="n")

{

$assunto = "$assunto_da_mensagem_de_resposta";

}

else

{

$assunto = "Re: $assunto";

};

$mensagem = "$configuracao_da_mensagem_de_resposta";

mail($email,$assunto,$mensagem,$headers);

echo "<script>window.location='$exibir'</script>";

?>

:::::::::::::::::::::::: MAS INFELIZMENTE NÃO CONSEGUI ACHAR O ERRO POIS, O SERVIDOR CONTINUA ME ENVIANDO UMA ALGO COMO " [email protected]" NO LUGAR DO E-MAIL DA PESSOA QUE ENVIOU O EMAIL....

alguém PODE ME AJUDAR?

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

$headers = "MIME-Version: 1.1 \n";
$headers .= "Content-type: text/html; charset=iso-8859-1\n";
$headers .= "From: SUA EMPRESA <[email protected]>\n";
$headers .= "Return-Path: [email protected]\n";
$headers .= "Reply-To: [email protected]\n";

Em alguns servidores o FROM & Return-Path tem que conter o mesmo e-mail, não sei se é seu caso, o meu é Locaweb.

Eu também estava com um problema parecido!

Só que no meu caso o e-mail que eu mandava de aviso chegava na caixa de entrada assim:

Edited by Jefferson Oliveira

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  



  • Forum Statistics

    • Total Topics
      148561
    • Total Posts
      644242
×
×
  • Create New...