Jul
09
2009

Função Mail do PHP

Hoje recordei-me que ao usar a função mail do php, na sua forma normal sempre me deu algumas dores de cabeça, e não é porque ela não funcione bem, tem a ver com o facto de poderem ocorrer alguns problemas inesperados e que na maioria das situações, nós como utilizadores normais podemos não nos dar conta.

Os problemas de que falo são, em primeiro lugar o email ir para ao correio não solicitado ou ao spam de alguns servidores de email globais, tal como o gmail, yahoo ou hotmail. No meu caso testei esta função para estes 3 de forma a garantir que passavam sem problemas nos filtros, e sendo que estes são sem dúvida os maiores, e os mais “complicados” em relação ao SPAM, podemos quase garantir que um email, ou sistema de newsletter que passe correctamente os filtros destes 3 sistemas, garantidamente passara em qualquer outro.

Então cá vai.

O uso normal da função tal como podem ver no www.php.net poderia ser o seguinte:

<?php
$Name = "O Nome"; //nome de quem envia
$email = "email@dominio.com"; //O email de envio
$recipient = "PessoaQueRecebe@endereco.com"; //O email de quem recebe
$mail_body = "Aqui vai o texto do email..."; //corpo do email
$subject = "Assunto para rever"; //Assunto
$header = "From: ". $Name . " <" . $email . ">"; //Campos Opcionais

mail($recipient, $subject, $mail_body, $header); //Comando de envio
?>

Aqui começa o problema :)

Uma das coisas importantes a adicionar nos cabeçalhos (header) da mensagem é o Reply to, esta é uma das regras de controlo de SPAM da maioria dos servidores, logo deve ser devidamente colocado.

Então no código mencionado adicionaria a seguinte linha:

$header = "From: ". $Name . " <" . $email . ">"; //Campos Opcionais - Esta já cá estava
$header .= "Reply-To:  O Seu Nome <email@dominio.com>"; //O nome e  email que esta a usar para o envio

Outra linha Importante a adicionar é o tipo de  Conteúdo/ formato do email e então teriamos mais a seguinte linha (por exemplo):

$header .= "Content-type: text/html";

Podemos ainda adicionar mais ao Header que é o tipo de caracteres, etc, mas isso não me vou alongar aqui, quero referir apenas os pontos básicosque dizem respeito aos filtros de SPAM.

Por fim, uma situação que é de extrema importancia, para que tudo fique certinho, tem a ver com uma situação que, a não ser que você faça a gestão de um servidor proprio, será dificil de notar. E isto tem a ver com os emails devolvidos. Por alguma razão, os emails tipicos que se recebe a notificar que um determinado utilizador não existe, ou que tem a caixa de correio cheia, etc, deveriam ser devolvidos ao email que estamos a definir em Reply-to, mas como referi, mas isso não acontece, e o que tambem pode influenciar no SPAM, porque o email, mesmo colocado com todos os parametros certinhos vai nos headear com as definições da conta por defeito do servidor, geralmente um nobody@servidor.com e, claro está que os emails de erro serão devolvidos a este endereço e não ao endereço que definimos acima.

Para resolver esta situação o que devemos fazer é acrescentar um pequeno codigo à linha (comando mail) de envio do email:

mail($recipient, $subject, $mail_body, $header, "-f  email@dominio.com"); //Comando de envio correcto

Ou, seja acrescenta-mos um 5º parametro a seguir ao $header, com  ”-f  email@dominio.com”, este será o email no qual serão entregues as mensagens de erro, mais uma vez na minha opinião deverá ser o mesmo definido, anteriormente como quem envia.

Posto isto junto tudo e aqui fica o exemplo completo:

<?php
$Name = "O Nome"; //nome de quem envia
$email = "email@dominio.com"; //O email de envio
$recipient = "PessoaQueRecebe@endereco.com"; //O email de quem recebe
$mail_body = "Aqui vai o texto do email..."; //corpo do email
$subject = "Assunto para rever"; //Assunto

$header = "From: ". $Name . " <" . $email . ">"; //Campos Opcionais
$header .= "Reply-To:  O Seu Nome <email@dominio.com>"; //O nome e  email que esta a usar para o envio
$header .= "Content-type: text/html";
mail($recipient, $subject, $mail_body, $header, "-f  email@dominio.com"); //Comando de envio
?>

Envie um comentário