¿Cómo establecer la dirección del remitente según el email ingresado en el formulario para wp_mail()?

3 sept 2014, 12:07:52
Vistas: 41.7K
Votos: 5

Estoy tratando de crear un formulario y enviarlo a mi dirección de correo usando wp_mail. Mi código de wp_mail() es:

if($_POST["submit"]) {
    $to="mi email";
    $subject ="Mi asunto";     
    $sender=$_POST["sendername"];
    $senderEmail=$_POST["senderEmail"];
    $message=$_POST["message"];
    $name_title=$_POST["name_title"];   

    $mailBody = "<b><span style='color: red;'>Nombre:</span></b> $name_title $sender\n<br/>
                 <b>Email:</span></b> $senderEmail\n\n<br/><br/>
                 <b>Mensaje:</b> $message";

    $mail_sent = wp_mail( $to, $subject, $mailBody );
    }

y para cambiar la dirección del remitente he añadido los siguientes filtros en mi functions.php

/* añadiendo soporte para emails html*/
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
function wpse27856_set_content_type(){
    return "text/html";
}

/* dirección del remitente */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return $senderEmail;
}

/* nombre del remitente */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return $sender;
}

y el HTML del formulario es:

<form id="" name="" action="<?php echo get_permalink(); ?>" method="post">
<div class="form-input">
    <select name="name_title" class="name-title-input">
    <option value="" selected="selected">Seleccionar Título</option>
    <option value="Mr">Sr</option>
</div>
<div class="label-input-wrapper">
        <div class="form-label">Nombre</div><div class="form-input"><input type="text" name="sendername"/></div>
    </div>

    <div class="label-input-wrapper">
        <div class="form-label">E-Mail</div><div class="form-input"><input type="email" name="senderEmail" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" required /></div>
    </div>
    <input type="submit" value="Enviar" name="submit">
</form> 

No está enviando el formulario a mi email. Pero sí envía el formulario a mi email si cambio los filtros de la siguiente manera:

/* dirección del remitente */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return "mi@email.com";
}

/* nombre del remitente */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return "mi nombre";
}

Entonces, ¿cómo puedo hacer posible obtener el email del remitente en el encabezado from?

3
Comentarios

Parece un problema con el alcance de tus variables, revisa por ejemplo esta página de documentación de PHP. PS: ¡No veo ninguna validación/saneamiento en tu ejemplo!

birgire birgire
3 sept 2014 12:17:42

Estoy revisando el código. Si todo está bien, pasaré a la parte de validación. Y no encuentro los errores de variables aquí...

Riffaz Starr Riffaz Starr
3 sept 2014 12:18:58

Creo que deberías usar WP_DEBUG mientras pruebas en tu instalación de desarrollo, pero tus variables $senderEmail y $sender no están definidas dentro de tus funciones, ya que estas variables están definidas en el alcance global.

birgire birgire
3 sept 2014 12:28:43
Todas las respuestas a la pregunta 2
2
21

Si te entiendo correctamente, estás teniendo problemas para configurar el remitente (from). La forma más fácil sería simplemente agregando el from en los encabezados del correo en la función wp_mail.

Aquí tienes un ejemplo de una de mis antiguas funciones simples para enviar correos que funciona:

function contact_send() {
    $title   = 'Nuevo mensaje recibido';
    $headers = array('From: '.$_POST['full_name'].' <'.$_POST['email_address'].'>');
    $message = '<h1>Mi mensaje</h1>';

    // Enviar el correo
    add_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));
    $email = wp_mail('mi_correo@email.com', $title, $message, $headers);
    remove_filter('wp_mail_content_type', 'set_html_content_type');

    return $email;
}

El hook wp_mail_from proporciona el correo que ya has configurado en tu función wp_mail, no has configurado uno por lo que estaba recibiendo vacío y devolviendo una variable vacía ($senderEmail no estaba definido por lo que retornaría undefined).

3 sept 2014 12:19:23
Comentarios

Wow... eso es genial hombre... esta línea me salvó.. $headers = array('From: '.$_POST['sendername'].' <'.$_POST['senderEmail'].'>'); y eliminé los filtros wp_mail_from y wp_mail_from_name Ahora obtengo exactamente el nombre del remitente y su correo electrónico en el encabezado del correo..

Riffaz Starr Riffaz Starr
3 sept 2014 12:30:43

Siempre solía hacer esto, pero ya no es una buena idea. Te marcan como spam cuando envías correos desde direcciones si no estás explícitamente autorizado. Así que comencé a enviar desde una dirección del sitio y configurar un encabezado Replyto: en lugar de From:

Brian Page Brian Page
17 may 2023 13:38:32
2

Para filtrar la dirección de correo electrónico:

add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name ) {
    return "Mi Nombre";
}

Ahora añade un filtro para el nombre de la dirección de correo:

add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email ) {
    return "cambia-esto-por-tu-direccion-de-correo";
}

en tu archivo function.php.

21 feb 2017 10:44:38
Comentarios

Por favor, [edita] tu respuesta y agrega una explicación: ¿por qué eso podría resolver el problema? Ten en cuenta que el OP quería usar una variable específica en estas funciones.

fuxia fuxia
21 feb 2017 11:07:00

¡Funcionó para mí! Gracias. Solo me gustaría agregar que function.php. se encuentra en el directorio de tu tema bajo /wp-content/themes/

Shady Mohamed Sherif Shady Mohamed Sherif
14 abr 2017 08:07:10