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

php html email


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

He intentado crear un formulario de correo simple. El formulario en sí está en mi página index.html , 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?





Answer 1 John Conde


Aunque hay partes de esta respuesta que se aplican solo al uso de la función mail() , 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 tu guión parece no estar enviando correos electrónicos.Es difícil diagnosticar estas cosas a menos que haya un error de sintaxis obvio.Sin uno,necesitas revisar la siguiente lista de control para encontrar cualquier dificultad potencial que puedas encontrar.

Asegúrate de que el reporte de errores esté habilitado y configurado para reportar todos los errores

El reporte de errores es esencial para eliminar los errores en su código y los errores generales que PHP encuentra.El reporte de errores necesita ser habilitado para recibir estos errores.Colocar el siguiente código en la parte superior de sus archivos de PHP (o en un archivo de configuración maestro)habilitará el reporte 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 más detalles sobre esto.

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

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

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

bool mail(string $to,string $subject,string $message [,string $additional_headers [,string $additional_parameters ]])

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

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

Revisa los registros de correo del servidor

Su servidor web debería estar registrando 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 comúnmente se pueden encontrar en el directorio raíz de un usuario debajo de los logs . En el interior habrá mensajes de error que el servidor informó, si corresponde, relacionados con sus intentos de enviar correos electrónicos.

Compruebe si hay un fallo en la conexión del puerto

El bloqueo de puertos es un problema muy común que la mayoría de los desarrolladores enfrentan al integrar su código para entregar correos electrónicos usando SMTP.Y,esto puede ser fácilmente rastreado en los maillots del servidor (la ubicación del servidor de registro de correo puede variar de un servidor a otro,como se explicó anteriormente).En caso de estar en un servidor de alojamiento compartido,los puertos 25 y 587 permanecen bloqueados por defecto.Este bloqueo ha sido realizado a propósito por su proveedor de alojamiento.Esto es cierto incluso para algunos de los servidores dedicados.Cuando estos puertos estén bloqueados,intenta conectarte utilizando el puerto 2525.Si descubres que ese puerto también está bloqueado,la única solución es contactar a tu proveedor de hospedaje para que desbloquee estos puertos.

La mayoría de los proveedores de hospedaje bloquean estos puertos de correo electrónico para proteger su red contra el envío de cualquier correo electrónico no deseado.

Use los puertos 25 o 587 para conexiones plainTLS 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 tarifa establecidos por algunos proveedores de hospedaje.

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, cualquier mensaje de error que pueda generar esa expresión será ignorado. Hay circunstancias en las que es necesario usar este operador, pero el envío de correo no es una de ellas.

Si su código contiene @mail(...) entonces puede estar ocultando mensajes de error importantes que lo ayudarán a depurar esto. Elimine la @ y vea si se informa algún error.

Solo es aconsejable cuando verifica con error_get_last() inmediatamente después de fallas concretas.

Verifique el valor de devolución del mail()

La función mail() :

Devuelve TRUE si el correo fue aceptado con éxito para la entrega, FALSE contrario. Es importante tener en cuenta que solo porque el correo fue aceptado para la entrega, NO significa que el correo realmente llegará al destino previsto.

Esto es importante de notar porque:

  • Si recibe un valor de retorno FALSE , sabe que el error radica en que su servidor acepta su correo. Esto 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 valor de retorno TRUE , no significa que su correo electrónico definitivamente será enviado. Simplemente significa que el correo electrónico fue enviado con éxito a su controlador respectivo en el servidor por PHP. Todavía hay más puntos de falla fuera del control de PHP que pueden hacer que el correo electrónico no se envíe.

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

Asegúrate de que tu proveedor de alojamiento te permita enviar correos electrónicos y no limite el envío de correo

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

Si cree que su anfitrión tiene límites de envío de correo electrónico o bloquea el envío de correos electrónicos,consulte sus preguntas frecuentes para ver si enumeran alguna de esas limitaciones.De lo contrario,es posible que necesite contactar con su soporte para verificar si hay alguna restricción en el envío de correos electrónicos.

Revisa las carpetas de spam;evita que los correos electrónicos se marquen como spam

A menudo,por varias 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 spam de un destinatario.Siempre comprueba allí antes de solucionar los problemas de tu 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 otro modo, para minimizar las posibilidades de que sus correos electrónicos se marquen como correo no deseado. Los buenos consejos de Michiel de Mare incluyen:

  • Use 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 pertenecen juntos, 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 utiliza para enviar el correo.
  • Asegúrese de que la dirección IP que está utilizando no esté en una lista negra
  • Asegúrate de que la dirección de respuesta es una dirección válida y existente.
  • Utilice el nombre completo y real del destinatario en el campo Para, no solo la dirección de correo electrónico (por ejemplo, "John Smith" <[email protected]> ).
  • Supervise sus cuentas de abuso,como [email protected] y [email protected] significa-asegurarse de que estas cuentas existen,leer lo que se les envía,y actuar sobre las denuncias.
  • Finalmente, haga que sea muy fácil darse de baja. 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 correo no deseado? para más sobre este tema

Asegúrate de que todas las cabeceras de correo sean suministradas

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úrate de que las cabeceras de los correos no tengan errores de sintaxis

Los encabezados invá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. Vuelva a verificar 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 use una imitación From: remitente

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

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

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

Asegúrate de que el valor del destinatario es 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 llamada a la función mail() :

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

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

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 su cuenta de correo electrónico proporcionada por el ISP).

Si los correos electrónicos llegan a todas o algunas de las otras cuentas de correo electrónico,usted 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 alguna razón.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úrate de que el código coincide con el método del formulario

Si ha configurado su método de formulario en POST , asegúrese de estar usando $_POST para buscar los valores de su formulario. Si lo configuró en GET o no lo configuró en absoluto, asegúrese de usar $_GET para buscar los valores de su formulario.

Asegúrese de que su valor de action formulario apunte a la ubicación correcta

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

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

Asegúrate de que el anfitrión de la web soporta el envío de correo electrónico

Algunos proveedores de hospedaje web no permiten ni permiten el envío de correos electrónicos a través de sus servidores.Las razones de ello pueden variar,pero si han desactivado el envío de correo,tendrá que 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 FAQ)debe aclarar si las capacidades de correo electrónico están disponibles en su servidor.

Asegúrese de que el servidor de correo localhost esté configurado

Si está desarrollando en su estación de trabajo local usando WAMP,MAMP o XAMPP,es probable que no tenga instalado un servidor de correo electrónico 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 usar el Mercury Mail gratuito.

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

Habilite el mail.log personalizado de PHP

Además del archivo de registro de su MTA y PHP, puede habilitar específicamente el registro de la función mail() . No registra la interacción SMTP completa, sino 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);

Ver http://php.net/manual/en/mail.configuration.php para más detalles. (Es mejor habilitar estas opciones en php.ini o .user.ini o .htaccess , tal vez).

Compruébelo con un servicio de prueba de correo

Hay varios servicios de entrega y verificación de spam que puede utilizar para probar la configuración de su MTAwebserver.Normalmente se envía una sonda de correo a:su dirección,y luego se obtiene un informe de entrega y más fallos concretos o análisis más tarde:

Usar un correo diferente

La función de mail() incorporada de PHP 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 puede ser combinado con un proveedor de servicios de servidores SMTP profesional.(Porque los típicos planes de hospedaje web compartido 0815 se aciertan o se pierden cuando se trata de la configuración del correo electrónico).




Answer 2 er.irfankhan11


Añade 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>';
}



Answer 3 sonam gupta


  1. Intenta siempre enviar las cabeceras en la función de correo.
  2. Si envías el correo a través de localhost,entonces haz la configuración SMTP para el envío de correo.
  3. Si está enviando correo a través de un servidor,compruebe que la función de envío de correo electrónico está activada en su servidor.



Answer 4 oneDerer


Si está utilizando una configuración SMTP para enviar su correo electrónico, intente usar 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 = "[email protected]"; // 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";
}



Answer 5 user1258544


Sólo añade algunos encabezados antes de enviar el 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 función mail() no funciona en localhost. Sube tu código a un servidor y pruébalo.