<?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 index.html
pá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?
$from
Respuestas:
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 cuales su script parece no enviar correos electrónicos. Es difícil diagnosticar estas cosas a menos que haya un error de sintaxis obvio. Sin uno, debe revisar la lista de verificación a continuación para encontrar posibles dificultades 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 los errores en su código y los errores generales que PHP encuentra. 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 informe de errores.
Consulte ¿Cómo puedo obtener mensajes de error útiles en PHP? - esta respuesta para más detalles sobre esto.
Asegúrese de que la
mail()
función se llamePuede parecer tonto, pero un error común es olvidar colocar la
mail()
función en su código. Asegúrate de que esté allí y no comentado.Asegúrese de que la
mail()
función se llame correctamenteLa 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á.Verifique 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 preguntar al administrador del servidor dónde se encuentran), pero comúnmente 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.Verifique la falla de conexión del puerto
El bloqueo de puertos es un problema muy común que enfrentan la mayoría de los desarrolladores al integrar su código para entregar correos electrónicos utilizando 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 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 usando el puerto 2525. Si encuentra que ese puerto también está bloqueado, entonces la única solución es contactar a 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 de enviar correos electrónicos no deseados.
Use 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 use 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 usar este operador, pero el envío de correo no es una de ellas.Si su código contiene
@mail(...)
, puede estar ocultando mensajes de error importantes que lo ayudarán a depurar esto. Elimine@
y vea si se informa algún error.Solo es aconsejable cuando verifica
error_get_last()
inmediatamente después de fallas concretas.Verifique el
mail()
valor de retornoLa
mail()
función:Es importante tener en cuenta esto porque:
FALSE
valor de devolución, 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.TRUE
valor de devolución, no significa que su correo electrónico será enviado definitivamente. Simplemente significa que el correo electrónico fue enviado a su controlador respectivo en el servidor con éxito 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
FALSE
lo tanto, le ayudará a orientarlo en la dirección correcta,TRUE
aunque no necesariamente significa que su correo electrónico se haya enviado 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 correos
Muchos servidores 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 para limitar el envío de spammers de 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 dichas limitaciones. De lo contrario, es posible que deba comunicarse con su soporte para verificar si existen restricciones en el envío de correos electrónicos.
Verificar carpetas de spam; evitar 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 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 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:
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úrese de que se suministren todos los encabezados de correo
Algunos programas de spam rechazarán el correo si faltan encabezados comunes como "De" y "Responder a":
Asegúrese de que los encabezados de correo 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.
No use un
From:
remitente falsoSi bien el correo debe tener un remitente De, no solo puede usar cualquier valor. En particular, las direcciones de remitente divididas por el usuario son una forma segura de bloquear los correos:
Motivo: su servidor de correo web o de envío no está 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 remitente 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.
Otra forma de probar esto es codificar el valor del destinatario en la
mail()
llamada de función: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 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úrese de que el código coincida con el método del formulario
Si ha configurado su método de formulario en
POST
, asegúrese de que está utilizando$_POST
para buscar sus valores de formulario. Si lo configuróGET
o no lo configuró, asegúrese de usarlo$_GET
para buscar los valores de su formulario.Asegúrese de que el
action
valor de su formulario apunte a la ubicación correctaAsegúrese de que su
action
atributo de formulario contenga un valor que apunte a su código de correo PHP.Asegúrese de que el proveedor de alojamiento 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 para esto pueden variar, pero si han deshabilitado el envío de correo, deberá utilizar un método alternativo que utilice un tercero para enviarle esos correos electrónicos.
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
localhost
servidor de correo esté configuradoSi está desarrollando en su estación de trabajo local usando WAMP, MAMP o XAMPP, probablemente no esté 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.
Habilitar PHP personalizado
mail.log
Además del archivo de registro de su MTA y PHP, puede habilitar el registro de la
mail()
función específicamente. No registra la interacción SMTP completa, sino al menos los parámetros de llamada de función y el script de invocación.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
quizás).Consulte con un servicio de prueba de correo
Hay varios servicios de entrega y verificación de spam que puede utilizar para probar su configuración de 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 concretas o análisis posteriores:
Use un correo diferente
La
mail()
función 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 se puede combinar con un servidor profesional SMTP / proveedor de servicios. (Debido a que los típicos planes de alojamiento web compartido del 15/08 son impredecibles cuando se trata de la configuración / configuración del correo electrónico).
fuente
mail()
, hace un trabajo tan pobre y es más difícil de depurar que cualquier otra biblioteca de correoAgregue un encabezado de correo en la función de correo:
fuente
fuente
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:
fuente
Simplemente agregue algunos encabezados antes de enviar el correo:
Y una cosa más. La
mail()
función no funciona en localhost. Sube tu código a un servidor y pruébalo.fuente
$from = 'From: yoursite.com';
que no parece una dirección de correo electrónico válida completa, no hay una parte local. Reemplazó el encabezado From y agregó otros adicionales. O más bien lo$from
anterior es redundante en su ejemplo. Y estar malformado fue probablemente el problema original de los OP.Me funcionó en 000webhost haciendo lo siguiente:
Ingrese directamente la dirección de correo electrónico cuando envíe el correo electrónico:
Uso
''
y no""
.Este código funciona, pero el correo electrónico se recibió con un retraso de media hora.
fuente
En su mayoría, la
mail()
función está deshabilitada en el alojamiento compartido. Una mejor opción es usar SMTP. La mejor opción sería Gmail o SendGrid.SMTPconfig.php
SMTPmail.php
contact_email.php
fuente
Si solo usa la
mail()
función, debe completar el archivo de configuración.Debe abrir la expansión de correo y configurar el
SMTP smtp_port
etc., y lo más importante, su nombre de usuario y su contraseña. Sin eso, el correo no puede ser enviado. Además, puede usar laPHPMail
clase para enviar.fuente
Pruebe estas dos cosas por separado y juntas:
if($_POST['submit']){}
$from
(solo mi intestino)fuente
Creo que esto debería hacer el truco. Acabo de agregar una
if(isset
concatenación y agregué a las variables en el cuerpo para separar PHP de HTML.fuente
Para cualquiera que encuentre esto en el futuro, no recomendaría usarlo
mail
. Hay algunas respuestas que tocan esto, pero no el por qué .La
mail
función de PHP no solo es opaca, sino que depende completamente de cualquier MTA que use (es decir, Sendmail ) para hacer el trabajo.mail
será 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 se lo entregó. Como tal (como detalla 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
mail
. Abren un socket directamente al servidor de correo receptor y luego envían 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 utilicenmail
para enviar el correo en última instancia, pero le recomendaría 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 adivinan si un correo no se pudo enviar o por qué.
También obtienes el beneficio de una mejor interfaz. Con
mail
usted tiene que 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).fuente
fuente
Puede usar el correo electrónico de configuración de CodeIgniter . Por ejemplo, usando SMTP (forma simple):
¡Esto funciona para mi!
fuente
Prueba esto
fuente
Quizás el problema es 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, y lo único que debe tener en cuenta es tener habilitado el puerto SMTP (Puerto: 25 y 465).
fuente
Asegúrese de tener Sendmail instalado en su servidor.
Si ha verificado 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 lo siguiente:
si estás en un servidor Ubuntu
fuente
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 cuanto a la
$from
variable, eso debería provenir automáticamente de su servidor web si está utilizando el cPanel de Linux . Proviene automáticamente de su nombre de usuario y dirección IP de cPanel.También asegúrese de tener el orden correcto de las 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.fuente
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:
Consulte la documentación oficial para obtener más información sobre cómo usar SwiftMailer.
fuente
Para aquellos que no quieren usar correos externos y quieren enviar correo () en un servidor Linux dedicado.
La forma, cómo los correos PHP, se describe
php.ini
en la sección[mail function]
.El parámetro
sendmail-path
describe cómo se llama sendmail. El valor predeterminado essendmail -t -i
, por lo que si funcionasendmail -t -i < message.txt
en la consola de Linux, habrá terminado. También puede agregarmail.log
a la depuración y asegurarse de que realmente se llame 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 consendmail -v -t -i < message.txt
. El archivomessage.txt
debe contener todos los encabezados de un mensaje y un cuerpo, la dirección de destino del sobre se tomará delTo:
encabezado. Ejemplo: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 correos electrónicos autenticados 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 también recibir correo del sistema local a cuentas Unix (alertas a la raíz de trabajos cron, por ejemplo) configurar/etc/ssmtp/revaliases
archivo.Aquí está mi configuración para mi cuenta en el correo Yandex:
fuente
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 puñado pasó 6 horas solucionando problemas de un script de correo PHP que funcionaba 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 usar un cliente de correo alternativo, Pear está trabajando para nosotros. Tendrá que enviar a una cuenta de Gmail con una configuración de baja seguridad.
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.
fuente
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
.txt
archivo en una carpeta llamadamailoutput
.En el caso de que esté utilizando un servicio de manguera gratuito, como
000webhost
ohostinger
, esos proveedores de servicios deshabilitan elmail()
función para evitar usos no deseados de suplantación de correo electrónico, correo no deseado, 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 verificar 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) :
fuente
¡La instalación de Sendmail para Debian 10.0.0 ('Buster') fue de hecho trivial!
php.ini
Instalación estándar del paquete sendmail (que permite 'enviar'):
Comandos útiles diversos:
Verificación (de capacidad de enviar)
Lo anterior tomó alrededor de 5 minutos. Luego perdí 5 horas ... ¡No olvides revisar tu carpeta de spam !
fuente
Hay varias posibilidades:
Estás enfrentando un problema de servidor. El servidor no tiene ningún servidor de correo. Por lo tanto, su correo no funciona, porque su código está bien y el correo funciona con el tipo.
No está obteniendo el valor publicado. Pruebe su código con un valor estático.
Usar correos SMTP para enviar correos ...
fuente
Puede usar libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
fuente
mail()
contenedor de funciones. Solo agrega construcción de mensajes y algunos trucos.Puede ver sus errores al:
Y mi código de muestra es:
fuente
SMTPDebug = 0
no es útil Una "contraseña" simple tampoco funcionaría con GMail. Esta respuesta no contribuye mucho aquí.Siempre que su sistema sendmail funcione, su código debe modificarse de la siguiente manera:
Esto le permite enviar correos electrónicos basados en HTML.
De notable interés:
Nota: la
<<<EOB
sintaxis requiere que el último marcador EOB comience como el comienzo de la línea y no tenga espacio ni ningún carácter después del punto y coma.fuente