wp_mail не отправляет письма

30 июн. 2016 г., 21:51:39
Просмотры: 15.4K
Голосов: 0

Я использовал плагин WP-Mail-SMTP для настройки почты в моей WordPress-установке. Проверил его работу, отправив письмо на свою личную почту.

Теперь пытаюсь отправить данные формы с помощью функции wp_mail()[WP].

Ниже приведен код:

<?php
if(isset($_POST["button_pressed"])){
// Проверка на пустые поля..
if($_POST["dname"]==""){
echo "Заполните все поля..";
}
else {
$email=$_POST['email'];
$message = $_POST['dname'];
$headers = 'From:' . "\r\n"; // Email отправителя
$headers .= 'Cc:' . "\r\n"; // Копия письма

// Строки сообщения не должны превышать 70 символов (правило PHP), поэтому делаем перенос
// $message = wordwrap($message, 70);    

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

echo "Ваше письмо успешно отправлено! Спасибо за обратную связь";
}
?>

HTML форма:

<form>
<div class="row">
<div class="form-group">
<div class="col-sm-6"><input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ СОБАКИ" id="dname" /></div>
<div class="col-sm-6"><input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ ВЛАДЕЛЬЦА" id="name" /></div>
</div>
</div>


<input type="submit" value="ОТПРАВИТЬ" />
<input type="hidden" name="button_pressed" value="1" />

</form>

Пробовал разные руководства, но ничего не помогло. Ваши комментарии и предложения будут очень полезны. Спасибо за уделенное время.

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

Работает ли вообще отправка писем на вашем сайте (для проверки можете попробовать сброс пароля через логин)? Если нет, то вам стоит обсудить это с вашим хостинг-провайдером.

Ismail Ismail
30 июн. 2016 г. 22:06:44

Я могу отправлять письма через почтовый клиент Roundcube в cpanel моего сайта. Он работает. Не работает только код выше на одной из моих страниц.

Rahul Bali Rahul Bali
30 июн. 2016 г. 22:34:55

Небольшой момент, > wp_mail("PRIVATE-EMAIL-ADDRESS" - вы отправляете на правильный email-адрес?

Ismail Ismail
30 июн. 2016 г. 22:36:20

да, это мой почтовый адрес. Я проверил его еще раз.

Rahul Bali Rahul Bali
30 июн. 2016 г. 22:44:00

Можете подсказать, куда мне нужно поместить PHP-код в WP? header.php? или page.php?

Rahul Bali Rahul Bali
30 июн. 2016 г. 22:55:10
Все ответы на вопрос 3
0

Поковырявшись несколько часов, я нашел проблему.

Оказалось, дело было в форме, а не в PHP.

<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ СОБАКИ" id="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ ВЛАДЕЛЬЦА" id="name" /></div>

Атрибут id нужно заменить на name.

Исправленная версия

<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ СОБАКИ" name="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ ВЛАДЕЛЬЦА" name="name" /></div>
</div>
30 июн. 2016 г. 23:12:05
0

ОЙ-ЁЙ. Здесь очень много ошибок.

  1. Вы должны обрабатывать данные $_POST, иначе могут произойти очень плохие вещи...

  2. Лучше использовать одинарные кавычки для строк в WordPress

  3. Отступы и пробелы не соответствуют лучшим практикам.

  4. Вы ничего не делаете с $_POST['name'] ???

  5. Вы вызываете $_POST["email"], но не передаете его через форму, что приведет к ошибкам неопределенной переменной (ИСПОЛЬЗУЙТЕ WP DEBUG !!! ВКЛЮЧИТЕ ЕГО)

  6. Важно проверять все значения $_POST, а не только одно, потому что кто-то может изменить форму или спамер может отправить письмо без заполнения всех полей, что снова приведет к ошибкам неопределенной переменной.

  7. У wp_mail должна быть точка с запятой в конце

  8. У вас отсутствует закрывающая скобка, PHP код не будет работать.

  9. Else не нужен

  10. Лучше использовать wp_die, если форма была изменена. Если вы не хотите плохого пользовательского опыта, просто используйте HTML-атрибут required в полях ввода.

  11. Нет необходимости в закрывающих div после полей ввода

  12. Лучше использовать CSS и нативный Bootstrap для обработки заглавных букв.

PHP код

<?php 

if ( isset( $_POST["button_pressed"] ) ) {
  // Проверка на пустые поля..
  if ( empty( $_POST['dname'] ) || empty( $_POST['name'] ) ) {
    wp_die( __( 'Пожалуйста, заполните все поля в следующий раз.', 'your-text-domain' ) );
  }
  $message  = sanitize_text_field( $_POST['dname'] );
  // $email    = sanitize_email( $_POST["email"] );
  $name     = sanitize_text_field( $_POST['name'] );
  $headers  = 'From:' . "\r\n"; // Email отправителя
  $headers .= 'Cc:' . "\r\n"; // Копия письма отправителю
  // Отправка письма
  wp_mail( 'PRIVATE-EMAIL-ADDRESS', $subject, $message, $headers );
  // Показать сообщение и скрыть форму
  _e( 'Ваше письмо успешно отправлено! Спасибо за обратную связь.', 'your-text-domain' ); 
  echo '<style>#contact-form{ display: none; }</style>';
}

?>

HTML разметка

<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( 'Введите имя собаки', 'your-text-domain' ); ?>" name="dname" required>
      <div class="col-sm-6">
        <input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Введите имя владельца', 'your-text-domain' ); ?>" name="name" required>
      </div>
    </div>
  </div>
  <input type="submit" value="ОТПРАВИТЬ" />
  <input type="hidden" name="button_pressed" value="1" />
</form>
1 июл. 2016 г. 10:34:09
1

Я проверил ваш код. Думаю, заголовок определен неправильно. Пожалуйста, проверьте код ниже:

$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       = "Имя : " . $name . "\n";
$message .= "Email : " . $email_address . "\n";
$message .= "Детали : " . $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 июн. 2016 г. 23:02:39
Комментарии

Работает ли этот код или нет?

Syed Fakhar Abbas Syed Fakhar Abbas
30 июн. 2016 г. 23:10:03