para - php mail not working
La función de correo PHP no completa el envío de correo electrónico. (24)
<?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 de PHP anterior. El código se envía perfectamente, pero nunca envía un correo electrónico. por favor ayuda.
- Siempre intente enviar encabezados en la función de correo.
- Si está enviando correo a través de localhost, realice la configuración smtp para enviar correo.
- 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 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 = "[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";
}
Añadir 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>'';
}
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 = ''[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 las variables en su función mail (). el mail($to,$subject,$message,etc.)
en ese orden, o bien existe la posibilidad de que no funcione. Déjeme saber si esto ayuda...
Creo que esto debería hacer el truco. Acabo de agregar un if(isset
y agregue concatenación 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>'';
}
}
?>
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)
Usa ''''
y no ""
Este código funciona pero el correo electrónico se recibió con un retraso de media hora.
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 depende completamente de cualquier MTA que use (es decir, 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 tuvo éxito 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 propiedadSMTPDebug
.Configure 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
, debe configurar todos sus encabezados, archivos adjuntos, etc. Con una biblioteca, tiene una función dedicada para hacerlo. También significa que la función está haciendo todas las partes difíciles (como los encabezados).
Principalmente la función de mail()
está deshabilitada en el alojamiento compartido. Una mejor opción es usar 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();
}
?>
Prueba esto
<?php
$to = "[email protected], [email protected]";
$subject = "HTML email";
$message = "
<html>
<head>
<title>HTML email</title>
</head>
<body>
<p>This email contains HTML Tags!</p>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
</tr>
</table>
</body>
</html>";
// 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: <[email protected]>'' . "/r/n";
$headers .= ''Cc: [email protected]'' . "/r/n";
mail($to,$subject,$message,$headers);
?>
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>
'';
}
}
Pruebe estos dos tragos por separado y juntos:
- eliminar el
if($_POST[''submit'']){}
- quitar
$from
(sólo mi instinto)
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'' => ''[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
}
¡Me funciona!
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.
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(''[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 usar SwiftMailer.
Solo agrega 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 está funcionando en localhost. Sube tu código a un servidor y prueba.
Tal vez 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 usar 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 = ''[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;
}
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 pueden aplicarse 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 obvio de sintaxis. 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 los informes de errores estén habilitados y configurados para reportar todos los errores
El informe de errores es esencial para eliminar los 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) habilitará el reporte de errores.
error_reporting(-1);
ini_set(''display_errors'', ''On'');
set_error_handler("var_dump");
Ver esta respuesta de desbordamiento de pila 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 intentos de enviar correos electrónicos a través de él. La ubicación de estos registros variará (es posible que deba preguntar al administrador de su servidor dónde se encuentran), 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 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 al que se enfrentan la mayoría de los desarrolladores al integrar su código para entregar 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 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, intente conectarse utilizando el puerto 2525. Si encuentra que el puerto también está bloqueado, entonces la única solución es comunicarse 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, cualquier mensaje de error que pueda generar esa expresión se ignorará. 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 fue aceptado para su 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 codificación, 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. 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 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 enumeran alguna de esas 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 programació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 otras, 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.
- Check 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á utilizando no esté en una lista negra
- Asegúrese de que la dirección de respuesta es una dirección válida y existente.
- Use 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]>
).- Controle sus cuentas de abuso, como [email protected] y [email protected]. Eso significa: asegúrese de que estas cuentas existen, 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 se cancelarán al presionar 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 programació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 programas de spam rechazarán el correo si 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 solo carácter incorrecto podría ser todo lo necesario para descarrilar tu 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
);
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 = ''[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 múltiples cuentas
Para ayudar a descartar problemas con las 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 establecido 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 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.
<form action="send_email.php" method="POST">
Asegúrese de que el servidor web admite el envío de correo electrónico
Algunos proveedores de alojamiento web no permiten o permiten 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. Normalmente, 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:
- mail-tester.com (gratis / simple)
- glockapps.com (gratis / $$$)
- senforensics.com (registro / $$$)
- mailtrap.io (pro / $$$)
- ultratools/…/emailTest (solo cheques gratuitos / MX)
- Varios: http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
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 características: SwiftMailer
- O incluso el más antiguo de 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).
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.
Para aquellos que no desean usar 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 ().
MTA diferente puede implementar sendmail
, solo hacen un enlace simbólico a sus archivos 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: [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 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 a 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:
[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
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 un script de correo de PHP.
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 usar 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.
Puede usar libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
include "libmail.php";
$m = new Mail(); // create the mail
$m->From( $_POST[''form''] );
$m->To( $_POST[''to''] );
$m->Subject( $_POST[''subject''] );
$m->Body( $_POST[''body''] );
$m->Cc( $_POST[''cc'']);
$m->Priority(4);
// attach a file of type image/gif to be displayed in the message if possible
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
$m->Send(); // send the mail
echo "Mail was sent:"
echo $m->Get(); // show the mail source
Puedes usar las funciones empty () y isset (). Si desea que funcione con archivos diferentes, solo modifique action=''yourphp.php''
el html que le estoy dando y store the PHP script
ese yourphp.php
archivo. También necesita cambiar su index.html
en index.php
para activar la funcionalidad de PHP.
PHP
<?php
error_reporting(0);
$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 (!(empty($_POST[''name'']))) {
if (!(empty($_POST[''email'']))){
if (!(empty($_POST[''message'']))){
mail ($to, $subject, $body, $from);
echo ''<p>Your message has been sent!</p>'';
}else{
echo ''<p>Fill your message please.</p>'';}
}else {
echo ''<p>Fill your email please.</p>'';}
}else{
echo ''<p>Fill your name please.</p>'';}
}else{
echo ''<p>Fill the form.</p>'';}
?>
HTML
<html>
<form method="post" action="?">
<table>
<tr><td>Name</td><td><input type=''text'' name=''name'' id=''name''/></td></tr>
<tr><td>Email</td><td><input type=''text'' name=''email'' id=''email''/></td></tr>
<tr><td>Message</td><td><input type=''text'' name=''message'' id=''message''/></td></tr>
<tr><td></td><td><input type=''submit'' name=''submit'' id=''submit''/></td></tr>
</table>
</form>
</html>
¡Atentamente!
Si está ejecutando este código en un servidor local (es decir, su computadora para fines de desarrollo) no enviará el correo electrónico al destinatario. Lo que sucederá es que creará un .txt
archivo en una carpeta llamada mailoutput
.
En el caso de que esté utilizando un servicio de alojamiento gratuito como 000webhost
o hostinger
, esos proveedores de servicios deshabilitan la mail()
función para evitar usos no deseados de falsificación de correos electrónicos, spam, etc. Prefiero que se comunique con ellos para ver si son compatibles con esta función.
Si está seguro de que el proveedor de servicios admite la función de correo (), puede consultar este manual de PHP para obtener más información, correo de PHP ()
Para verificar el clima, su servicio de alojamiento es compatible con 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);
?>
Espero que esto haya ayudado.
$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>";
}