wp_mail no envía correos electrónicos - Solución

30 jun 2016, 21:51:39
Vistas: 15.4K
Votos: 0

He utilizado WP-Mail-SMTP para configurar el servicio de correo en mi instalación de WordPress. He probado enviando correos a mi email personal.

Ahora estoy intentando enviar datos de un formulario usando la función wp_mail()[WP].

A continuación está el código.

<?php
if(isset($_POST["button_pressed"])){
// Verificando campos vacíos..
if($_POST["dname"]==""){
echo "Rellena todos los campos..";
}
else {
$email=$_POST['email'];
$message = $_POST['dname'];
$headers = 'From:' . "\r\n"; // Email del remitente
$headers .= 'Cc:' . "\r\n"; // Copia al remitente

// Las líneas del mensaje no deben exceder 70 caracteres (regla de PHP), así que lo dividimos
// $message = wordwrap($message, 70);    

wp_mail("PRIVATE-EMAIL-ADDRESS", $subject, $message, $headers)

echo "¡Tu correo ha sido enviado correctamente! Gracias por tu feedback";
}
?>

Formulario HTML

<form>
<div class="row">
<div class="form-group">
<div class="col-sm-6"><input class="form-control" type="text" placeholder="NOMBRE DEL PERRO" id="dname" /></div>
<div class="col-sm-6"><input class="form-control" type="text" placeholder="NOMBRE DEL DUEÑO" id="name" /></div>
</div>
</div>


<input type="submit" value="ENVIAR" />
<input type="hidden" name="button_pressed" value="1" />

</form>

He probado muchos tutoriales, pero ninguno me ha ayudado. Sus comentarios y sugerencias serán muy útiles para mí. Gracias por su tiempo.

5
Comentarios

¿El envío de correos en general está funcionando en tu sitio (para probar, puedes usar el restablecimiento de contraseña de inicio de sesión)? Si no es así, probablemente deberías hablar con tu proveedor de hosting sobre esto.

Ismail Ismail
30 jun 2016 22:06:44

Puedo enviar correos desde el cliente de correo Roundcube en el cpanel de mi sitio web. Funciona. Solo el código de arriba en una de mis páginas no está funcionando.

Rahul Bali Rahul Bali
30 jun 2016 22:34:55

Solo un pequeño detalle, > wp_mail("PRIVATE-EMAIL-ADDRESS" ¿estás enviando a la dirección de correo electrónico correcta?

Ismail Ismail
30 jun 2016 22:36:20

sí, es mi dirección de correo. Lo he verificado de nuevo.

Rahul Bali Rahul Bali
30 jun 2016 22:44:00

¿Puedes sugerir dónde necesito colocar el código PHP en WP? ¿header.php? ¿o page.php?

Rahul Bali Rahul Bali
30 jun 2016 22:55:10
Todas las respuestas a la pregunta 3
0

Después de jugar durante horas, encontré el problema.

Era el formulario, no el PHP.

<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL PERRO" id="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL DUEÑO" id="name" /></div>

El atributo id debe ser name.

Corregido

<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL PERRO" name="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL DUEÑO" name="name" /></div>
</div>
30 jun 2016 23:12:05
0

YIKESSSSSS. Hay muchas cosas mal aquí.

  1. Debes sanitizar los datos de $_POST o cosas muy muy malas pueden pasar...

  2. Es mejor usar comillas simples para cadenas en WordPress

  3. El espaciado y la indentación no siguen las mejores prácticas.

  4. ¿No estás haciendo nada con $_POST['name']?

  5. Estás llamando a $_POST["email"] pero no lo pasas a través del formulario de ejemplo, lo que resultará en errores de variable indefinida (¡¡¡USA WP_DEBUG !!! PONLO EN TRUE)

  6. Es importante verificar todos los valores de $_POST, no solo uno, porque alguien podría manipular el formulario o un spammer podría enviar un correo sin el formulario, lo que causaría errores de variable indefinida nuevamente.

  7. wp_mail debería tener un punto y coma al final

  8. Te falta un corchete de cierre, el PHP nunca funcionaría.

  9. El else no es necesario

  10. Es mejor usar wp_die si hay manipulación del formulario. Si no quieres mala experiencia de usuario, simplemente usa el atributo required HTML en los campos de entrada.

  11. No necesitas divs de cierre después de los campos de entrada

  12. Es mejor usar CSS y Bootstrap nativo para manejar las letras mayúsculas.

el php

<?php 

if ( isset( $_POST["button_pressed"] ) ) {
  // Verificando campos vacíos...
  if ( empty( $_POST['dname'] ) || empty( $_POST['name'] ) ) {
    wp_die( __( 'Por favor completa todos los campos la próxima vez.', 'your-text-domain' ) );
  }
  $message  = sanitize_text_field( $_POST['dname'] );
  // $email    = sanitize_email( $_POST["email"] );
  $name     = sanitize_text_field( $_POST['name'] );
  $headers  = 'From:' . "\r\n"; // Correo del remitente
  $headers .= 'Cc:' . "\r\n"; // Copia al remitente
  // Enviar correo
  wp_mail( 'PRIVATE-EMAIL-ADDRESS', $subject, $message, $headers );
  // Mostrar mensaje y ocultar el formulario
  _e( '¡Tu correo ha sido enviado con éxito! Gracias por tu feedback.', 'your-text-domain' ); 
  echo '<style>#contact-form{ display: none; }</style>';
}

?>

y el html markup

<form action="" id="contact-form" method="post">
  <div class="row">
    <div class="form-group">
      <div class="col-sm-6">
        <input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Ingresa el nombre del perro', 'your-text-domain' ); ?>" name="dname" required>
      <div class="col-sm-6">
        <input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Ingresa el nombre del dueño', 'your-text-domain' ); ?>" name="name" required>
      </div>
    </div>
  </div>
  <input type="submit" value="ENVIAR" />
  <input type="hidden" name="button_pressed" value="1" />
</form>
1 jul 2016 10:34:09
1

He revisado tu código. Creo que el encabezado no está definido correctamente. Por favor, revisa el código a continuación:

$current_user  = wp_get_current_user();
$name          = sanitize_text_field($_POST["name"]);
$email_address = sanitize_email($_POST["email_address"]);
$detail        = esc_textarea($_POST["detail"]);
$message       = "Nombre : " . $name . "\n";
$message .= "Dirección de correo : " . $email_address . "\n";
$message .= "Detalle : " . $detail . "\n";
$send_to = 'test@test.com';

$headers = 'From: ' . $current_user->user_firstname . ' ' . $current_user->user_lastname . ' <test@test.com>' . "\r\n";

if (wp_mail($send_to, $email_subject, $message, $headers)) {

  wp_redirect(admin_url('admin.php?page=contact-page&msg=success'));

  exit();
} else {

  wp_redirect(admin_url('admin.php?page=contact-page&msg=failed'));

  exit();
}
30 jun 2016 23:02:39
Comentarios

¿El código funciona o no?

Syed Fakhar Abbas Syed Fakhar Abbas
30 jun 2016 23:10:03