<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
Eu tentei criar um formulário de correio simples. O formulário em si está na minha index.html
página, mas ele é enviado para uma página separada "obrigado pelo envio" thankyou.php
, onde o código PHP acima está incorporado. O código é enviado perfeitamente, mas nunca envia um email. Como posso consertar isso?
$from
Respostas:
Embora existam partes desta resposta que se aplicam apenas ao uso do
mail()
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.
Consulte Como posso obter mensagens de erro úteis em PHP? - esta resposta para mais detalhes sobre isso.
Verifique se a
mail()
função é chamadaPode 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 corretamenteA 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ê verificar
error_get_last()
imediatamente se há falhas concretas.Verifica a
mail()
valor de retornoA
mail()
função:Isso é importante notar porque:
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.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, enquantoTRUE
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:
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":
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ê.
Não use um
From:
remetente falsoEmbora 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:
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.
Outra maneira de testar isso é codificar o valor do destinatário na
mail()
chamada de função: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ê definiuGET
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 corretoVerifique se o
action
atributo do formulário contém um valor que aponte para o seu código de correspondência PHP.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á configuradoSe 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.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).
fonte
mail()
, ele faz um trabalho tão pobre e é mais difícil de debug do que qualquer outra biblioteca de correioAdicione um cabeçalho de correio na função de correio:
fonte
fonte
Se você estiver usando uma configuração SMTP para enviar seu email, tente usar o PHPMailer . Você pode baixar a biblioteca em https://github.com/PHPMailer/PHPMailer .
Criei meu email enviando assim:
fonte
Basta adicionar alguns cabeçalhos antes de enviar e-mails:
E mais uma coisa. A
mail()
função não está funcionando no host local. Faça o upload do seu código para um servidor e tente.fonte
$from = 'From: yoursite.com';
que não parece um endereço de email válido completo, não há parte local. Você substituiu o cabeçalho De e adicionou outros. Ou melhor, o$from
acima é redundante no seu exemplo. E estar mal formado provavelmente era o problema original dos OPs.Funcionou para mim no 000webhost, fazendo o seguinte:
Digite diretamente o endereço de email ao enviar o email:
Use
''
e não""
.Esse código funciona, mas o email foi recebido com meia hora de atraso.
fonte
Principalmente a
mail()
função está desabilitada na hospedagem compartilhada. Uma opção melhor é usar o SMTP. A melhor opção seria o Gmail ou o SendGrid.SMTPconfig.php
SMTPmail.php
contact_email.php
fonte
Se você usar apenas a
mail()
função, precisará concluir o arquivo de configuração.Você precisa abrir a expansão de email e definir o
SMTP smtp_port
e mais importante, seu nome de usuário e sua senha. Sem isso, o correio não pode ser enviado. Além disso, você pode usar aPHPMail
classe para enviar.fonte
Tente estas duas coisas separadamente e em conjunto:
if($_POST['submit']){}
$from
(apenas meu intestino)fonte
Eu acho que isso deve funcionar. Acabei de adicionar uma
if(isset
concatenação e adicionei às variáveis no corpo para separar o PHP do HTML.fonte
Para quem acha isso daqui para frente, eu não recomendaria o uso
mail
. Há algumas respostas que tocam nisso, mas não o porquê disso.A
mail
função do PHP não é apenas opaca, depende totalmente do MTA que você usa (por exemplo, Sendmail ) para fazer o trabalho.mail
será única dizer se o MTA não conseguiu aceitá-lo (ou seja, Sendmail foi para baixo quando você tentou enviar). Ele não pode dizer se o email foi bem-sucedido porque foi entregue. Como tal (como detalhes da resposta de John Conde ), agora você começa a mexer nos logs do MTA e espera que ele informe o suficiente sobre a falha para corrigi-lo. Se você estiver em um host compartilhado ou não tiver acesso aos logs do MTA, estará sem sorte. Infelizmente, o padrão para a maioria das instalações de baunilha para Linux lida com isso dessa maneira.Uma biblioteca de correio ( PHPMailer , Zend Framework 2+, etc.) faz algo muito diferente
mail
. Eles abrem um soquete diretamente para o servidor de recebimento e enviam os comandos de email SMTP diretamente sobre esse soquete. Em outras palavras, a classe atua como seu próprio MTA (observe que você pode solicitar às bibliotecas que usemmail
para enviar o email, mas eu recomendo fortemente que você não faça isso).Isso significa que você pode ver diretamente as respostas do servidor de recebimento (no PHPMailer, por exemplo, você pode ativar a saída de depuração ). Chega de adivinhar se um e-mail não foi enviado ou por quê.
Você também obtém o benefício de uma interface melhor. É
mail
necessário configurar todos os cabeçalhos, anexos etc. Com uma biblioteca, você tem uma função dedicada para fazer isso. Isso também significa que a função está executando todas as partes complicadas (como cabeçalhos).fonte
fonte
Você pode usar o email de configuração pelo CodeIgniter . Por exemplo, usando SMTP (maneira simples):
Funciona para mim!
fonte
Tente isto
fonte
Talvez o problema seja a configuração do servidor de email. Para evitar esse tipo de problema ou você não precisa se preocupar com o problema do servidor de email, recomendo que você use o PHPMailer .
É um plug-in que tem todo o necessário para enviar e-mails, e a única coisa que você deve levar em consideração é ter a porta SMTP (portas: 25 e 465) ativada.
fonte
Verifique se o Sendmail está instalado no seu servidor.
Se você verificou seu código e verificou que não há nada errado, acesse / var / mail e verifique se essa pasta está vazia.
Se estiver vazio, você precisará fazer um:
se você estiver em um servidor Ubuntu.
fonte
Primeiro, você pode ter muitos parâmetros para a função mail () ... Você pode ter no máximo cinco,
mail(to, subject, message, headers, parameters);
No que diz respeito à
$from
variável, isso deve vir automaticamente do seu host, se você estiver usando o Linux cPanel . Ele vem automaticamente do seu nome de usuário e endereço IP cPanel.Verifique também se você tem a ordem correta das variáveis na função mail ().
O
mail($to, $subject, $message, etc.)
nessa ordem, ou então há uma chance de não funcionar.fonte
Se você está tendo problemas para enviar e-mails com PHP, considere uma alternativa como PHPMailer ou SwiftMailer .
Eu normalmente uso o SwiftMailer sempre que preciso enviar e-mails com PHP.
Uso básico:
Consulte a documentação oficial para obter mais informações sobre como usar o SwiftMailer.
fonte
Para quem não deseja usar mala direta externa e deseja enviar mail () em um servidor Linux dedicado.
A maneira, como o PHP envia e-mails, é descrita
php.ini
na seção[mail function]
.O parâmetro
sendmail-path
descreve como o sendmail é chamado. O valor padrão ésendmail -t -i
, portanto, se você trabalharsendmail -t -i < message.txt
no console Linux - estará pronto. Você também pode adicionarmail.log
ao debug e garantir que mail () seja realmente chamado.MTAs diferentes podem ser implementados
sendmail
. Eles apenas fazem um link simbólico para seus binários com esse nome. Por exemplo, no Debian, o padrão é Postfix . Configure seu MTA para enviar e-mail e testá-lo no console comsendmail -v -t -i < message.txt
. O arquivomessage.txt
deve conter todos os cabeçalhos de uma mensagem e um corpo; o endereço de destino do envelope será retirado doTo:
cabeçalho. Exemplo:Prefiro usar ssmtp como MTA, porque é simples e não requer a execução de um daemon com portas abertas. O ssmtp se encaixa apenas no envio de email do host local . Ele também pode enviar email autenticado por meio da sua conta em um serviço de correio público. Instale o ssmtp e edite o arquivo de configuração
/etc/ssmtp/ssmtp.conf
. Para poder também receber correio do sistema local para contas Unix (alertas para raiz de tarefas cron, por exemplo), configure/etc/ssmtp/revaliases
arquivo de .Aqui está minha configuração para minha conta no e-mail Yandex:
fonte
Isso afetará apenas um pequeno grupo de usuários, mas eu gostaria que fosse documentado para esse pequeno grupo. Esse membro desse pequeno grupo passou 6 horas solucionando problemas de um script de correio PHP funcionando por causa desse problema.
Se você estiver indo para uma universidade que executa o XAMPP em www.AceITLab.com, deve saber o que nosso professor não nos disse: O firewall do AceITLab (não o firewall do Windows) bloqueia o MercuryMail no XAMPP. Você terá que usar um cliente de correio alternativo, a pear está trabalhando para nós. Você precisará enviar para uma conta do Gmail com configurações de baixa segurança.
Sim, eu sei, isso é totalmente inútil para emails do mundo real. No entanto, pelo que vi, as configurações acadêmicas e o mundo real geralmente têm muito pouco em comum.
fonte
Se você estiver executando esse código em um servidor local (ou seja, seu computador para fins de desenvolvimento), ele não enviará o email ao destinatário. Ele criará um
.txt
arquivo em uma pasta chamadamailoutput
.No caso de você estar usando um serviço de mangueira gratuito, como
000webhost
ouhostinger
, esses prestadores de serviços desativam amail()
função para impedir o uso não intencional de falsificação de e-mail, spam, etc.Se você tem certeza de que o provedor de serviços suporta a função mail (), pode verificar este manual do PHP para obter mais referências,
Correio PHP ()
Para verificar se o serviço de hospedagem suporta a função mail (), tente executar este código (lembre-se de alterar o endereço de email do destinatário) :
fonte
A instalação do Sendmail para o Debian 10.0.0 ('Buster') foi de fato trivial!
php.ini
Instalação padrão do pacote sendmail (permitindo 'enviar'):
Comandos úteis diversos:
Verificação (da capacidade de enviar)
O exposto acima levou cerca de 5 minutos. Então perdi 5 horas ... Não se esqueça de verificar sua pasta de spam !
fonte
Existem várias possibilidades:
Você está enfrentando um problema no servidor. O servidor não possui nenhum servidor de correio. Portanto, seu e-mail não está funcionando, porque seu código está correto e o e-mail está funcionando com o tipo
Você não está recebendo o valor lançado. Tente seu código com um valor estático.
Use emails SMTP para enviar emails ...
fonte
Você pode usar o libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
fonte
mail()
wrapper de função. Adiciona apenas construção de mensagens e alguns truques.Você pode ver seus erros:
E meu código de exemplo é:
fonte
SMTPDebug = 0
não é útil. Nem uma "senha" simples funcionaria com o GMail. Esta resposta não contribui muito aqui.Desde que seu sistema sendmail funcione, seu código deve ser modificado da seguinte maneira:
Isso permite que você envie e-mails baseados em HTML.
De interesse notável:
Nota: a
<<<EOB
sintaxe requer que o último marcador EOB comece como o início da linha e não tem espaço ou qualquer caractere após o ponto e vírgula.fonte