E-mail não chega ao destino? Sender Policy Framework – SPF

Quando estiver programando o envio de e-mail e você perceber que o e-mail não chega ao destino, então desconfie: Você pode estar sendo bloqueado pelo SPF!

Problema

Certa ocasião em que estava instalando o Joomla, observei que ao tentar enviar um e-mail pelo formulário de “Contato” do site, o e-mail não chegava ao destino. Nem se quer havia uma mensagem de erro ou falha no envio. Apesar de tudo parecer normal, o e-mail não chegava.

O mais estranho disso, era que dependendo do remetente de e-mail enviado, as vezes acontecia da mensagem chegar sem problemas. Fiquei intrigado, abri o código fonte para analisar o que estava acontecendo. No caso do Joomla, o gerenciamento de envio de e-mail é feito pela classe PHPMailer (libraries/phpmailer/phpmailer.php), mas nada anormal encontrei.

Nessas horas é comum a gente querer culpar o servidor de e-mail do nosso serviço de hospedagem. Mas com uma pesquisa no poderoso Google, logo compreendi do que se tratava: SPF.

O que é?

Sender Policy Framework – SPF, traduzido quer dizer “Estrutura de Políticas de Remetente”, e trata-se de um padrão aberto que especifica um método técnico para impedir a falsificação de endereço do remetente. Com isso, somente está autorizado o envio de e-mail com um certo remetente, se este for o dono do domínio expresso nesse e-mail. Um exemplo rápido: Os e-mail do tipo xyz@gmail.com apenas podem ser enviados por servidores do gmail.com. O SPF é justamente um meio de garantir o remetente.

Como funciona?

O proprietário do domínio publica um registro SPF na zona do domínio de DNS informando os endereços de IP (servidores) que estão autorizados a enviar email. Quando o servidor de e-mail de outra pessoa recebe uma mensagem dizendo vir a partir desse domínio, então, o servidor pode verificar se a mensagem está em conformidade com a política declarada do domínio. Se, por exemplo, a mensagem vem de um servidor desconhecido, ela pode ser considerada uma farsa e então é descartada.

Exemplo

Suponha que Fulano tem o email fulano@gmail.com. Então, Fulano não pode mandar e-mail a partir de seu servidor próprio (hospedagem) como sendo o remetente, pois ele não é o dono do domínio “gmail.com” :D.
Eis aí o porquê dos e-mails não estarem chegando. Nem todos os servidores tem registro SPF, motivo pela qual alguns e-mails chegam normalmente quando enviados. Claro, se Fulano enviar o e-mail fulano@gmail.com através do gmail.com tudo vai funcionar corretamente, pois este servidor estará autorizado no registro SPF.

Solução

Vou aproveitar o exemplo acima e dizer que, para não ficar barrado pelo SPF, Fulano deveria enviar o e-mail com um remetente de e-email do seu próprio domínio, algo tipo fulano@meudominio.com.

Na prática, isto é resolvido no cabeçalho do e-mail. Primeiro vamos a um exemplo usando código PHP, mostrando como não deve ser feito e, em seguida, a forma correta.

Código 1 | Neste caso o e-mail não chegará ao destino

1
2
3
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "From: Fulano <fulano@gmail.com>\r\n";
    $headers .= "Content-Type: text/plain; charset=\"UTF-8\r\n";

Pressupondo que o cabeçalho de e-mail acima seja enviado a partir de um servidor qualquer, diferente do gmail.com, então é correto afirmar que esta mensagem não chegará ao seu destino, seja ele qual for, pois o parâmetro “From” (de origem), que diz respeito ao Remetente, tem como valor um e-mail cujo domínio possui regras SPF. Aqui cito o gmail.com apenas como exemplo/referência, já que isto acontece com muitos outros servidores de e-mail, como é o caso do hotmail.com também.

Esse tipo de problema geralmente ocorre em formulários de contato de alguns sites, como na figura abaixo demonstrado, onde o visitante preenche seu e-mail e o sistema (site) submete os dados usando este e-mail como sendo o Remetente (parâmetro “From”).

Código 2 | Neste caso o e-mail chegará com sucesso ao destino

1
2
3
4
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "From: Meu site <meuemail@meudominio.com>\r\n";
    $headers .= "Content-Type: text/plain; charset=\"UTF-8\r\n";
    $headers .= "Reply-To: Fulano <fulano@gmail.com>";

A grande jogada é submeter os dados do formulário usando um e-mail do seu próprio domínio como Remetente e colocar o e-mail do visitante no parâmetro “Reply-To”. Mesmo que pareça estranho se você for ao mesmo tempo o Remetente e o Destinatário, mas isto garantirá que a mensagem chegue. O parâmetro “Reply-To” (Reposta para) entrará em ação caso você queira responder a mensagem, já que isto irá forçar o envio da resposta seguir para o visitante e não para você mesmo (Remetente).

Acredito que seja isso. Estou sendo repetitivo para enfatizar a mensagem.

Fonte

Veja mais em SPF project.

Total de acessos: 13832

8 comentários sobre “E-mail não chega ao destino? Sender Policy Framework – SPF

  1. Vitor disse:

    Cara….vi um artigo seu sobre o motivo dos formularios php não chegarem aos destinos. Confesso que não entendi muito bem. Também não sei se o meu problema é causado por aquilo que você explicou lá. Tenho um formulário php aqui bonitinho. Ele dá msgm enviada, tudo beleza. Mas não chega o e-mail. Eu preciso colocar isso em um servidor ou ele deveria funcionar localmente? Agradeço desde já! Valeu!

    • Oi Vitor, apesar desse tipo de problema poder ocorrer com qualquer pessoa que tente usar um formulário de e-mail, eu fiz o artigo voltado para programador, não sei se é seu caso, pois a solução se faz dentro do código-fonte (script) de envio do formulário de e-mail.

      Bom, resumindo, você não pode enviar um formulário de e-mail utilizando domínios de outros, tais como seuemail@hotmail.com ou seuemail@gmail.com. Vou dar um exemplo:

      Imagine que você entre no formulário de e-mail do meu Blog. Lá terá as seguintes informações:
      De: seuemail@gmail.com
      Para: blog@taylorlopes.com
      (Além de assunto e conteúdo, claro)

      Se eu tentar enviar este formulário com o remetente sendo seuemail@gmail.com, então esse e-mail nunca vai chegar ao destinatário (blog@taylorlopes.com), pois vai ser barrado nas regras de SPF criada pelo gmail.com, sacou?

      Para contornar esse problema, você deve ter um domínio próprio com sua conta de e-mail. Por exemplo, no meu formulário de e-mail o remetente (eu enviou para mim mesmo) e destinatário é blog@taylorlopes.com. Perceba que o domínio é meu (taylorlopes.com)! Daí quando o e-mail é enviado, como meu domínio não tem regras de SPF, então chegará ao destino.

      Você coloca como remetente e destinatário o seu e-mail de domínio próprio. Vai ficar assim:
      De: blog@taylorlopes.com
      Para: blog@taylorlopes.com
      Replicar para: seuemail@gmail.com

      Embora pareça estranho o remetente ser igual ao destinatário, é isso que assegura que o e-mail não ficará barrado em regra alguma de SPF. A jogada aí é usar o parâmetro “Reply-To” contendo o e-mail verdadeiro de quem está enviando (seuemail@gmail.com), pois assim, o e-mail de resposta vai para a pessoa certa que enviou e não para você mesmo.

      Cara, é isso… lembre-se que na prática isto é feito no código-fonte do seu formulário de e-mail, igual consta acima, neste artigo. Não sei ajudou em alguma coisa ou só piorou com essa explicação, :D :D :D
      T+

  2. Fabio Souza disse:

    Estou tendo esse problema no meu site.
    O mais curioso é que uso o mesmo formulário para dois sites que tenho em uma mesma empresa de hospedagem, obviamente fazendo as alterações devidas. Em um dos sites todas as mensagens são enviadas normalmente, seja de webmail ou e-mail profissional, ou seja, de empresa. No outro site, que comecei a hospedar nessa empresa esses dias, o mesmo formulário só recebe mensagens cujo visitante informa um e-mail profissional. Mensagens que informam um webmail, não são enviadas.

    • Então, tem que fazer um teste usando o mesmo e-mail em ambos os formulários, pois tem e-mail que, mesmo sendo de webmail, não ficam barrados pelo SPF, um exemplo é o pop.com.br. Mas se for, por exemplo, do gmail.com ou hotmail.com e você tentar enviar um e-mail como remetente sendo estes domínios, então sua mensagem não vai chegar ao destino, vai ficar barrada pelas regras SPF. Esse problema realmente é chato de descobrir, pois não dá erro algum…

  3. Cara, obrigado pelo post, ajudou demais!
    estava na mão de uma empresa incompetente de webdesign e programação web e esse erro estava acontecendo no formulário do meu site.
    estou a um mes com esse problema, nao faço ideia quantos e-mails foram perdidos e esse é um problema bem sério para minha empresa que depende demais de e-mails para contato, e deu que eu mesmo tive que arrumar… complicado!
    No mais, sua explicação foi muito clara.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *