sábado, 29 de setembro de 2012

Função mail() PHP retorna true mas o email não chega ao destino

Passei por este problema no meu site: enviava um email pela função mail() do PHP que retornava verdadeiro, mas o email não chegava ao destino.

A Locaweb tem uma página falando só sobre a configuração desta função, mas apesar de seguir o que estava escrito por lá o email continuava não chegando. A solução é simples, embora nada óbvia: você precisa preencher o quinto parâmetro da função mail() com a string “-falgum_email_do_seu_dominio“.

Juntando a necessidade de preencher o quarto parâmetro com esta solução de acrescentar o quinto, o código fica mais ou menos assim:



  1. $email_remetente = "eu@seudominio.com";

  2. $headers = "MIME-Version: 1.1\n";

  3. $headers .= "Content-type: text/plain; charset=iso-8859-1\n"; // ou UTF-8, como queira

  4. $headers .= "From: $email_remetente\n"; // remetente

  5. $headers .= "Return-Path: $email_remetente\n"; // return-path

  6. $envio = mail("destinatario@algum-email.com", "Assunto", "Mensagem", $headers, "-f$email_remetente");




Outro problema é o endereço de resposta do email. Em formulários de contato de sites desejamos que, ao clicar em “responder” nos emails enviados, o nosso leitor de email automaticamente já responda para o usuário que fez o contato e que inseriu seu email no formulário. O jeito errado é simular que o remetente daquela mensagem foi o email do seu usuário (quando na verdade o email foi enviado pelo seu próprio site). O jeito certo é dizer que aquele email foi enviado por um endereço do seu dominio, mas que se deve responder para (Reply-To) outro endereço.

Resumindo o código ficaria assim:



  1. $email_remetente = "eu@seudominio.com";

  2. $headers = "MIME-Version: 1.1\n";

  3. $headers .= "Content-type: text/plain; charset=iso-8859-1\n";

  4. $headers .= "From: $email_remetente\n"; // remetente

  5. $headers .= "Return-Path: $email_remetente\n"; // return-path

  6. $headers .= "Reply-To: $email_usuario\n"; // Endereço (devidamente validado) que o seu usuário informou no contato

  7. $envio = mail("destinatario@algum-email.com", "Assunto", "Mensagem", $headers, "-f$email_remetente");




Os usuários de servidores Windows devem substituir o “\n” por “\r\n”.

O motivo do problema é o encapsulamento da mensagem feito pelo sendmail. No cabeçalho ele até informa o email certo (do seu domínio), mas se você não passa o quinto parâmetro, na “envelopagem” ele coloca um endereço estranho que é reconhecido como malicioso pelos servidores de email.

IMPORTANTE: o código acima não envia email nenhum pra ninguém. Você precisa preencher as variáveis com os valores corretos antes de usar. Parece óbvio mas recebo cada dúvida…

Fonte

Nenhum comentário:

Postar um comentário