wp_mail() внутри обработчика AJAX никогда не возвращает

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

У нас есть обработчик AJAX, вызываемый с помощью jQuery.ajax(), который берет документ, хранящийся на сервере, и отправляет его пользователю по электронной почте. В конце есть вызов wp_mail следующим образом:

$status_wpmail = wp_mail($recipient, $subject, $body, $headers, $filename);

Проблема в том, что электронная почта никогда не отправляется, и любой код после вызова wp_mail никогда не обрабатывается, включая отладочный оператор для вывода значения $status_wpmail. Однако ответ jqXHR, отправленный на страницу, сообщает о ‘успехе’.

Я добавил отладочные операторы внутри обработчика для вывода сообщений в текстовый файл и подтвердил, что сообщения выводятся в файл вплоть до вызова wp_mail. Я также включил отладочные операторы по этой ссылке, но у меня не генерируются какие-либо отладочные журналы в wp-content.

Используя отдельный скрипт для проверки wp_mail с простым сообщением и вложением, я подтвердил, что wp_mail работает. Я также исключил mail() как источник проблемы, установив плагин WP Mail SMTP, но это поведение продолжает сохраняться.

Есть идеи?

ИЗМЕНЕНИЕ: Я решил обойти проблему, напрямую вызывая phpmailer и пропуская wp_mail. Сообщение успешно отправлено после этого. Все равно было бы неплохо узнать, почему wp_mail зависает таким образом.

Вы можете сделать простую отладку:

  1. Попробуйте: wp_mail('youremail@com', '123', '123'); // чтобы проверить, пройдет ли оно
  2. Если #1 не сработал, проверьте, правильно ли вы настроили SMTP // установите плагин smpt (wp smtp mail/easy wp smtp) и отправьте тестовое письмо
  3. Если вы не можете отправить тестовое письмо через плагин, проверьте, есть ли у вашей учетной записи электронной почты правильные права для отправки электронных писем от третьих лиц (например, yahoo mail требует “сгенерировать пароль приложения” и т. д.
    https://wpmailsmtp.com/docs/how-to-set-up-the-other-smtp-mailer-in-wp-mail-smtp/#secure-yahoo)
  4. Если вы используете правильный метод для настройки параметров вашей электронной почты, но письмо все равно не отправляется, проверьте, блокирует ли ваш веб-сервер порты 25,
    465 и 587 (попробуйте telnet к почтовому серверу с этими портами)

Моя проблема в том, что wp_mail блокирует опцию “Reply-To” в $headers сейчас; все работает нормально из моего AJAX-запроса, если опция “Reply-To” удалена из $headers. Не знаю, есть ли у вас такая же проблема.

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

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

1. Проверка базового функционала wp_mail()

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

$status_wpmail = wp_mail('youremail@example.com', 'Тестовое письмо', 'Это тестовое письмо.');

Если это срабатывает и письмо отправляется, то проблема, вероятно, связана с конфигурацией вашего AJAX обработчика.

2. Проверьте настройки SMTP

Если простой вызов wp_mail() не срабатывает, убедитесь, что настройки SMTP корректны:

  • Установите и активируйте плагин WP Mail SMTP или аналогичный.
  • Настройте его с правильными данными вашего SMTP-сервера (например, адрес, порт, учетные данные).
  • Попробуйте отправить тестовое письмо через интерфейс плагина.

3. Проверка прав на отправку писем

Убедитесь, что используемая вами учетная запись электронной почты имеет разрешение на отправку писем через сторонние приложения. Например, для Yahoo может потребоваться создание пароля приложения.

4. Проверьте блокировки на сервере

Иногда сервер может блокировать исходящие письма. Убедитесь, что порты (25, 465, 587) не заблокированы, попробуйте выполнить telnet к вашему SMTP-серверу с помощью этих портов:

telnet smtp.your-email-provider.com 25

Если соединение не устанавливается, то возможно, что ваш сервер блокирует исходящие подключения.

5. Исключение проблем с заголовками

Как вы уже заметили, определенные заголовки могут вызывать проблемы. Попробуйте упростить массив $headers:

$headers = array('Content-Type: text/html; charset=UTF-8');

Или временно уберите заголовок Reply-To, если он не критичен.

6. Использование отладчика

Вам также следует включить отладку в WordPress, используя файл wp-config.php. Убедитесь, что добавлены следующие строки:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Это поможет вам получать сообщения об ошибках в файле debug.log в директории wp-content.

7. Проверьте логи сервера

Если у вас есть доступ к журнальным файлам сервера (например, error_log), проверьте их на наличие ошибок, связанных с отправкой писем.

Заключение

Если после выполнения всех этих шагов проблема не решена, возможно, стоит рассмотреть возможность использования альтернативного подхода к отправке почты, как вы уже сделали, напрямую используя PHPMailer. Это может обеспечить большую гибкость и устранить ограничение, связанное с wp_mail().

Если у вас будут дополнительные вопросы или вам потребуется дальнейшая помощь, не стесняйтесь задавать их!

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

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