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

<?php $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $from = 'From: yoursite.com'; $to = 'contact@yoursite.com'; $subject = 'Customer Inquiry'; $body = "From: $name\n E-Mail: $email\n Message:\n $message"; if ($_POST['submit']) { if (mail ($to, $subject, $body, $from)) { echo '

Your message has been sent!

'; } else { echo '

Something went wrong, go back and try again!

'; } } ?>

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. por favor ayuda.

Aunque hay partes de esta respuesta que se aplican solo al uso de la función mail() sí misma, 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 su secuencia de comandos parece no estar enviando correos electrónicos. Es difícil diagnosticar estas cosas a menos que haya un error de syntax obvio. Sin uno, debe pasar por la lista de verificación a continuación para encontrar cualquier trampa potencial que pueda encontrar.

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

El informe de errores es esencial para eliminar errores en su código y los errores generales que encuentra PHP. El informe de errores debe estar habilitado 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) permitirá el reporte de errores.

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

Ver esta respuesta de desbordamiento de stack para más detalles sobre esto.

Asegúrate de que la función mail() es llamada

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

Asegúrate de que la función mail() sea ​​llamada correctamente

bool mail (string $ a, 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 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á.

Compruebe los registros de correo del servidor

Su servidor web debe estar registrando todos los bashs de enviar correos electrónicos a través de él. La ubicación de estos registros variará (es posible que tenga que preguntarle al administrador del servidor dónde están ubicados), pero generalmente se pueden encontrar en el directorio raíz de un usuario debajo de los logs . Dentro habrá mensajes de error que el servidor informó, si los hubiera, relacionados con sus bashs de enviar correos electrónicos.

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

El locking 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 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 locking ha sido hecho a propósito por 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 descubre que ese puerto también está bloqueado, entonces 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.

Use los puertos 25 o 587 para conexiones planas / TLS y el puerto 465 para conexiones SSL. Para la mayoría de los usuarios, se sugiere usar 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 uno de ellos.

Si su código contiene @mail(...) , es posible que esté ocultando mensajes de error importantes que lo ayudarán a solucionar este problema. Retire la @ y ver si se informa de algún error.

Solo es recomendable cuando se comprueba con error_get_last() justo después para error_get_last() fallas concretas.

Compruebe el valor de retorno de mail()

La función de mail() :

Devuelve TRUE si el correo se aceptó con éxito para la entrega, FALSE contrario. Es importante tener en cuenta que solo porque el correo haya sido aceptado para la entrega, NO significa que el correo realmente llegue al destino deseado.

Esto es importante tener en cuenta porque:

  • Si recibe un valor de retorno FALSE , sabe que el error está en que su servidor acepte su correo. Probablemente esto no sea un problema de encoding, sino un problema de configuración del servidor. Debe hablar con el administrador de su sistema para averiguar por qué sucede esto.
  • Si recibe un valor de retorno TRUE , no significa que su correo electrónico será enviado definitivamente. Simplemente significa que el correo electrónico fue enviado con éxito a su respectivo controlador en el servidor por PHP. Aún hay más puntos de error fuera del control de PHP que pueden hacer que el correo electrónico no se envíe.

Por lo tanto, FALSE lo ayudará a orientarse en la dirección correcta, mientras que TRUE no significa necesariamente que su correo electrónico se envió con éxito. ¡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 correos.

Muchos sitios web compartidos, especialmente los proveedores de alojamiento web gratuitos, no permiten el envío de 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 para evitar que los spammers aprovechen sus servicios más baratos.

Si cree que su host tiene límites de correo electrónico o bloquea el envío de correos electrónicos, consulte sus Preguntas frecuentes para ver si enumera tales limitaciones. De lo contrario, es posible que deba comunicarse con su soporte para verificar si existen restricciones en relación con el envío de correos electrónicos.

Revisar las carpetas de spam; evitar que los correos electrónicos sean marcados como spam

A menudo, por diversas razones, los correos electrónicos enviados a través de PHP (y otros lenguajes de progtwigción del lado del servidor) terminan en la carpeta de correo no deseado del destinatario. Siempre verifique allí antes de solucionar 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 en otros, para minimizar las posibilidades de que sus correos electrónicos estén marcados 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 apunta al nombre de dominio que usa para enviar correo.
  • Asegúrese de que la dirección IP que está usando no esté en una lista negra
  • Asegúrese 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" ).
  • Controle sus cuentas de abuso, como abuse@yourdomain.com y postmaster@yourdomain.com. Eso significa: asegúrese de que existan estas cuentas, lea lo que se les envía y actúe sobre las quejas.
  • Por último, hazlo realmente fácil de cancelar la suscripción. De lo contrario, sus usuarios cancelarán la suscripción presionando el botón de correo no deseado , y eso afectará su reputación.

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

Asegúrese de que todos los encabezados de correo son suministrados

Algunos progtwigs de spam rechazarán el correo si faltan encabezados comunes como “De” y “Responder a:”

 $headers = array("From: from@example.com", "Reply-To: replyto@example.com", "X-Mailer: PHP/" . PHP_VERSION ); $headers = implode("\r\n", $headers); mail($to, $subject, $message, $headers); 

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

Los encabezados no válidos son tan malos como no tener encabezados. Un solo carácter incorrecto podría ser todo lo necesario para descarrilar su correo electrónico. Vuelva a verificar para asegurarse de que su syntax sea correcta, ya que PHP no detectará estos errores por usted.

 $headers = array("From from@example.com", // missing colon "Reply To: replyto@example.com", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes ); 

Asegúrese 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 = 'user@example.com'; // 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('user@example.com', $subject, $message, $headers); 

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

Enviar a múltiples cuentas

Para ayudar a descartar problemas de cuentas 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 provista por el 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 de formulario

Si ha configurado el 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 el valor de su action formulario apunta 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.

 

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

Algunos proveedores de alojamiento web no permiten o habilitan el envío de correos electrónicos a través de sus servidores. Las razones para esto pueden variar, pero si han deshabilitado el envío de correo, deberá utilizar un método alternativo que utiliza 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) 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 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.

Puedes superar esto instalando un servidor de correo básico. Para Windows puedes usar el Mercury Mail gratis.

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

Habilitar mail.log personalizado de mail.log

Además del archivo de registro de su MTA y PHP, puede habilitar el registro para la función de mail() 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); 

Vea 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).

Consulte con un servicio de prueba de correo.

Hay varios servicios de comprobación de envío y correo no deseado que puede utilizar para probar la configuración de su MTA / servidor web. 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 adelante:

Use un correo diferente

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

  • El más popular es: PHPMailer
  • Igualmente con funciones : SwiftMailer
  • O incluso el antiguo PEAR :: Mail .

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

Añadir encabezado de correo en la función de correo

 $header = "From: noreply@example.com\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 '

Your mail has been sent!

'; } else { echo '

Something went wrong, Please try again!

'; }
  1. Siempre intente enviar encabezados en la función de correo.
  2. Si está enviando correo a través de localhost, realice la configuración de smtp para enviar correo.
  3. Si está enviando correo a través del servidor, verifique que la función de envío de correo electrónico esté habilitada en su servidor.

¿Está utilizando la 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 . He creado mi correo electrónico 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 = "me@walalang.com"; $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. 

"; echo "Mailer Error: " . $mail->ErrorInfo; exit; } echo "Message has been sent"; }

Solo agrega algunos encabezados antes de enviar el correo:

  

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

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

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

 mail('email@gmail.com', $subject, $message, $headers) 

Usa '' y no ""

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

Principalmente la función de mail() está deshabilitada en alojamiento compartido Una mejor opción es usar SMTP. La mejor opción sería Gmail o SendGrid.


SMTPconfig.php

  

SMTPmail.php

 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

 '.$_POST['message']; $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body); $SMTPChat = $SMTPMail->SendMail(); } ?> 

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

SMTP smtp_port abrir la expansión de correo, configurar SMTP smtp_port y así sucesivamente, y lo más importante, su nombre de usuario y su contraseña. Sin eso, el correo no puede ser enviado. Además, puedes usar la clase PHPMail para enviar.

Pruebe estos dos gulps por separado y juntos:

  1. eliminar el if($_POST['submit']){}
  2. quitar $from (sólo mi instinto)

Para cualquier persona que encuentre esto en el futuro, no recomendaría usar el mail . Hay algunas respuestas que tocan esto, pero no el por qué de esto.

La función de mail de PHP no solo es opaca, sino que se basa completamente en cualquier MTA que use (es decir, en Sendmail) para hacer el trabajo. mail SOLAMENTE le dirá si el MTA no lo aceptó (es decir, Sendmail estaba inactivo cuando intentó enviarlo). No puede decirle si el correo fue exitoso porque se lo entregó. Como tal (como los detalles de la respuesta de John Conde), ahora puedes jugar con los registros de la MTA y esperar que te 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 de vainilla para Linux lo maneja de esta manera.

Una biblioteca de correo ( PHPMailer , Zend Framework 2+, etc.) hace algo muy diferente al mail . Lo que hacen es abrir un socket directamente al servidor de correo receptor y luego enviar los comandos de correo SMTP directamente a través de ese socket. En otras palabras, la clase actúa como su propio MTA (tenga en cuenta que puede indicar a las bibliotecas que utilicen el mail para enviar el correo en última instancia, pero le recomiendo que no lo haga).

Lo que esto significa para usted es que luego 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 pudo enviar o por qué.

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

Establezca esta opción incluyendo una línea como esta en su script:

 $mail->SMTPDebug = 2; 

También obtienes el beneficio de una mejor interfaz. Con el mail tiene 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 difíciles (como los encabezados).

Creo que esto debería hacer el truco. Acabo de agregar un if(isset y if(isset concatenación a las variables en el cuerpo para separar PHP de HTML.

 Your message has been sent!

'; } else { echo '

Something went wrong, go back and try again!

'; } } ?>

Puede usar la configuración de correo electrónico por codeigniter, ejemplo usando smtp (de manera simple):

 $config = Array( 'protocol' => 'smtp', 'smtp_host' => 'mail.domain.com', //your smtp host 'smtp_port' => 26, //default port smtp 'smtp_user' => 'name@domain.com', 'smtp_pass' => 'password', 'mailtype' => 'html', 'charset' => 'iso-8859-1', 'wordwrap' => TRUE ); $message = 'Your msg'; $this->load->library('email', $config); $this->email->from('name@domain.com', 'Title'); $this->email->to('emaildestination@domain.com'); $this->email->subject('Header'); $this->email->message($message); if($this->email->send()) { //conditional true } 

¡Funciona para mí!

 $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 = '
Hello ,
' . '

' . 'Name:' .$name.'
' . 'Email:' .$email.'
' . '
' . '
'; $sendmessage = "
" . $template . "
"; // 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 "* invalid email *"; }

Prueba esto

   HTML email   

This email contains HTML Tags!

Firstname Lastname
John Doe
"; // Always set content-type when sending HTML email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; // More headers $headers .= 'From: ' . "\r\n"; $headers .= 'Cc: myboss@example.com' . "\r\n"; mail($to,$subject,$message,$headers); ?>

Prueba esto

 if ($_POST['submit']) { $success= mail($to, $subject, $body, $from); if($success) { echo ' 

Your message has been sent!

'; } else { echo '

Something went wrong, go back and try again!

'; } }

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

Usualmente uso SwiftMailer cuando 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('jane.doe@gmail.com' => 'Jane Doe')) // The to address(es) ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens')) // Here, you put the content of your email ->setBody('

New message

Here goes the rest of my message

', '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 usar SwiftMailer.

Asegúrese de tener Sendmail instalado en su servidor.

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

Si está vacío, tendrá que hacer un:

 sudo apt-get install sendmail 

Si estás en un servidor Ubuntu.

Quizás el problema sea la configuración del servidor de correo, para evitar este tipo de problemas o no tiene que preocuparse por el problema del servidor de correo, le recomiendo que use PHPMailer , es un complemento que tiene todo lo necesario para enviar correo, el único Lo que hay que tener en cuenta es tener el puerto SMTP (Puerto: 25 y 465), habilitado

 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 = 'correo@gmail.com'; $mail->Password = 'contrasenia'; $mail->SMTPSecure = 'ssl'; $mail->Port = 465; //Recipients $mail->setFrom('correo@gmail.com', 'my name'); $mail->addAddress('destination@correo.com'); //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; } 

Para aquellos que no desean utilizar correos externos y desean enviar () en un servidor Linux dedicado.

La forma en que se envían los correos php se describe en php.ini en la sección [mail function] . El parámetro sendmail-path describe cómo se llama a sendmail. El valor predeterminado es sendmail -t -i , por lo que si trabaja sendmail -t -i < message.txt en la consola de Linux, habrá terminado. También puede agregar mail.log para depurar y asegurarse de que realmente se llame a mail ().

Diferentes MTA pueden implementar sendmail , solo hacen un enlace simbólico a sus binarios con ese nombre. Por ejemplo, en debian por defecto es postfix. Configure su MTA para enviar correo y pruébelo desde la consola con sendmail -v -t -i < message.txt . El archivo message.txt debe contener todos los encabezados de un mensaje y un cuerpo, la dirección de destino para el sobre se tomará del encabezado To: . Ejemplo:

 From: myapp@example.com To: mymail@example.com 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 un servidor local, también puede enviar correos electrónicos autenticados a través de su cuenta en un servicio de correo público. Instale ssmtp y edite config /etc/ssmtp/ssmtp.conf . Para poder también recibir correo del sistema local en cuentas de Unix (alertas a raíz de trabajos cron, por ejemplo), configure el /etc/ssmtp/revaliases .

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

 root=mymail@example.com mailhub=smtp.yandex.ru:465 FromLineOverride=YES UseTLS=YES AuthUser=abcde@yandex.ru AuthPass=password 

Ante todo,

Es posible que tenga muchos parámetros para la función mail () … Puede tener 5 max. mail(to,subject,message,headers,parameters); En lo que respecta a la variable $from , eso debería provenir automáticamente de su servidor web si utiliza Linux cPanel. 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 = 'contact@yoursite.com'; $subject = 'Customer Inquiry'; $body = "From: $name\n E-Mail: $email\n Message:\n $message"; 

También asegúrese de tener el orden correcto de las variables en su función mail (). el mail($to,$subject,$message,etc.) en ese orden, o existe la posibilidad de que no funcione. Déjeme saber si esto ayuda…

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

If you’re going to a university that runs XAMPP from http://www.AceITLab.com, you should know what our professor didn’t tell us: The AceITLab firewall (not the Windows firewall) blocks MercuryMail in XAMPP. You’ll have to use an alternative mail client, pear is working for us. You’ll have to send to a Gmail account with low security settings.

Yes, I know, this is totally useless for real world email. However, from what I’ve seen, academic settings and the real world often have precious little in common.

If you are running this code on a local server (ie your computer for development purposes) it wont send the email to the recipient. What will happen is, it will create a .txt file in a folder named mailoutput .

In the case if you are using a free hosing service like 000webhost or hostinger , those service providers disable the mail() function to prevent unintended uses of email spoofing, spamming etc. I prefer you to contact them to see whether they support this feature.

If you are sure that the service provider supports the mail() function, you can check this PHP manual for further reference, PHP mail()

To check weather your hosting service support the mail() function, try running this code, (Remember to change the recipient email address)

  

Hope this helped.

You can use libmail: http://sofes.miximages.com/php/toto.gif“, “image/gif”, “inline” ); $m->Send(); // send the mail echo “Mail was sent:” echo $m->Get(); // show the mail source

you can see your errors by

 error_reporting(E_ALL); 

and my sample code is

  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 = 'someone@gmail.com'; // SMTP username $mail->Password = 'password'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted $mail->From = 'someone@gmail.com'; $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'; ?>