La función de correo PHP no completa el envío de correo electrónico

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

Intenté crear un formulario de correo simple. El formulario en sí está en mi index.htmlpágina, pero se envía a una página separada de "gracias por su envío" thankyou.php, donde está incrustado el código PHP anterior. El código se envía perfectamente, pero nunca envía un correo electrónico. ¿Cómo puedo arreglar esto?

Respuestas

533 JohnConde Jul 09 2014 at 09:21

Aunque hay partes de esta respuesta que se aplican solo al uso de la mail()función en sí, muchos de estos pasos de solución de problemas se pueden aplicar a cualquier sistema de correo PHP.

Hay una variedad de razones por las que parece que su script no envía correos electrónicos. Es difícil diagnosticar estas cosas a menos que exista un error de sintaxis obvio. Sin uno, debe revisar la lista de verificación a continuación para encontrar los posibles obstáculos que pueda encontrar.

Asegúrese de que el informe de errores esté habilitado y configurado para informar todos los errores

Los informes de errores son esenciales para eliminar errores en su código y errores generales que encuentra PHP. Los informes de errores deben estar habilitados para recibir estos errores. Colocar el siguiente código en la parte superior de sus archivos PHP (o en un archivo de configuración maestro) habilitará el informe de errores.

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

Consulte ¿Cómo puedo obtener mensajes de error útiles en PHP? - esta respuesta para obtener más detalles sobre esto.

Asegúrese de que mail()se llame a la función

Puede parecer una tontería, pero un error común es olvidarse de colocar la mail()función en su código. Asegúrese de que esté ahí y no comentado.

Asegúrese de que la mail()función se llame correctamente

bool mail (cadena $ para, cadena $ asunto, cadena $ mensaje [, cadena $ encabezados_adicionales [, cadena $ parámetros_adicionales]])

La función de correo toma tres parámetros obligatorios y, opcionalmente, un cuarto y un quinto. Si su llamada a mail()no tiene al menos tres parámetros, fallará.

Si su llamada a mail()no tiene los parámetros correctos en el orden correcto, también fallará.

Verifique los registros de correo del servidor

Su servidor web debe registrar todos los intentos de enviar correos electrónicos a través de él. La ubicación de estos registros variará (es posible que deba preguntarle al administrador del servidor dónde se encuentran), pero normalmente se pueden encontrar en el directorio raíz de un usuario en logs. Dentro habrá mensajes de error que el servidor informó, si los hay, relacionados con sus intentos de enviar correos electrónicos.

Compruebe si hay falla en la conexión del puerto

El bloqueo de puertos es un problema muy común al que se enfrentan la mayoría de los desarrolladores al integrar su código para enviar correos electrónicos mediante SMTP. Y esto se puede rastrear fácilmente en los registros de correo del servidor (la ubicación del servidor del registro de correo puede variar de un servidor a otro, como se explicó anteriormente). En caso de que esté en un servidor de alojamiento compartido, los puertos 25 y 587 permanecen bloqueados de forma predeterminada. Este bloqueo lo ha realizado a propósito su proveedor de alojamiento. Esto es cierto incluso para algunos de los servidores dedicados. Cuando estos puertos están bloqueados, intente conectarse utilizando el puerto 2525. Si encuentra que el puerto también está bloqueado, la única solución es ponerse en contacto con su proveedor de alojamiento para desbloquear estos puertos.

La mayoría de los proveedores de alojamiento bloquean estos puertos de correo electrónico para proteger su red del envío de correos electrónicos no deseados.

Utilice los puertos 25 o 587 para conexiones simples / TLS y el puerto 465 para conexiones SSL. Para la mayoría de los usuarios, se sugiere utilizar el puerto 587 para evitar los límites de velocidad establecidos por algunos proveedores de alojamiento.

No utilice el operador de supresión de errores

Cuando el operador de supresión de errores @ se antepone a una expresión en PHP, se ignorará cualquier mensaje de error que pueda generar esa expresión. Hay circunstancias en las que es necesario utilizar este operador, pero el envío de correo no es una de ellas.

Si su código lo contiene @mail(...), es posible que esté ocultando importantes mensajes de error que lo ayudarán a depurarlo. Elimine @y vea si se informa algún error.

Solo es aconsejable cuando consulta conerror_get_last() inmediatamente fallas en el concreto.

Verifique el mail()valor de retorno

La mail()función:

Devoluciones TRUEsi el correo fue aceptado con éxito para la entrega, en FALSEcaso contrario. Es importante tener en cuenta que el hecho de que el correo haya sido aceptado para su entrega NO significa que el correo llegue al destino previsto.

Es importante tener en cuenta esto porque:

  • Si recibe un FALSEvalor devuelto, sabe que el error radica en que su servidor acepta su correo. Probablemente no sea un problema de codificación, sino un problema de configuración del servidor. Debe hablar con el administrador del sistema para averiguar por qué sucede esto.
  • Si recibe un TRUEvalor de devolución, no significa que definitivamente se enviará su correo electrónico. Simplemente significa que PHP envió el correo electrónico a su respectivo controlador en el servidor. Todavía hay más puntos de falla fuera del control de PHP que pueden causar que el correo electrónico no se envíe.

Por FALSElo tanto, lo ayudará a orientarlo en la dirección correcta, TRUEaunque no necesariamente significa que su correo electrónico se envió correctamente. ¡Esto es importante tener en cuenta!

Asegúrese de que su proveedor de alojamiento le permita enviar correos electrónicos y no limite el envío de correo

Muchos alojamientos web compartidos, especialmente los proveedores de alojamiento web gratuitos, no permiten que se envíen correos electrónicos desde sus servidores o limitan la cantidad que se puede enviar durante un período de tiempo determinado. Esto se debe a sus esfuerzos por evitar que los spammers aprovechen sus servicios más baratos.

Si cree que su anfitrión tiene límites de correo electrónico o bloquea el envío de correos electrónicos, consulte sus preguntas frecuentes para ver si enumeran dichas limitaciones. De lo contrario, es posible que deba comunicarse con su soporte para verificar si existen restricciones en torno al envío de correos electrónicos.

Revise las carpetas de spam; evitar que los correos electrónicos se marquen como spam

A menudo, por diversas razones, los correos electrónicos enviados a través de PHP (y otros lenguajes de programación del lado del servidor) terminan en la carpeta de correo no deseado del destinatario. Siempre verifique allí antes de solucionar problemas de su código.

Para evitar que el correo enviado a través de PHP se envíe a la carpeta de correo no deseado del destinatario, hay varias cosas que puede hacer, tanto en su código PHP como de otra manera, para minimizar las posibilidades de que sus correos electrónicos se marquen como correo no deseado. Los buenos consejos de Michiel de Mare incluyen:

  • Utilice métodos de autenticación de correo electrónico, como SPF y DKIM, para demostrar que sus correos electrónicos y su nombre de dominio van de la mano y para evitar la falsificación de su nombre de dominio. El sitio web de SPF incluye un asistente para generar la información de DNS para su sitio.
  • Verifique su DNS inverso para asegurarse de que la dirección IP de su servidor de correo apunte al nombre de dominio que usa para enviar correo.
  • Asegúrese de que la dirección IP que está utilizando no esté en una lista negra
  • Asegúrese de que la dirección de respuesta sea una dirección existente válida.
  • Utilice el nombre completo y real del destinatario en el campo Para, no solo la dirección de correo electrónico (p "John Smith" <[email protected]>. Ej .).
  • Supervise sus cuentas de abuso, como [email protected] y [email protected]. Eso significa: asegúrese de que existan estas cuentas, lea lo que se les envíe y actúe sobre las quejas.
  • Finalmente, haz que sea realmente fácil cancelar la suscripción. De lo contrario, sus usuarios se darán de baja presionando el botón de spam y eso afectará su reputación.

Consulte ¿Cómo se asegura de que el correo electrónico que envía mediante programación no se marque automáticamente como spam? para más información sobre este tema.

Asegúrese de que se proporcionen todos los encabezados de correo

Algunos programas de spam rechazarán el correo si le faltan encabezados comunes como "De" y "Responder a":

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

Asegúrese de que los encabezados de correo no tengan errores de sintaxis

Los encabezados no válidos son tan malos como no tener encabezados. Un carácter incorrecto podría ser todo lo que se necesita para descarrilar su correo electrónico. Verifique dos veces para asegurarse de que su sintaxis sea correcta, ya que PHP no detectará estos errores por usted.

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

No uses un From:remitente falso

Si bien el correo debe tener un remitente De:, no puede usar cualquier valor. En particular, las direcciones de remitente proporcionadas por el usuario son una forma segura de bloquear los correos:

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

Razón: su web o servidor de envío de correo no está incluido en la lista blanca SPF / DKIM para pretender ser responsable de las direcciones @hotmail o @gmail. Incluso puede soltar silenciosamente correos con From:dominios de remitentes para los que no está configurado.

Asegúrese de que el valor del destinatario sea correcto

A veces, el problema es tan simple como tener un valor incorrecto para el destinatario del correo electrónico. Esto puede deberse al uso de una variable incorrecta.

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

Otra forma de probar esto es codificar el valor del destinatario en la mail()llamada a la función:

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

Esto puede aplicarse a todos los mail()parámetros.

Enviar a varias cuentas

Para ayudar a descartar problemas con la cuenta de correo electrónico, envíe su correo electrónico a varias cuentas de correo electrónico en diferentes proveedores de correo electrónico . Si sus correos electrónicos no llegan a la cuenta de Gmail de un usuario, envíe los mismos correos electrónicos a una cuenta de Yahoo, una cuenta de Hotmail y una cuenta POP3 normal (como la cuenta de correo electrónico proporcionada por su ISP).

Si los correos electrónicos llegan a todas o algunas de las otras cuentas de correo electrónico, sabe que su código está enviando correos electrónicos, pero es probable que el proveedor de la cuenta de correo electrónico los esté bloqueando por algún motivo. Si el correo electrónico no llega a ninguna cuenta de correo electrónico, es más probable que el problema esté relacionado con su código.

Asegúrese de que el código coincida con el método del formulario

Si ha establecido su método de formulario en POST, asegúrese de que está utilizando $_POSTpara buscar los valores de su formulario. Si lo configuró GETo no lo configuró en absoluto, asegúrese de usarlo $_GETpara buscar los valores de su formulario.

Asegúrese de que el actionvalor de su formulario apunte a la ubicación correcta

Asegúrese de que el actionatributo de su formulario contenga un valor que apunte a su código de correo PHP.

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

Asegúrese de que el servidor web admita el envío de correo electrónico

Algunos proveedores de alojamiento web no permiten ni habilitan el envío de correos electrónicos a través de sus servidores. Las razones de esto pueden variar, pero si han desactivado el envío de correo, necesitará utilizar un método alternativo que utilice un tercero para enviar esos correos electrónicos por usted.

Un correo electrónico a su soporte técnico (después de un viaje a su soporte en línea o preguntas frecuentes) debería aclarar si las capacidades de correo electrónico están disponibles en su servidor.

Asegúrese de que el localhostservidor de correo esté configurado

Si está desarrollando en su estación de trabajo local utilizando WAMP, MAMP o XAMPP, es probable que no haya un servidor de correo electrónico instalado en su estación de trabajo. Sin uno, PHP no puede enviar correo por defecto.

Puede superar esto instalando un servidor de correo básico. Para Windows, puede utilizar el Mercury Mail gratuito .

También puede utilizar SMTP para enviar sus correos electrónicos. Vea esta gran respuesta de Vikas Dwivedi para aprender cómo hacer esto.

Habilitar PHP personalizado mail.log

Además del archivo de registro de su MTA y PHP, puede habilitar el registro para la mail()función específicamente. No registra la interacción SMTP completa, pero al menos los parámetros de llamada de función y el script de invocación.

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

Consulte http://php.net/manual/en/mail.configuration.php para obtener más detalles. (Es mejor habilitar estas opciones en php.inio .user.inio .htaccessquizás).

Consulte con un servicio de prueba por correo

Hay varios servicios de verificación de envío y correo no deseado que puede utilizar para probar la configuración de su servidor web / MTA. Por lo general, envía una sonda de correo a: su dirección, luego obtiene un informe de entrega y más fallas o análisis concretos más tarde:

Utilice un correo diferente

La función incorporada de PHP mail()es útil y, a menudo, hace el trabajo, pero tiene sus defectos . Afortunadamente, existen alternativas que ofrecen más potencia y flexibilidad, incluido el manejo de muchos de los problemas descritos anteriormente:

Todo lo cual se puede combinar con un servidor / proveedor de servicios SMTP profesional. (Porque los planes de alojamiento web compartido típicos del 15/08 son impredecibles cuando se trata de la configuración / configuración del correo electrónico).

39 er.irfankhan11 Jul 27 2015 at 21:01

Agregue un encabezado de correo en la función de correo:

$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. Intente siempre enviar encabezados en la función de correo.
  2. Si está enviando correo a través de localhost, realice la configuración SMTP para enviar correo.
  3. Si está enviando correo a través de un servidor, verifique que la función de envío de correo electrónico esté habilitada en su servidor.
21 oneDerer Jul 09 2014 at 09:55

Si está utilizando una configuración SMTP para enviar su correo electrónico, intente utilizar PHPMailer en su lugar. Puede descargar la biblioteca desde https://github.com/PHPMailer/PHPMailer .

Creé mi correo electrónico enviando de esta manera:

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

Simplemente agregue algunos encabezados antes de enviar correo:

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

Y una cosa más. La mail()función no funciona en localhost. Sube tu código a un servidor y prueba.

13 bat.t Sep 29 2015 at 21:25

Me funcionó en 000webhost haciendo lo siguiente:

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

Ingrese directamente la dirección de correo electrónico al enviar el correo electrónico:

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

Usar ''y no "".

Este código funciona, pero el correo electrónico se recibió con media hora de retraso.

10 Karthik Jun 23 2016 at 16:02

En su mayoría, la mail()función está desactivada en el alojamiento compartido. Una mejor opción es utilizar SMTP. La mejor opción sería Gmail o 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

Si solo usa la mail()función, debe completar el archivo de configuración.

Necesita abrir la expansión de correo y configurar SMTP smtp_porty así sucesivamente, y lo más importante, su nombre de usuario y contraseña. Sin eso, no se puede enviar correo. Además, puede usar la PHPMailclase para enviar.

9 vldfr Feb 11 2015 at 22:20

Pruebe estas dos cosas por separado y juntas:

  1. eliminar el if($_POST['submit']){}
  2. eliminar $from(solo mi instinto)
8 StephenM Jan 03 2015 at 09:32

Creo que esto debería funcionar. Acabo de agregar una if(issetconcatenación y agregué a las variables en el cuerpo para separar PHP de 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 cualquiera que encuentre esto en el futuro, no recomendaría usar mail. Hay algunas respuestas que tocan esto, pero no el por qué .

La mailfunción de PHP no solo es opaca, sino que depende completamente de cualquier MTA que utilice (es decir, Sendmail ) para hacer el trabajo. mailserá solamente saber si el MTA no pudo aceptarlo (es decir, Sendmail fue abajo cuando intentó enviar). No puede decirle si el correo fue exitoso porque lo entregó. Como tal (como los detalles de la respuesta de John Conde ), ahora puede jugar con los registros del MTA y esperar que le diga lo suficiente sobre la falla para solucionarlo. Si está en un host compartido o no tiene acceso a los registros de MTA, no tiene suerte. Lamentablemente, el valor predeterminado para la mayoría de las instalaciones básicas para Linux lo maneja de esta manera.

Una biblioteca de correo ( PHPMailer , Zend Framework 2+, etc.) hace algo muy diferente a mail. Abren un socket directamente al servidor de correo receptor y luego envían los comandos de correo SMTP directamente sobre ese socket. En otras palabras, la clase actúa como su propio MTA (tenga en cuenta que puede decirle a las bibliotecas que usen mailpara enviar el correo en última instancia, pero le recomiendo encarecidamente que no lo haga).

Esto significa que puede ver directamente las respuestas del servidor receptor (en PHPMailer, por ejemplo, puede activar la salida de depuración ). No más adivinar si un correo no se envió o por qué.

Si está utilizando SMTP (es decir, está llamando isSMTP()), puede obtener una transcripción detallada de la conversación SMTP utilizando la SMTPDebugpropiedad.

Configure esta opción incluyendo una línea como esta en su secuencia de comandos:

$mail->SMTPDebug = 2;

También obtiene el beneficio de una mejor interfaz. Con mailtiene que configurar todos sus encabezados, archivos adjuntos, etc. Con una biblioteca, tiene una función dedicada para hacer eso. También significa que la función está haciendo todas las partes complicadas (como encabezados).

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

Puede usar el correo electrónico de configuración de CodeIgniter . Por ejemplo, usando SMTP (forma simple):

$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
}

¡Esto funciona para mi!

4 GauravSirauthiya Jun 23 2015 at 17:58

Prueba esto

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

Quizás el problema sea la configuración del servidor de correo. Para evitar este tipo de problemas o no tienes que preocuparte por el problema del servidor de correo, te recomiendo que uses PHPMailer .

Es un plugin que tiene todo lo necesario para enviar correo, y lo único que tienes que tener en cuenta es tener habilitado el puerto SMTP (Port: 25 y 465).

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

Asegúrese de tener Sendmail instalado en su servidor.

Si ha revisado su código y verificado que no hay nada malo allí, vaya a / var / mail y verifique si esa carpeta está vacía.

Si está vacío, deberá hacer una:

sudo apt-get install sendmail

si está en un servidor Ubuntu.

3 aidangig Jan 31 2016 at 21:15

En primer lugar, es posible que tenga demasiados parámetros para la función mail () ... Puede tener un máximo de cinco, mail(to, subject, message, headers, parameters);

En lo que respecta a la $fromvariable, debería provenir automáticamente de su servidor web si está utilizando el cPanel de Linux . Viene automáticamente de su nombre de usuario y dirección IP de cPanel.

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

También asegúrese de tener el orden correcto de variables en su función mail ().

En mail($to, $subject, $message, etc.)ese orden, o de lo contrario existe la posibilidad de que no funcione.

3 JohnSlegers Feb 10 2016 at 20:23

Si tiene problemas para enviar correos electrónicos con PHP, considere una alternativa como PHPMailer o SwiftMailer .

Por lo general, uso SwiftMailer siempre que necesito enviar correos con 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 la documentación oficial para obtener más información sobre cómo utilizar SwiftMailer.

3 user3132194 Jun 21 2017 at 19:07

Para aquellos que no quieren utilizar mailers externos y quieren enviar mail () en un servidor Linux dedicado.

La forma en que PHP envía los correos electrónicos se describe php.inien la sección [mail function].

El parámetro sendmail-pathdescribe cómo se llama a sendmail. El valor predeterminado es sendmail -t -i, por lo que si obtiene un trabajo sendmail -t -i < message.txten la consola de Linux, habrá terminado. También puede agregar mail.logpara depurar y asegurarse de que se llame realmente a mail ().

Se pueden implementar diferentes MTA sendmail. Simplemente hacen un enlace simbólico a sus binarios en ese nombre. Por ejemplo, en Debian el valor predeterminado es Postfix . Configure su MTA para enviar correo y pruébelo desde la consola con sendmail -v -t -i < message.txt. El archivo message.txtdebe contener todos los encabezados de un mensaje y un cuerpo; la dirección de destino del sobre se tomará del To:encabezado. Ejemplo:

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

Text body.

Prefiero usar ssmtp como MTA porque es simple y no requiere ejecutar un demonio con puertos abiertos. ssmtp solo sirve para enviar correo desde localhost . También puede enviar correo electrónico autenticado a través de su cuenta en un servicio de correo público. Instale ssmtp y edite el archivo de configuración /etc/ssmtp/ssmtp.conf. Para poder recibir también el correo del sistema local a las cuentas Unix (alertas a root desde trabajos cron, por ejemplo) configure /etc/ssmtp/revaliasesfile.

Aquí está mi configuración para mi cuenta en el correo de Yandex:

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

Esto solo afectará a un pequeño puñado de usuarios, pero me gustaría documentarlo para ese pequeño puñado. Este miembro de ese pequeño grupo pasó 6 horas solucionando problemas de un script de correo PHP en funcionamiento debido a este problema.

Si vas a una universidad que ejecuta XAMPP desde www.AceITLab.com, debes saber lo que nuestro profesor no nos dijo: el firewall AceITLab (no el firewall de Windows) bloquea MercuryMail en XAMPP. Tendrá que utilizar un cliente de correo alternativo, pear está trabajando para nosotros. Tendrá que enviar a una cuenta de Gmail con una configuración de seguridad baja.

Sí, lo sé, esto es totalmente inútil para el correo electrónico del mundo real. Sin embargo, por lo que he visto, los entornos académicos y el mundo real a menudo tienen muy poco en común.

1 Ron Apr 01 2017 at 10:30

Si está ejecutando este código en un servidor local (es decir, su computadora con fines de desarrollo), no enviará el correo electrónico al destinatario. Creará un .txtarchivo en una carpeta llamada mailoutput.

En el caso de que esté utilizando un servicio de alojamiento gratuito, como 000webhosto hostinger, esos proveedores de servicios deshabilitan la mail()función para evitar usos no deseados de suplantación de correo electrónico, spam, etc. Prefiero que se comunique con ellos para ver si admiten esta función.

Si está seguro de que el proveedor de servicios admite la función mail (), puede consultar este manual de PHP para obtener más información.

Correo PHP ()

Para comprobar si su servicio de alojamiento admite la función mail (), intente ejecutar este código (recuerde cambiar la dirección de correo electrónico del destinatario) :

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

¡La instalación de Sendmail para Debian 10.0.0 ('Buster') fue de hecho trivial!

php.ini

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

Instalación estándar del paquete sendmail (permitiendo '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

Varios comandos útiles:

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

Verificación (de capacidad para enviar)

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

Lo anterior tomó aproximadamente 5 minutos. Luego perdí 5 horas ... ¡No olvides revisar tu carpeta de spam !

SuReSh Apr 28 2015 at 13:08

Hay varias posibilidades:

  1. Tiene un problema con el servidor. El servidor no tiene ningún servidor de correo. Entonces su correo no funciona, porque su código está bien y el correo funciona con el tipo.

  2. No obtiene el valor publicado. Pruebe su código con un valor estático.

  3. Utilice correos SMTP para enviar correo ...

krishna Dec 23 2018 at 21:25

Puede ver sus errores por:

error_reporting(E_ALL);

Y mi código de muestra es:

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

Si está atascado con una aplicación alojada en Hostgator, esto es lo que resolvió mi problema. Muchas gracias al tipo que publicó la solución detallada. En caso de que el enlace se desconecte algún día, ahí tienes el resumen:

  • Busque la ruta de sendmail en su servidor. Una forma sencilla de comprobarlo, es escribir temporalmente el código siguiente en una página que sólo se accede a, leer la información generada: <?php phpinfo(); ?>. Abra esta página y busque sendmail path. (¡Entonces, no olvide eliminar este código!)
  • Problema y solución: si su ruta de sendmail solo dice -t -i, edite la de su servidor php.iniy agregue la siguiente línea:sendmail_path = /usr/sbin/sendmail -t -i;

Pero, después de poder enviar correo con la mail()función PHP , me enteré de que envía correo electrónico no autenticado, lo que creó otro problema. Todos los correos electrónicos caían en el buzón de correo basura de mi Hotmail, y algunos correos electrónicos nunca se entregaron, lo que supongo que está relacionado con el hecho de que no están autenticados. Es por eso que decidí cambiar de mail()a PHPMailercon SMTP, después de todo.