Come impostare l'indirizzo del mittente in base all'email inserita nel form per wp_mail()?

3 set 2014, 12:07:52
Visualizzazioni: 41.7K
Voti: 5

Sto cercando di creare un form e inviarlo al mio indirizzo email usando wp_mail. Il mio codice wp_mail() è:

if($_POST["submit"]) {
    $to="mia email";
    $subject ="Il mio oggetto";     
    $sender=$_POST["sendername"];
    $senderEmail=$_POST["senderEmail"];
    $message=$_POST["message"];
    $name_title=$_POST["name_title"];   

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

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

e per cambiare l'indirizzo del mittente ho aggiunto i seguenti filtri nel mio functions.php

/* aggiunta del supporto per email HTML */
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
function wpse27856_set_content_type(){
    return "text/html";
}

/* indirizzo mittente */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return $senderEmail;
}

/* nome mittente */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return $sender;
}

e l'HTML del form è:

<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">Seleziona Titolo</option>
    <option value="Sig">Sig</option>
</div>
<div class="label-input-wrapper">
        <div class="form-label">Nome</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="Invia" name="submit">
</form>

Non invia l'email al mio indirizzo. Ma invia il form alla mia email se cambio i filtri nel seguente modo:

/* indirizzo mittente */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return "mia@email.com";
}

/* nome mittente */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return "mio nome";
}

Quindi come posso fare per ottenere l'email del mittente nell'intestazione from?

3
Commenti

Sembra un problema con lo scope delle tue variabili, dai un'occhiata ad esempio a questa pagina della documentazione PHP. PS: Non vedo alcuna validazione/sanitizzazione nel tuo esempio!

birgire birgire
3 set 2014 12:17:42

Sto controllando il codice. Se tutto ok passerò alla parte di validazione. E non trovo gli errori delle variabili qui...

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

Penso che dovresti usare WP_DEBUG durante i test nella tua installazione di sviluppo, ma le tue variabili $senderEmail e $sender non sono definite all'interno delle tue funzioni, dato che queste variabili sono definite nello scope globale.

birgire birgire
3 set 2014 12:28:43
Tutte le risposte alla domanda 2
2
21

Se ho capito bene, stai avendo difficoltà a impostare il mittente? Il modo più semplice sarebbe aggiungere il campo from negli intestazioni dell'email nella funzione wp_mail.

Ecco un esempio di una mia vecchia funzione semplice per l'invio di email che funziona:

function contact_send() {
    $title   = 'Nuovo messaggio ricevuto';
    $headers = array('From: '.$_POST['full_name'].' <'.$_POST['email_address'].'>');
    $message = '<h1>Il mio messaggio</h1>';

    //Invia l'email
    add_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));
    $email = wp_mail('mia_email@email.com', $title, $message, $headers);
    remove_filter('wp_mail_content_type', 'set_html_content_type');

    return $email;
}

L'hook wp_mail_from fornisce l'email che hai già impostato nella tua funzione wp_mail, non ne hai impostata una quindi riceveva vuoto e restituiva una variabile vuota ($senderEmail non era definita quindi restituiva undefined).

3 set 2014 12:19:23
Commenti

Woooh... fantastico amico... questa riga mi ha salvato.. $headers = array('From: '.$_POST['sendername'].' <'.$_POST['senderEmail'].'>'); e ho rimosso i filtri wp_mail_from e wp_mail_from_name Ora ottengo esattamente il nome del mittente e la sua email nell'intestazione della mail..

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

Facevo sempre così, ma non è più una buona idea. Vieni segnalato come spam se invii email da indirizzi per cui non sei esplicitamente autorizzato. Quindi ho iniziato a inviare da un indirizzo del sito e impostare un header Replyto: invece di From:

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

Per filtrare l'indirizzo email:

add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name ) {
    return "Il Mio Nome";
}

Ora aggiungi un filtro per il nome dell'indirizzo email:

add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email ) {
    return "cambia-con-il-tuo-indirizzo-email";
}

nel tuo file function.php.

21 feb 2017 10:44:38
Commenti

Per favore [modifica] la tua risposta, e aggiungi una spiegazione: perché potrebbe risolvere il problema? Nota che l'OP voleva usare una specifica variabile in queste funzioni.

fuxia fuxia
21 feb 2017 11:07:00

ha funzionato per me! grazie. Vorrei solo aggiungere che function.php si trova nella directory del tuo tema sotto /wp-content/themes/

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