Cum să setezi adresa expeditorului conform adresei de email introduse în formular pentru wp_mail()?

3 sept. 2014, 12:07:52
Vizualizări: 41.7K
Voturi: 5

Încerc să creez un formular și să-l trimit la adresa mea de email folosind wp_mail. Codul meu wp_mail() este:

if($_POST["submit"]) {
    $to="emailul meu";
    $subject ="Subiectul meu";     
    $sender=$_POST["sendername"];
    $senderEmail=$_POST["senderEmail"];
    $message=$_POST["message"];
    $name_title=$_POST["name_title"];   

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

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

iar pentru schimbarea adresei expeditorului am adăugat următoarele filtre în functions.php

/* adăugare suport pentru emailuri html*/
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
function wpse27856_set_content_type(){
    return "text/html";
}

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

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

iar HTML-ul formularului este:

<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">Selectează titlu</option>
    <option value="Mr">Dl</option>
</div>
<div class="label-input-wrapper">
        <div class="form-label">Nume</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="Trimite" name="submit">
</form> 

Nu trimite formularul la emailul meu. Dar trimite formularul la emailul meu dacă schimb filtrele astfel:

/* adresa expeditor */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return "email@meu.com";
}

/* numele expeditorului */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return "numele meu";
}

Deci cum pot face posibil să preiau emailul expeditorului în antetul from?

3
Comentarii

Se pare că este o problemă cu scope-ul variabilelor tale, verifică de exemplu această pagină de documentație PHP. PS: Nu văd nicio validare/sanitizare în exemplul tău!

birgire birgire
3 sept. 2014 12:17:42

Verific codul. Dacă totul este în regulă, voi trece la partea de validare. Și nu găsesc erorile de variabile aici...

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

Cred că ar trebui să folosești WP_DEBUG în timpul testării pe instalarea ta de dezvoltare, dar variabilele tale $senderEmail și $sender nu sunt definite în interiorul funcțiilor tale, deoarece aceste variabile sunt definite în scope-ul global.

birgire birgire
3 sept. 2014 12:28:43
Toate răspunsurile la întrebare 2
2
21

Dacă te înțeleg corect, ai dificultăți în a seta expeditorul (from)? Cea mai ușoară metodă ar fi să adaugi from în anteturile emailului în funcția wp_mail.

Iată un exemplu dintr-una din vechile mele funcții simple de trimitere a email-urilor care funcționează:

function contact_send() {
    $title   = 'Mesaj nou primit';
    $headers = array('From: '.$_POST['full_name'].' <'.$_POST['email_address'].'>');
    $message = '<h1>Mesajul meu</h1>';

    // Trimite email-ul
    add_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));
    $email = wp_mail('emailul_meu@email.com', $title, $message, $headers);
    remove_filter('wp_mail_content_type', 'set_html_content_type');

    return $email;
}

Cârligul wp_mail_from furnizează adresa de email pe care ai setat-o deja în funcția ta wp_mail, tu nu ai setat una, așa că primea gol și returna o variabilă goală ($senderEmail nu era definită, deci returna nedefinit).

3 sept. 2014 12:19:23
Comentarii

Uau... asta e grozav omule... această linie m-a salvat.. $headers = array('From: '.$_POST['sendername'].' <'.$_POST['senderEmail'].'>'); și am eliminat filtrul wp_mail_from și wp_mail_from_name Acum primesc exact numele expeditorului și adresa de email a expeditorului în antetul mailului..

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

Întotdeauna am făcut asta, dar nu mai este o idee bună. Ești marcat ca spam dacă trimiți emailuri de la adrese pentru care nu ești explicit autorizat. Așa că am început să trimit de la o adresă a site-ului și să setez un antet Replyto: în loc de From:

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

Pentru filtrarea adresei de email:

add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name ) {
    return "Numele Meu";
}

Acum adăugați un filtru pentru numele adresei de email:

add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email ) {
    return "schimbati-asta-cu-adresa-dvs-de-email";
}

în fișierul vostru function.php.

21 feb. 2017 10:44:38
Comentarii

Te rog [editează] răspunsul tău și adaugă o explicație: de ce ar putea rezolva problema? Reține că OP dorea să folosească o anumită variabilă în aceste funcții.

fuxia fuxia
21 feb. 2017 11:07:00

a funcționat pentru mine! mulțumesc. Aș dori doar să adaug că function.php. se găsește în directorul temei tale sub /wp-content/themes/

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