Ir para conteúdo
Fórum Script Brasil
  • 0

Erro usando Return-Path


robison_cwb

Pergunta

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: teste@teste.com.br quando esta mensagem passar pelo sendmail ele irá trocar este cabeçalho para Return-Path: emaildoservidor@servidor.com.br - 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 endereco@email.com"

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 = "nome@nomedaempresa.com.br";

$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);

$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 " emaildoservidor@servidor.com.br" NO LUGAR DO E-MAIL DA PESSOA QUE ENVIOU O EMAIL....

alguém PODE ME AJUDAR?

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

$headers = "MIME-Version: 1.1 \n";
$headers .= "Content-type: text/html; charset=iso-8859-1\n";
$headers .= "From: SUA EMPRESA <mail@seudominio.com.br>\n";
$headers .= "Return-Path: mail@seudominio.com.br\n";
$headers .= "Reply-To: mail@seudominio.com.br\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:

Editado por Jefferson Oliveira
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...