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:
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:
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.
$configuracao_da_mensagem_de_resposta="Obrigado por entrar em contato!\nEstaremos respondendo em breve...\nAtenciosamente,\n$nome_destinatario - $empresa\n\nEnviado em: $date";
:::::::::::::::::::::::: 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....
Pergunta
robison_cwb
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
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.