Embora existam partes desta resposta que se aplicam apenas ao uso domail()
própria função, muitas dessas etapas de solução de problemas podem ser aplicadas a qualquer sistema de correspondência PHP.
Há vários motivos pelos quais seu script parece não estar enviando e-mails. É difícil diagnosticar essas coisas, a menos que haja um erro de sintaxe óbvio. Sem um, você precisa percorrer a lista de verificação abaixo para encontrar possíveis armadilhas que possa estar encontrando.
Verifique se o relatório de erros está ativado e definido para relatar todos os erros
O relatório de erros é essencial para eliminar erros no seu código e erros gerais encontrados pelo PHP. O relatório de erros precisa estar ativado para receber esses erros. Colocar o seguinte código na parte superior dos arquivos PHP (ou em um arquivo de configuração principal) permitirá o relatório de erros.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Consulte Como posso obter mensagens de erro úteis em PHP? - esta resposta para mais detalhes sobre isso.
Verifique se a mail()
função é chamada
Pode parecer bobagem, mas um erro comum é esquecer de realmente colocar o mail()
função no seu código. Verifique se ele está lá e não comentou.
Verifique se a mail()
função foi chamada corretamente
bool mail (string $ to, string $ subject, string $ message [, string $ additional_headers [, string $ additional_parameters]])
A função mail usa três parâmetros obrigatórios e, opcionalmente, um quarto e quinto. Se a sua chamada para mail()
não tiver pelo menos três parâmetros, ela falhará.
Se a sua chamada para mail()
não tiver os parâmetros corretos na ordem correta, também falhará.
Verifique os logs de correio do servidor
Seu servidor da web deve estar registrando todas as tentativas de enviar e-mails através dele. A localização desses logs variará (talvez seja necessário perguntar ao administrador do servidor onde eles estão localizados), mas eles geralmente podem ser encontrados no diretório raiz do usuário em logs
. Dentro, haverá mensagens de erro que o servidor relatou, se houver, relacionadas às suas tentativas de enviar e-mails.
Verifique se há falha na conexão da porta
O bloco de portas é um problema muito comum que a maioria dos desenvolvedores enfrenta ao integrar seu código para entregar emails usando SMTP. E isso pode ser facilmente rastreado nos registros de servidor (a localização do servidor de log de correio pode variar de servidor para servidor, conforme explicado acima). Caso você esteja em um servidor de hospedagem compartilhado, as portas 25 e 587 permanecem bloqueadas por padrão. Este bloqueio foi feito propositadamente pelo seu provedor de hospedagem. Isso é verdade mesmo para alguns servidores dedicados. Quando essas portas estiverem bloqueadas, tente conectar-se usando a porta 2525. Se você achar que essa porta também está bloqueada, a única solução é entrar em contato com o provedor de hospedagem para desbloquear essas portas.
A maioria dos provedores de hospedagem bloqueia essas portas de email para proteger sua rede de enviar emails de spam.
Use as portas 25 ou 587 para conexões simples / TLS e a porta 465 para conexões SSL. Para a maioria dos usuários, é recomendável usar a porta 587 para evitar limites de taxa definidos por alguns provedores de hospedagem.
Não use o operador de supressão de erro
Quando o operador de supressão de erro @
é anexado a uma expressão em PHP, qualquer mensagem de erro que possa ser gerada por essa expressão será ignorada. Há circunstâncias em que o uso desse operador é necessário, mas o envio de correio não é um deles.
Se o seu código contiver @mail(...)
, você poderá ocultar mensagens de erro importantes que ajudarão você a depurar isso. Remova o @
e veja se há algum erro relatado.
Só é aconselhável quando você verificarerror_get_last()
imediatamente se há falhas concretas.
Verifica a mail()
valor de retorno
A mail()
função:
Retorna TRUE
se o email foi aceito com êxito para entrega, FALSE
caso contrário. É importante observar que, apenas porque o correio foi aceito para entrega, isso NÃO significa que o correio realmente chegará ao destino pretendido.
Isso é importante notar porque:
- Se você receber um
FALSE
valor de retorno, sabe que o erro está no seu servidor aceitar seu e-mail. Provavelmente não é um problema de codificação, mas um problema de configuração do servidor. Você precisa falar com o administrador do sistema para descobrir por que isso está acontecendo.
- Se você receber um
TRUE
valor de retorno, isso não significa que seu email será definitivamente enviado. Significa apenas que o email foi enviado para o respectivo manipulador no servidor com sucesso pelo PHP. Ainda existem mais pontos de falha fora do controle do PHP que podem fazer com que o email não seja enviado.
Isso FALSE
ajudará a direcioná-lo na direção certa, enquanto TRUE
isso não significa necessariamente que seu email foi enviado com sucesso. Isto é importante para anotar!
Verifique se o seu provedor de hospedagem permite enviar e-mails e não limita o envio de e-mails
Muitos webhosts compartilhados, especialmente provedores de hospedagem gratuitos, não permitem o envio de emails de seus servidores ou limitam o valor que pode ser enviado durante um determinado período de tempo. Isso se deve aos seus esforços para limitar os spammers a tirar proveito de seus serviços mais baratos.
Se você acha que seu host tem limites de email ou bloqueia o envio de emails, consulte as perguntas frequentes para ver se eles listam essas limitações. Caso contrário, pode ser necessário entrar em contato com o suporte deles para verificar se há alguma restrição em relação ao envio de emails.
Verifique pastas de spam; impedir que os e-mails sejam sinalizados como spam
Muitas vezes, por vários motivos, os e-mails enviados por PHP (e outras linguagens de programação do servidor) acabam na pasta de spam do destinatário. Sempre verifique lá antes de solucionar o seu código.
Para evitar que as mensagens enviadas pelo PHP sejam enviadas para a pasta de spam de um destinatário, há várias coisas que você pode fazer, tanto no seu código PHP quanto de outra forma, para minimizar as chances de seus e-mails serem marcados como spam. Boas dicas de Michiel de Mare incluem:
- Use métodos de autenticação de e-mail, como SPF e DKIM, para provar que seus e-mails e seu nome de domínio estão juntos e para impedir a falsificação de seu nome de domínio. O site do SPF inclui um assistente para gerar as informações de DNS do seu site.
- Verifique seu DNS reverso para garantir que o endereço IP do servidor de email aponte para o nome de domínio usado para o envio de email.
- Verifique se o endereço IP que você está usando não está em uma lista negra
- Verifique se o endereço de resposta é um endereço existente válido.
- Use o nome completo e real do destinatário no campo Para, não apenas o endereço de e-mail (por exemplo
"John Smith" <john@blacksmiths-international.com>
).
- Monitore suas contas de abuso, como abuse@seudominio.com e postmaster@seudominio.com. Isso significa - verifique se essas contas existem, leia o que é enviado a elas e atue nas reclamações.
- Por fim, torná-lo muito fácil cancelar a inscrição. Caso contrário, seus usuários cancelarão a inscrição pressionando o botão de spam , o que afetará sua reputação.
Consulte Como garantir que o email enviado programaticamente não seja automaticamente marcado como spam? para saber mais sobre esse assunto.
Verifique se todos os cabeçalhos de email são fornecidos
Alguns softwares de spam rejeitarão os e-mails se houver cabeçalhos comuns ausentes, como "De" e "Responder para":
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Verifique se os cabeçalhos de email não têm erros de sintaxe
Cabeçalhos inválidos são tão ruins quanto não ter cabeçalhos. Um caractere incorreto pode ser o suficiente para atrapalhar seu e-mail. Verifique duas vezes para garantir que sua sintaxe esteja correta, pois o PHP não detectará esses erros para você.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Não use um From:
remetente falso
Embora o email deva ter um remetente De:, você não pode apenas usar qualquer valor. Em particular, endereços de remetente fornecidos pelo usuário são uma maneira infalível de bloquear emails:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Motivo: seu servidor da Web ou de envio de email não está na lista de permissões do SPF / DKIM para fingir ser responsável pelos endereços @hotmail ou @gmail. Pode até soltar e-mails silenciosamente com From:
domínios de remetente para os quais não está configurado.
Verifique se o valor do destinatário está correto
Às vezes, o problema é tão simples quanto ter um valor incorreto para o destinatário do email. Isso pode ser devido ao uso de uma variável incorreta.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Outra maneira de testar isso é codificar o valor do destinatário na mail()
chamada de função:
mail('user@example.com', $subject, $message, $headers);
Isso pode se aplicar a todos os mail()
parâmetros.
Enviar para várias contas
Para ajudar a excluir problemas de conta de email, envie seu email para várias contas de email em diferentes provedores de email . Se seus e-mails não chegarem à conta do Gmail de um usuário, envie os mesmos para uma conta do Yahoo, uma conta do Hotmail e uma conta POP3 comum (como a sua conta de e-mail fornecida pelo ISP).
Se os e-mails chegarem a todas ou algumas das outras contas de e-mail, você sabe que seu código está enviando e-mails, mas é provável que o provedor da conta de e-mail os esteja bloqueando por algum motivo. Se o email não chegar a nenhuma conta, é mais provável que o problema esteja relacionado ao seu código.
Verifique se o código corresponde ao método do formulário
Se você definiu o método do formulário POST
, verifique se está usando os $_POST
valores do formulário. Se você definiu GET
ou não definiu, verifique se você está usando os $_GET
valores do formulário.
Verifique se o action
valor do formulário aponta para o local correto
Verifique se o action
atributo do formulário contém um valor que aponte para o seu código de correspondência PHP.
<form action="send_email.php" method="POST">
Verifique se o host da Web suporta o envio de email
Alguns provedores de hospedagem na Web não permitem ou ativam o envio de emails por meio de seus servidores. Os motivos para isso podem variar, mas se eles tiverem desativado o envio de e-mail, você precisará usar um método alternativo que usa terceiros para enviar esses e-mails para você.
Um email para o suporte técnico (após uma visita ao suporte on-line ou às Perguntas frequentes) deve esclarecer se os recursos de email estão disponíveis no seu servidor.
Verifique se o localhost
servidor de email está configurado
Se você estiver desenvolvendo em sua estação de trabalho local usando WAMP, MAMP ou XAMPP, um servidor de email provavelmente não está instalado em sua estação de trabalho. Sem um, o PHP não pode enviar email por padrão.
Você pode superar isso instalando um servidor de email básico. Para Windows, você pode usar o Mercury Mail gratuito .
Você também pode usar o SMTP para enviar seus e-mails. Veja esta ótima resposta de Vikas Dwivedi para aprender como fazer isso.
Ativar o costume do PHP mail.log
Além do arquivo de log do MTA e do PHP, você pode habilitar o log para a mail()
função especificamente. Ele não registra a interação SMTP completa, mas pelo menos parâmetros de chamada de função e script de chamada.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Veja http://php.net/manual/en/mail.configuration.php para obter detalhes. (É melhor ativar essas opções no php.ini
ou .user.ini
ou .htaccess
talvez.)
Verifique com um serviço de teste de correio
Existem vários serviços de entrega e verificação de spam que você pode utilizar para testar a configuração do MTA / servidor da web. Normalmente, você envia um endereço de e-mail para: seu endereço e, em seguida, obtém um relatório de entrega e mais análises ou falhas concretas posteriormente:
Use um mailer diferente
A mail()
função incorporada do PHP é útil e geralmente faz o trabalho, mas tem suas deficiências . Felizmente, existem alternativas que oferecem mais poder e flexibilidade, incluindo o tratamento de muitos dos problemas descritos acima:
Tudo isso pode ser combinado com um servidor / provedor de serviços SMTP profissional. (Como os planos de hospedagem compartilhada típicos de 08/15 são bem-sucedidos quando se trata de instalação / configurabilidade de e-mail).