Функция wp_mail() не отправляет электронное письмо в режиме Ajax.

Вопрос или проблема

Когда я использую функцию wp_mail() или mail() в AJAX, эта функция не работает и не отправляет письмо.

Когда я использую эти функции просто в файле functions.php, они работают нормально.

Это не связано с функциями или действиями WordPress. Я проверил все, включая использование SMTP. SMTP работает так же, как и функция mail(), и не отправляет в режиме AJAX.

Вот содержимое моего файла functions.php:

add_action( 'phpmailer_init', 'wpse8170_phpmailer_init' );
function wpse8170_phpmailer_init( PHPMailer $phpmailer ) {
    $phpmailer->Host="godadysmtpsampledomain.secureserver.net";
    $phpmailer->Port = 465; // может быть другим
    $phpmailer->Username="[email protected]"; // если требуется
    $phpmailer->Password = '12345'; // если требуется
    $phpmailer->SMTPAuth = true; // если требуется
    $phpmailer->SMTPSecure="ssl"; // включите, если требуется, 'tls' - еще одно возможное значение

    $phpmailer->IsSMTP();

}
// Этот код работает нормально;
wp_mail("[email protected]", "test", "test");

Но другие коды или плагины в режиме AJAX, такие как Contact Form 7, не работают, это значит, что письмо не доставлено. Я проверил эти плагины, и wp_mail() возвращает true, но письмо не доставлено.

@T.Todua :

Хорошо, и когда я использую твой способ, письмо не доставляется. Оно не отправляет письмо в функции Ajax, и это именно моя проблема

add_action( 'wp_ajax_ABCABCABC', 'wpse8170_phpmailer_init' );
function wpse8170_phpmailer_init() { 

//оно не отправляет/доставляет в функции Ajax
wp_mail("[email protected]", "test", "test");

 }

Но когда я использую wp_mail() на странице постбэка, она работает нормально, например, когда я помещаю это в файл functions.php, оно отправляет/доставляет письмо:

//functions.php
//Оно отправляет в этом режиме
wp_mail("[email protected]", "test", "test");

Это моя проблема.

Слишком поздно, но возможно это поможет другим. Не рекомендую изменять данные SMTP в коде, потому что:

  • Данные подключения SMTP являются переменными. Если вы работаете на localhost, вероятно, вы хотите отправлять тестовые письма (например, используя mailcacher). С этим распространенным сценарием, у вас будет 2 данных SMTP, и это может быть запутанным при отправке файлов на рабочий сервер;
  • Не рекомендуется включать пароли в код по соображениям безопасности. Если вы работаете с многими людьми в проекте, это распространит ваш пароль;

Существует хорошее решение для изменения данных SMTP. Это легкий плагин Easy WP SMTP. С помощью этого плагина вы настраиваете ваши данные SMTP в базе данных WordPress.

Так как каждая среда имеет свою собственную базу данных (рабочий сервер, dev 1, dev 2 и т.д.), вы можете настроить данные SMTP в каждом WP админ, который вы используете.

На рабочем сервере установите реальные данные SMTP. На серверах разработки (localhost) вы можете установить ваши тестовые данные SMTP.

Попробуйте добавить заголовок:

$body = "<p>Тело письма</p>";
$subject = "Тема письма";
$headers = array('Content-Type: text/html; charset=UTF-8'); 
wp_mail( "Электронная почта пользователя тут", $subject, $body, $headers);

что это такое?

add_action( 'phpmailer_init', ...........

вы должны использовать:

add_action( 'wp_ajax_ABCABCABC', 'wpse8170_phpmailer_init' );
function wpse8170_phpmailer_init() { ....... }

и в вызове JAVASCRIPT делайте так:

<script type="text/javascript" >
jQuery(document).ready(function($) {

    var data = {
        'action': 'ABCABCABC',
        'whatever': 1234
    };

    jQuery.post(ajaxurl, data, function(response) {
        //alert('Ответ получен!! : ' + response);
    });
});
</script>

(источник).

Ответ или решение

Проблема, связанная с отправкой электронных писем с использованием функции wp_mail() в режиме AJAX в WordPress, может быть довольно сложно диагностируемой из-за многочисленных факторов, влияющих на процесс. Попробуем разобраться в конкретных аспектах, которые могут повлиять на работу wp_mail() в AJAX.

Теория

Когда вы используете AJAX в WordPress, запросы обрабатываются асинхронно, и это может создавать потенциальные проблемы, которые не возникают при обычной загрузке страниц. AJAX-запросы, как правило, имеют сокращённое время выполнения, другие параметры окружения и могут не получить некоторых значений из контекста, которые нормально доступны на странице.

Функция wp_mail() в WordPress является обёрткой для стандартной функции PHP mail(), и она использует библиотеку PHPMailer для отправки сообщения. В случае с AJAX встроенные функции обрабатываются сервером, однако они могут не успеть завершиться из-за особенностей маршрутизации и ограничений серверных настроек.

Пример

Вот корректный пример использования wp_mail() в AJAX-контексте с учётом некоторых замечаний и рекомендаций:

  1. Убедитесь, что AJAX-запрос правильно настроен:

    <script type="text/javascript">
    jQuery(document).ready(function($) {
       var data = {
           'action': 'send_custom_email',
           'email': '[email protected]',
           'subject': 'Тестовое письмо',
           'message': 'Это тестовое сообщение'
       };
    
       jQuery.post(ajaxurl, data, function(response) {
           // Обработка ответа
       });
    });
    </script>
  2. Настройка вашей функции PHP для обработки AJAX-запроса:

    add_action('wp_ajax_send_custom_email', 'send_custom_email');
    add_action('wp_ajax_nopriv_send_custom_email', 'send_custom_email');
    
    function send_custom_email() {
       $email = $_POST['email'];
       $subject = $_POST['subject'];
       $message = $_POST['message'];
    
       $headers = array('Content-Type: text/html; charset=UTF-8');
       $result = wp_mail($email, $subject, $message, $headers);
    
       echo $result ? 'Email отправлено' : 'Ошибка отправки Email';
       wp_die(); // всегда завершайте AJAX-функцию вызовом wp_die()
    }

Применение

Важно учесть несколько ключевых моментов:

  • Убедитесь, что AJAX-запрос передается полностью через соответствующие hooks. Использование wp_ajax_ и wp_ajax_nopriv_ гарантирует, что функции доступны и для авторизованных пользователей, и для гостей.

  • Проверьте настройки сервера и конфигурацию почты. Настройки SMTP, которые вы предоставляете, должны быть корректными и соответствовать используемому серверу. Если у вас возникают проблемы с настройкой SMTP, вам может помочь плагин для настройки SMTP через интерфейс WordPress, например, «Easy WP SMTP».

  • Безопасность данных: избегайте жестко закодированных учётных данных SMTP в коде; воспользуйтесь безопасным способом хранения таких данных, как использование конфигурационных файлов или плагинов для управления конфиденциальными данными.

Следуя данным рекомендациям, вы сможете исправить проблемы с отправкой писем в режиме AJAX, убедившись в корректной настройке и обработке данных.

Оцените материал
Добавить комментарий

Капча загружается...