Вопрос или проблема
Когда я использую функцию 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-контексте с учётом некоторых замечаний и рекомендаций:
-
Убедитесь, что 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>
-
Настройка вашей функции 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, убедившись в корректной настройке и обработке данных.