A função de correio do PHP não conclui o envio de e-mail

Jul 09 2014
<?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>';
        }
    }
?>

Tentei criar um formulário de correio simples. O formulário em si está na minha index.htmlpágina, mas é enviado para uma página separada de "obrigado pelo seu envio" thankyou.php, onde o código PHP acima está incorporado. O código é enviado perfeitamente, mas nunca envia um e-mail. Como posso consertar isso?

Respostas

533 JohnConde Jul 09 2014 at 09:21

Embora haja partes dessa resposta que se aplicam apenas ao uso da mail()função em si, muitas dessas etapas de solução de problemas podem ser aplicadas a qualquer sistema de correio 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 quaisquer armadilhas em potencial que possa encontrar.

Certifique-se de que o relatório de erros esteja habilitado e configurado para relatar todos os erros

O relatório de erros é essencial para eliminar bugs em seu código e erros gerais que o PHP encontra. O relatório de erros precisa ser ativado para receber esses erros. Colocar o código a seguir no topo de seus arquivos PHP (ou em um arquivo de configuração mestre) 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.

Certifique-se de que a mail()função seja chamada

Pode parecer bobagem, mas um erro comum é esquecer de colocar a mail()função em seu código. Certifique-se de que está lá e não comentado.

Certifique-se de que a mail()função seja chamada corretamente

bool mail (string $to , string $assunto, string $message [, string $adicionais_headers [, string $ additional_parameters]])

A função mail tem três parâmetros obrigatórios e, opcionalmente, um quarto e um quinto. Se sua chamada para mail()não tiver pelo menos três parâmetros, ela falhará.

Se sua chamada para mail()não tiver os parâmetros corretos na ordem correta, ela também falhará.

Verifique os logs de e-mail do servidor

Seu servidor da web deve registrar todas as tentativas de enviar e-mails por meio dele. A localização desses logs pode variar (você pode precisar perguntar ao administrador do servidor onde eles estão localizados), mas eles podem ser comumente 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 bloqueio de portas é um problema muito comum que a maioria dos desenvolvedores enfrenta ao integrar seu código para enviar e-mails usando SMTP. E, isso pode ser facilmente rastreado nos maillogs do 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 compartilhada, as portas 25 e 587 permanecem bloqueadas por padrão. Este bloqueio foi feito propositalmente pelo seu provedor de hospedagem. Isso é verdade até mesmo para alguns dos servidores dedicados. Quando essas portas estiverem bloqueadas, tente se conectar usando a porta 2525. Se você descobrir que essa porta também está bloqueada, a única solução é entrar em contato com seu provedor de hospedagem para desbloquear essas portas.

A maioria dos provedores de hospedagem bloqueia essas portas de e-mail para proteger sua rede de enviar e-mails 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, é sugerido usar a porta 587 para evitar os limites de taxa definidos por alguns provedores de hospedagem.

Não use o operador de supressão de erros

Quando o operador de supressão de erro @ é anexado a uma expressão em PHP, quaisquer mensagens de erro que possam ser geradas por essa expressão serão ignoradas. Há circunstâncias em que é necessário usar esse operador, mas enviar e-mail não é uma delas.

Se o seu código contiver @mail(...), você pode estar ocultando mensagens de erro importantes que o ajudarão a depurar isso. Remova o @e veja se algum erro é relatado.

Só é aconselhável quando você verificaerror_get_last() logo em seguida para falhas concretas.

Verifique o mail()valor de retorno

A mail()função:

Retorna TRUEse a correspondência foi aceita com sucesso para entrega, FALSEcaso contrário. É importante notar que só porque a correspondência foi aceita para entrega, isso NÃO significa que ela realmente chegará ao destino pretendido.

É importante observar isso porque:

  • Se você receber um FALSEvalor de retorno, sabe que o erro está no fato de o servidor estar aceitando seu e-mail. Provavelmente, não é um problema de codificação, mas de configuração do servidor. Você precisa falar com o administrador do sistema para descobrir por que isso está acontecendo.
  • Se você receber um TRUEvalor de retorno, isso não significa que seu e-mail será enviado com certeza. Significa apenas que o e-mail foi enviado para seu respectivo manipulador no servidor com sucesso pelo PHP. Existem ainda mais pontos de falha fora do controle do PHP que podem fazer com que o e-mail não seja enviado.

Então FALSEvai ajudar você aponte na direção certa enquanto TRUEque não significa, necessariamente, o seu e-mail foi enviado com sucesso. Isto é importante para anotar!

Verifique se o seu provedor de hospedagem permite que você envie e-mails e não limite o envio de e-mails

Muitos webhosts compartilhados, especialmente provedores de hospedagem gratuita, não permitem o envio de e-mails de seus servidores ou limitam a quantidade que pode ser enviada durante um determinado período de tempo. Isso se deve aos esforços para impedir que os spammers tirem proveito de seus serviços mais baratos.

Se você acha que seu host tem limites de envio de e-mail ou bloqueia o envio de e-mails, verifique as perguntas frequentes para ver se eles listam tais limitações. Caso contrário, você pode precisar entrar em contato com o suporte deles para verificar se há alguma restrição em relação ao envio de e-mails.

Verifique as pastas de spam; evitar que e-mails sejam sinalizados como spam

Muitas vezes, por vários motivos, e-mails enviados por meio de PHP (e outras linguagens de programação do lado do servidor) acabam na pasta de spam do destinatário. Sempre verifique lá antes de solucionar o problema do seu código.

Para evitar que e-mails enviados por PHP sejam enviados para a pasta de spam de um destinatário, há várias coisas que você pode fazer, tanto em 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 pertencem um ao outro e para evitar 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 certificar-se de que o endereço IP do seu servidor de email aponta para o nome de domínio que você usa para enviar emails.
  • Certifique-se de que o endereço IP que você está usando não está em uma lista negra
  • Certifique-se de que o endereço para resposta seja um endereço existente válido.
  • Use o nome completo e verdadeiro do destinatário no campo Para, não apenas o endereço de e-mail (por exemplo "John Smith" <[email protected]>).
  • Monitore suas contas de abuso, como [email protected] e [email protected]. Isso significa - certifique-se de que essas contas existam, leia o que é enviado a elas e aja de acordo com as reclamações.
  • Por fim, torne muito fácil cancelar a inscrição. Caso contrário, seus usuários irão cancelar a assinatura pressionando o botão de spam , e isso afetará sua reputação.

Consulte Como você se certifica de que o e-mail enviado programaticamente não seja automaticamente marcado como spam? para mais informações sobre este tópico.

Certifique-se de que todos os cabeçalhos de correio sejam fornecidos

Alguns softwares de spam rejeitarão e-mails se estiverem faltando cabeçalhos comuns, como "De" e "Responder para":

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

Certifique-se de que os cabeçalhos de e-mail não tenham 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 inviabilizar seu e-mail. Verifique novamente para ter certeza de que sua sintaxe está correta, pois o PHP não detectará esses erros para você.

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Não use um From:remetente falso

Embora o e-mail deva ter um remetente De :, você não pode usar qualquer valor. Em particular, os endereços de remetentes fornecidos pelo usuário são uma maneira infalível de bloquear e-mails:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Motivo: sua web ou servidor de envio de e-mail não está na lista de permissões SPF / DKIM para fingir ser responsável por endereços @hotmail ou @gmail. Ele pode até mesmo descartar silenciosamente e-mails com From:domínios de remetentes para os quais não está configurado.

Certifique-se de que o valor do destinatário está correto

Às vezes, o problema é tão simples quanto ter um valor incorreto para o destinatário do e-mail. Isso pode ser devido ao uso de uma variável incorreta.

$to = '[email protected]';
// 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('[email protected]', $subject, $message, $headers); 

Isso pode se aplicar a todos os mail()parâmetros.

Enviar para várias contas

Para ajudar a descartar problemas de conta de e-mail, envie seu e-mail para várias contas de e-mail em diferentes provedores de e-mail . Se seus e-mails não chegam à conta do Gmail de um usuário, envie os mesmos e-mails para uma conta do Yahoo, do Hotmail e de uma conta POP3 normal (como sua conta de e-mail fornecida pelo ISP).

Se os emails chegarem a todas ou a algumas das outras contas de email, você sabe que seu código está enviando emails, mas é provável que o provedor da conta de email os esteja bloqueando por algum motivo. Se o e-mail não chegar a nenhuma conta de e-mail, é mais provável que o problema esteja relacionado ao seu código.

Certifique-se de que o código corresponda ao método do formulário

Se você definiu seu método de formulário como POST, certifique-se de usar $_POSTpara procurar os valores do formulário. Se você o definiu como GETou não o definiu, certifique-se de usar $_GETpara procurar os valores do formulário.

Certifique-se de que o actionvalor do formulário aponta para o local correto

Certifique-se de que o actionatributo de formulário contém um valor que aponta para o código de correspondência PHP.

<form action="send_email.php" method="POST">

Certifique-se de que o host suporta o envio de e-mail

Alguns provedores de hospedagem na Web não permitem ou permitem o envio de e-mails por meio de seus servidores. Os motivos para isso podem variar, mas se eles desativaram o envio de e-mails, você precisará usar um método alternativo que usa terceiros para enviar esses e-mails para você.

Um e-mail para o suporte técnico (após uma visita ao suporte online ou FAQ) deve esclarecer se os recursos de e-mail estão disponíveis em seu servidor.

Certifique-se de que o localhostservidor de e-mail está configurado

Se você estiver desenvolvendo em sua estação de trabalho local usando WAMP, MAMP ou XAMPP, provavelmente um servidor de e-mail não está instalado em sua estação de trabalho. Sem um, o PHP não pode enviar e-mail por padrão.

Você pode superar isso instalando um servidor de e-mail 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.

Habilitar customização de 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 os parâmetros de chamada de função e o script de invocação.

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

Consulte http://php.net/manual/en/mail.configuration.php para obter detalhes. (É melhor ativar essas opções no php.iniou .user.iniou .htaccesstalvez.)

Verifique com um serviço de teste de e-mail

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 uma sonda de e-mail para: o endereço deles, em seguida, obtém um relatório de entrega e mais falhas concretas ou análises mais tarde:

Use um mailer diferente

A mail()função embutida do PHP é útil e geralmente dá conta do recado, mas tem suas deficiências . Felizmente, existem alternativas que oferecem mais poder e flexibilidade, incluindo lidar com muitos dos problemas descritos acima:

Tudo isso pode ser combinado com um servidor / provedor de serviços SMTP profissional. (Porque os planos comuns de hospedagem na web compartilhados de 15/08 são imprevisíveis quando se trata de configuração / configuração de e-mail.)

39 er.irfankhan11 Jul 27 2015 at 21:01

Adicione um cabeçalho de e-mail na função de e-mail:

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}
25 sonamgupta May 20 2015 at 20:23
  1. Sempre tente enviar cabeçalhos na função de e-mail.
  2. Se você estiver enviando e-mail por meio do host local, faça as configurações de SMTP para enviar e-mail.
  3. Se você estiver enviando e-mail por meio de um servidor, verifique se o recurso de envio de e-mail está ativado em seu servidor.
21 oneDerer Jul 09 2014 at 09:55

Se você estiver usando uma configuração SMTP para enviar seu e-mail, tente usar o PHPMailer . Você pode baixar a biblioteca em https://github.com/PHPMailer/PHPMailer .

Criei meu e-mail enviando desta forma:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
17 user1258544 Jul 09 2014 at 10:22

Basta adicionar alguns cabeçalhos antes de enviar e-mail:

<?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";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

E mais uma coisa. A mail()função não está funcionando no localhost. Envie seu código para um servidor e tente.

13 bat.t Sep 29 2015 at 21:25

Funcionou para mim no 000webhost ao fazer o seguinte:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

Insira diretamente o endereço de e-mail ao enviar o e-mail:

mail('[email protected]', $subject, $message, $headers)

Use ''e não "".

Este código funciona, mas o e-mail foi recebido com meia hora de atraso.

10 Karthik Jun 23 2016 at 16:02

Geralmente, a mail()função é desativada em hospedagem compartilhada. A melhor opção é usar SMTP. A melhor opção seria Gmail ou SendGrid.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
9 iatboy Aug 05 2014 at 10:49

Se você usar apenas a mail()função, será necessário completar o arquivo de configuração.

Você precisa abrir a expansão de e-mail e definir o SMTP smtp_porte assim por diante, 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 a PHPMailclasse para enviar.

9 vldfr Feb 11 2015 at 22:20

Experimente essas duas coisas separadamente e juntas:

  1. remova o if($_POST['submit']){}
  2. remover $from(apenas meu intestino)
8 StephenM Jan 03 2015 at 09:32

Acho que isso deve funcionar. Acabei de adicionar uma if(issetconcatenação às variáveis ​​no corpo para separar o PHP do HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_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>'; 
    }
}

?>
8 Machavity May 20 2016 at 19:45

Para quem acha que isso está acontecendo, eu não recomendo o uso mail. Existem algumas respostas que tocam nisso, mas não o porquê .

A mailfunção do PHP não é apenas opaca, ela depende totalmente de qualquer MTA que você usar (ou seja, Sendmail ) para fazer o trabalho. mailserá ú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 e-mail foi bem-sucedido porque foi entregue. Como tal (como os detalhes da resposta de John Conde ), você agora pode mexer nos logs do MTA e esperar que ele diga o suficiente sobre a falha em corrigi-lo. Se você está em um host compartilhado ou não tem acesso aos logs do MTA, você está sem sorte. Infelizmente, o padrão para a maioria das instalações vanilla para Linux lidam com isso dessa maneira.

Uma biblioteca de correio ( PHPMailer , Zend Framework 2+, etc.) faz algo muito diferente de mail. Eles abrem um soquete diretamente para o servidor de e-mail de recebimento e, em seguida, enviam os comandos de correio SMTP diretamente por esse soquete. Em outras palavras, a classe atua como seu próprio MTA (observe que você pode dizer às bibliotecas para usarem mailpara enviar o e-mail, 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 tentar adivinhar se um e-mail não foi enviado ou por quê.

Se você estiver usando SMTP (ou seja, estiver ligando isSMTP()), poderá obter uma transcrição detalhada da conversa SMTP usando a SMTPDebugpropriedade.

Defina essa opção incluindo uma linha como esta em seu script:

$mail->SMTPDebug = 2;

Você também obtém o benefício de uma interface melhor. Com mailvocê tem que configurar todos os seus cabeçalhos, anexos, etc. Com uma biblioteca, você tem uma função dedicada para fazer isso. Também significa que a função está fazendo todas as partes complicadas (como cabeçalhos).

6 Chiragpatel Jul 13 2015 at 14:27
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6 dEsta88 Oct 07 2014 at 05:33

Você pode usar o e-mail de configuração do CodeIgniter . Por exemplo, usando SMTP (forma simples):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

Funciona para mim!

4 GauravSirauthiya Jun 23 2015 at 17:58

Tente isto

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4 JackCh Mar 20 2018 at 02:09

Talvez o problema seja a configuração do servidor de e-mail. Para evitar esse tipo de problema ou você não precisa se preocupar com o problema do servidor de e-mail, eu recomendo que você use o PHPMailer .

É um plugin que possui todo o necessário para enviar e-mail, e a única coisa que você deve levar em consideração é que a porta SMTP (Portas: 25 e 465) está habilitada.

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}
3 Daniel Sep 24 2017 at 10:50

Certifique-se de ter Sendmail instalado em seu servidor.

Se você verificou seu código e verificou que não há nada de errado nele, vá para / var / mail e verifique se a pasta está vazia.

Se estiver vazio, você precisará fazer:

sudo apt-get install sendmail

se você estiver em um servidor Ubuntu.

3 aidangig Jan 31 2016 at 21:15

Em primeiro lugar, 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 à $fromvariável, ela deve vir automaticamente do seu host se você estiver usando o cPanel do Linux . Ele vem automaticamente do seu nome de usuário cPanel e endereço IP.

$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";

Além disso, certifique-se de ter a ordem correta das variáveis ​​em sua função mail ().

A nessa ordem, ou então há uma chance de ele não trabalhar.mail($to, $subject, $message, etc.)

3 JohnSlegers Feb 10 2016 at 20:23

Se você está tendo problemas para enviar e-mails com PHP, considere uma alternativa como PHPMailer ou SwiftMailer .

Eu costumo usar o SwiftMailer sempre que preciso enviar e-mails com PHP.


Uso básico:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Consulte a documentação oficial para obter mais informações sobre como usar o SwiftMailer.

3 user3132194 Jun 21 2017 at 19:07

Para quem não deseja usar mailers externos e deseja enviar e-mail () em um servidor Linux dedicado.

A maneira como o PHP envia e-mails é descrita php.inina seção [mail function].

O parâmetro sendmail-pathdescreve como o sendmail é chamado. O valor padrão é sendmail -t -i, portanto, se você começar a trabalhar sendmail -t -i < message.txtno console do Linux, estará pronto. Você também pode adicionar mail.logpara depurar e ter certeza de que mail () é realmente chamado.

Diferentes MTAs podem implementar sendmail. Eles apenas fazem um link simbólico para seus binários nesse nome. Por exemplo, no Debian, o padrão é Postfix . Configure seu MTA para enviar e-mail e testá-lo no console com sendmail -v -t -i < message.txt. O arquivo message.txtdeve conter todos os cabeçalhos de uma mensagem e um corpo, o endereço de destino do envelope será obtido do To:cabeçalho. Exemplo:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

Eu prefiro usar ssmtp como MTA porque é simples e não requer a execução de um daemon com portas abertas. ssmtp serve apenas para enviar e-mail de localhost . Ele também pode enviar e-mail autenticado por meio de sua conta em um serviço de correio público. Instale ssmtp e edite o arquivo de configuração /etc/ssmtp/ssmtp.conf. Para poder também receber e-mails do sistema local para contas Unix (alertas para root de tarefas cron, por exemplo), configure o /etc/ssmtp/revaliasesarquivo.

Aqui está minha configuração para minha conta no correio Yandex:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

Isso afetará apenas um pequeno grupo de usuários, mas gostaria que fosse documentado para esse pequeno grupo. Este membro daquele pequeno grupo passou 6 horas solucionando problemas de um script de e-mail PHP funcional devido a esse problema.

Se você está indo para uma universidade que executa o XAMPP de www.AceITLab.com, você deve saber o que nosso professor não nos disse: O firewall AceITLab (não o firewall do Windows) bloqueia MercuryMail no XAMPP. Você terá que usar um cliente de e-mail alternativo, o pear está trabalhando para nós. Você terá que enviar para uma conta do Gmail com configurações de segurança baixas.

Sim, eu sei, isso é totalmente inútil para e-mail do mundo real. No entanto, pelo que tenho visto, os ambientes acadêmicos e o mundo real muitas vezes têm muito pouco em comum.

1 Ron Apr 01 2017 at 10:30

Se você estiver executando este código em um servidor local (ou seja, seu computador para fins de desenvolvimento), ele não enviará o e-mail ao destinatário. Isso criará um .txtarquivo em uma pasta chamada mailoutput.

No caso de você usar um serviço de hosing gratuito, como 000webhostou hostinger, esses provedores de serviço desabilitam a mail()função para evitar o uso não intencional de spoofing de e-mail, spam, etc. Prefiro que você entre em contato com eles para ver se eles oferecem suporte a esse recurso.

Se você tiver certeza de que o provedor de serviços suporta a função mail (), você pode verificar este manual de PHP para referência futura,

Correio PHP ()

Para verificar se o seu serviço de hospedagem oferece suporte à função mail (), tente executar este código (lembre-se de alterar o endereço de e-mail do destinatário) :

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

A instalação do Sendmail para Debian 10.0.0 ('Buster') era de fato trivial!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Instalação de pacote sendmail padrão (permitindo 'enviar'):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Comandos úteis diversos:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Verificação (capacidade de envio)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

O processo acima demorou cerca de 5 minutos. Então perdi 5 horas ... Não se esqueça de verificar sua pasta de spam !

SuReSh Apr 28 2015 at 13:08

Existem várias possibilidades:

  1. Você está enfrentando um problema de servidor. O servidor não possui nenhum servidor de e-mail. Portanto, seu e-mail não está funcionando, porque seu código está bom e o e-mail está funcionando com o tipo.

  2. Você não está recebendo o valor lançado. Experimente seu código com um valor estático.

  3. Use e-mails SMTP para enviar e-mail ...

krishna Dec 23 2018 at 21:25

Você pode ver seus erros por:

error_reporting(E_ALL);

E meu código de amostra é:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>
ofricofri Aug 16 2020 at 08:44

Se você está preso a um aplicativo hospedado no Hostgator, é isso que resolveu meu problema. Muito obrigado ao cara que postou a solução detalhada. Caso o link fique offline um dia, aí está o resumo:

  • Procure o caminho do sendmail em seu servidor. Uma maneira simples de verificar isso, é escrever temporariamente o seguinte código em uma página que só terá acesso, para ler a informação gerada: <?php phpinfo(); ?>. Abra esta página e procure sendmail path. (Então, não se esqueça de remover este código!)
  • Problema e solução: se o caminho do sendmail está dizendo apenas -t -i, edite o do seu servidor php.inie adicione a seguinte linha:sendmail_path = /usr/sbin/sendmail -t -i;

Mas, depois de conseguir enviar e-mail com a mail()função PHP , descobri que ele envia e-mail não autenticado, o que criou outro problema. Os e-mails estavam todos caindo na minha caixa de lixo eletrônico do Hotmail, e alguns e-mails nunca foram entregues, o que eu acho que está relacionado ao fato de que eles não são autenticados. Afinal, é por isso que decidi mudar de mail()para PHPMailercom SMTP.