Вопрос или проблема
У меня конфигурация WordPress с поддержкой нескольких сайтов. Мой основной домен выглядит как http://www.example.com, с несколькими поддоменами, такими как http://test1.example.com, http://test2.example.com и так далее.
Я написал функцию в файле функций своей темы мультисайта для отправки уведомлений пользователям мультисайта.
$headers[] = 'Content-Type: text/html; charset=UTF-8';
wp_mail('[email protected]', 'Тест', 'Тест', $headers);
Письма отправляются как задумано, когда это осуществляется с основного домена, но не отправляются никакие письма, когда используются в файлах функций поддоменов.
Например, [email protected]
– зарегистрированный пользователь для http://test1.example.com, и он отправляет некоторую информацию на своей странице поддомена http://test1.example.com/information-form. Я хочу отправить эту информацию на электронную почту этого пользователя.
ИЗМЕНЕНИЕ: Сценарии:
- У меня есть форма, которая содержит некоторые поля ввода.
- Пользователи заполняют её, и при отправке, используя ajax, значения передаются в файл функций.
- В странице функций есть хук
add_action('wp_ajax_xxx', 'myFunction');
(Пользователь вошел в систему) - В
myFunction
находится вышеупомянутый код.
Наконец, я разобрался в причинах и решении своей проблемы выше.
Когда я отправляю электронное письмо в поддомен, такой как http://test1.example.com, без пользовательского “От” адреса в заголовке, функция wp_mail()
сама устанавливает адрес “От” по умолчанию как [email protected]
. Это недопустимо, поэтому электронное письмо не было отправлено.
Чтобы решить эту проблему, я добавил пользовательский адрес электронной почты “От” в заголовок следующим образом:
$headers[] = 'From: Имя Отправителя <[email protected]>';
Это устанавливает допустимый адрес электронной почты в заголовке.
Вы также можете установить то же самое, используя фильтры следующим образом:
add_filter('wp_mail_from', function( $email ) {
return '[email protected]';
});
add_filter('wp_mail_from_name', function( $name ) {
return 'Имя Отправителя';
});
Ответ или решение
Проблема с отправкой электронной почты в multisite поддоменах при использовании wp_mail()
В рамках вашего многосайтового WordPress-конфигурации может возникнуть проблема, когда функция wp_mail()
не отправляет электронные письма, особенно когда вызов этой функции осуществляется из поддоменов. Рассмотрим детально возможные причины и решения данной проблемы, основываясь на предоставленном описании.
Проблема
Вы настроили свой WordPress на работу с несколькими сайтами, включая главную доменную часть и поддомены. При использовании функции wp_mail()
для отправки уведомлений на электронную почту зарегистрированных пользователей поддоменов возникла ситуация, когда письма успешно отправляются с главного домена, но не отправляются из функции на поддоменах. Причиной этого обычно является неправильная настройка заголовков электронной почты.
Причины
По умолчанию, если не задать специальный заголовок "От", WordPress сам генерирует адрес электронной почты для отправителя. Обычно он берёт адрес, указанный в настройках сайта (например, no-reply@example.com
). Если этот адрес недействителен или неправильно настроен, письма могут не отправляться вовсе или попадать в спам.
В вашем случае, вероятно, для поддомена test1.example.com
установлен некорректный адрес отправителя, что и является причиной, по которой письма не доходят до получателей.
Решение
Чтобы исправить ситуацию, вам необходимо явно указать правильный заголовок "От" для отправляемого письма. Это может быть сделано как непосредственно в коде функции, так и с помощью фильтров WordPress.
Пример кода с явным указанием заголовка "От":
$headers = [];
$headers[] = 'From: Имя Отправителя <noreply@example.com>';
$headers[] = 'Content-Type: text/html; charset=UTF-8';
wp_mail('user@example.com', 'Тест', 'Тестовое сообщение', $headers);
В данном коде мы задаем заголовок "From", указывая корректный адрес электронной почты. Это обеспечит отправку сообщений без ошибок.
Альтернативное решение с использованием фильтров:
Если вы хотите, чтобы заголовки отправителя были настроены глобально для всего сайта, вы можете использовать фильтры, как показано ниже:
add_filter('wp_mail_from', function($email) {
return 'noreply@example.com';
});
add_filter('wp_mail_from_name', function($name) {
return 'Имя Отправителя';
});
Эти фильтры позволят вам задать адрес и имя отправителя, которые будут использоваться во всех отправляемых письмах.
Заключение
Чтобы устранить проблемы с отправкой электронной почты на поддоменах в вашей многосайтовой конфигурации WordPress, вам необходимо настроить корректные заголовки для писем. Указание действительного адреса отправителя критично для успешной отправки. Внедрение предложенных решений позволит вам надежно отправлять уведомления и другую корреспонденцию пользователям ваших поддоменов.
Если проблема сохраняется, рассмотрите возможность использования SMTP-плагинов, таких как WP Mail SMTP, которые могут упростить отправку электронной почты и обеспечить дополнительный уровень надежности.