Как установить адрес отправителя в соответствии с email-адресом из формы для wp_mail()?

3 сент. 2014 г., 12:07:52
Просмотры: 41.7K
Голосов: 5

Я пытаюсь создать форму и отправить её на свой email-адрес, используя wp_mail. Мой код wp_mail() выглядит так:

if($_POST["submit"]) {
    $to="мой email";
    $subject ="Моя тема";     
    $sender=$_POST["sendername"];
    $senderEmail=$_POST["senderEmail"];
    $message=$_POST["message"];
    $name_title=$_POST["name_title"];   

    $mailBody = "<b><span style='color: red;'>Имя:</span></b> $name_title $sender\n<br/>
                 <b>Email:</span></b> $senderEmail\n\n<br/><br/>
                 <b>Сообщение:</b> $message";

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

А для изменения адреса отправителя я добавил следующие фильтры в файл functions.php

/* добавление поддержки html писем */
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
function wpse27856_set_content_type(){
    return "text/html";
}

/* адрес отправителя */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return $senderEmail;
}

/* имя отправителя */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return $sender;
}

А HTML формы выглядит так:

<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">Выберите обращение</option>
    <option value="Mr">Господин</option>
</div>
<div class="label-input-wrapper">
        <div class="form-label">Имя</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="Отправить" name="submit">
</form> 

Форма не отправляет письмо на мой email. Но она отправляет форму на мой email, если я изменяю фильтры следующим образом:

/* адрес отправителя */
add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email )
{
    return "my@email.com";
}

/* имя отправителя */
add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name )
{
    return "мое имя";
}

Как можно сделать так, чтобы в заголовке отправителя использовался email отправителя из формы?

3
Комментарии

Похоже на проблему с областью видимости ваших переменных, проверьте, например, эту страницу документации PHP. PS: Я не вижу никакой валидации/санитизации в вашем примере!

birgire birgire
3 сент. 2014 г. 12:17:42

Я проверяю код. Если всё в порядке, перейду к части с валидацией. И я не нахожу здесь ошибок с переменными...

Riffaz Starr Riffaz Starr
3 сент. 2014 г. 12:18:58

Думаю, вам стоит использовать WP_DEBUG во время тестирования на вашей dev-установке, но ваши переменные $senderEmail и $sender не определены внутри ваших функций, так как эти переменные определены в глобальной области видимости.

birgire birgire
3 сент. 2014 г. 12:28:43
Все ответы на вопрос 2
2
21

Если я правильно вас понял, у вас возникают трудности с установкой поля from (отправитель)? Самый простой способ — просто добавить from в заголовки email в функции wp_mail.

Вот пример одной из моих старых простых функций отправки email, которая работает:

function contact_send() {
    $title   = 'Новое полученное сообщение';
    $headers = array('From: '.$_POST['full_name'].' <'.$_POST['email_address'].'>');
    $message = '<h1>Мое сообщение</h1>';

    // Отправляем email
    add_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));
    $email = wp_mail('my_email@email.com', $title, $message, $headers);
    remove_filter('wp_mail_content_type', 'set_html_content_type');

    return $email;
}

Хук wp_mail_from предоставляет email, который вы уже установили в вашей функции wp_mail. Если вы его не установили, то получали пустое значение и возвращалась пустая переменная (так как $senderEmail не был определен, возвращалось "undefined").

3 сент. 2014 г. 12:19:23
Комментарии

Ух ты... это отлично, чувак.. эта строка меня спасла.. $headers = array('From: '.$_POST['sendername'].' <'.$_POST['senderEmail'].'>'); и я убрал фильтры wp_mail_from и wp_mail_from_name Теперь я получаю точное имя отправителя и его email в заголовке письма..

Riffaz Starr Riffaz Starr
3 сент. 2014 г. 12:30:43

Я всегда так делал, но сейчас это уже не лучшая идея. Письма могут попадать в спам, если вы отправляете их с адресов, для которых не авторизованы. Поэтому я начал отправлять с адреса сайта и устанавливать заголовок Replyto: вместо From:

Brian Page Brian Page
17 мая 2023 г. 13:38:32
2

Для фильтрации адреса электронной почты:

add_filter( 'wp_mail_from_name', 'my_mail_from_name' );
function my_mail_from_name( $name ) {
    return "Мое Имя";
}

Теперь добавьте фильтр для имени адреса электронной почты:

add_filter( 'wp_mail_from', 'my_mail_from' );
function my_mail_from( $email ) {
    return "change-this-to-your-email-address";
}

в ваш файл function.php.

21 февр. 2017 г. 10:44:38
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему? Обратите внимание, что автор хотел использовать конкретную переменную в этих функциях.

fuxia fuxia
21 февр. 2017 г. 11:07:00

сработало у меня! спасибо. Хотел бы добавить, что файл function.php находится в директории вашей темы по пути /wp-content/themes/

Shady Mohamed Sherif Shady Mohamed Sherif
14 апр. 2017 г. 08:07:10