Как проверить работу wp_mail в WordPress?
Я пытаюсь использовать wp_mail
(тестирую на локальной машине), но письма не приходят.
В php.ini
установлен smtp_port = 25
и функция php mail()
пока работает.
- как проверить работает ли wp_mail
- что может пойти не так
Вот код моей почтовой функции:
function mv_optin_mail($id, $data){
$url = $id."-".mv_mail_token($id, $data['token']);
add_filter( 'wp_mail_content_type', 'set_html_content_type' );
add_filter( 'wp_mail_charset', 'utf8' );
$headers[] = 'From: '.sender_signature.' <'.noreply_address.'>';
ob_start();
include("optin-mail.php");
$html_mail = ob_get_contents();
ob_end_clean();
wp_mail( $data['email'], 'Тема письма', $html_mail, $headers );
remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
remove_filter( 'wp_mail_charset', 'utf8' );
}
Я не получаю никаких ошибок. Есть ли способ включить логирование ошибок для wordpress?
Значение noreply_address
установлено как noreply@root

Вы можете использовать действие 'wp_mail_failed' для перехвата ошибки отправки.
https://developer.wordpress.org/reference/hooks/wp_mail_failed/

WordPress использует класс PHPMailer для отправки электронной почты через PHP-функцию mail
.
Поскольку PHP-функция mail
возвращает очень мало информации после выполнения (только TRUE или FALSE), я предлагаю временно упростить вашу функцию mv_optin_mail
до минимума, чтобы проверить, работает ли функция wp_mail
.
Пример:
$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'тест отправки почты', 'ура' );
echo $mailResult;
Поскольку вы уже протестировали PHP-функцию mail
, письмо должно прийти.
Если письмо не приходит, проблема заключается в других операторах вашей функции или в классе PHPMailer.
В таких случаях я обычно переименовываю свою функцию во что-то вроде:
function mv_optin_mail_backup( $id, $data ) {
И добавляю временную функцию с тем же именем для экспериментов, например:
function mv_optin_mail( $id, $data ) {
$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'тест отправки почты', 'ура' );
echo $mailResult;
}
Когда я выясню, в чем проблема, я снова начинаю использовать резервную версию.
Для отправки письма напрямую через PHPMailer можно сделать так (не для продакшена, только для отладки):
add_action( 'phpmailer_init', 'my_phpmailer_example' );
function my_phpmailer_example( $phpmailer ) {
$phpmailer->isSMTP();
//$phpmailer->Host = 'smtp.example.com';
// $phpmailer->SMTPAuth = true; // Принудительно использовать логин и пароль для аутентификации
$phpmailer->Port = 25;
// $phpmailer->Username = 'ваш_логин';
// $phpmailer->Password = 'ваш_пароль';
// Дополнительные настройки…
//$phpmailer->SMTPSecure = "tls"; // Выберите SSL или TLS, если это необходимо для вашего сервера
$phpmailer->setFrom( "fromemail@bla.com", "Имя отправителя" );
$phpmailer->addAddress( "youremail@bla.com", "Ваше имя" );
$phpmailer->Subject = "Тестирование PHPMailer";
$phpmailer->Body = "Ура! \n\n Отлично.";
if( !$phpmailer->send() ) {
echo "Ошибка отправки: " . $phpmailer->ErrorInfo;
} else {
echo "Письмо отправлено!";
}
}

Обычно я проверяю, правильно ли работает отправка писем через wp_mail()
, просто регистрируясь на своём сайте с другим email-адресом и проверяю, приходит ли письмо. Если письмо приходит, значит WordPress корректно отправляет письма (он использует wp_mail()
для отправки писем с регистрацией), и вам следует проверить свою функцию отправки писем на наличие ошибок. Как предложил @Tobias, для этого нужно упростить вашу функцию отправки писем, оставив только основное:
function wpse_100047() {
echo wp_mail( 'youremail@example.com', 'WP Mail Test', 'Mail is working' );
}
Кроме того, письма, отправляемые WordPress (как и все письма, отправляемые функцией PHP mail()
), могут блокироваться некоторыми почтовыми серверами (или помечаться как спам), поэтому на рабочем сайте всегда рекомендуется использовать SMTP (есть множество плагинов для этого).

Я бы начал с включения WP_DEBUG в файле wp-config, чтобы посмотреть, покажет ли это что-то о вашем коде или о функции wp_mail. Это основные возможности отладки "из коробки" в WordPress.
Также вы можете использовать плагин Easy WP SMTP, включить отладку и/или настроить его для использования SMTP. На WordPress.org есть похожие плагины, но я знаю, что у этого есть хорошие опции отладки. Если что-то вроде GMail будет работать, вы поймете, что проблема в настройках сервера, а не в этом коде.

В этом документе были очень интересные предложения.
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
В частности, при работе с Azure Virtual Machine конфигурация SELinux блокировала исходящие соединения.
Если вы видите ошибку типа
SMTP -> ERROR: Failed to connect to server: Permission denied (13)
, возможно, SELinux запрещает PHP или веб-серверу отправлять электронную почту. Это особенно вероятно на RedHat / Fedora / Centos. С помощью командыgetsebool
мы можем проверить, разрешено ли демону httpd устанавливать сетевое соединение и отправлять электронную почту:getsebool httpd_can_sendmail getsebool httpd_can_network_connect
Эта команда вернет булево значение on или off. Если оно off, мы можем включить его:
sudo setsebool -P httpd_can_sendmail 1 sudo setsebool -P httpd_can_network_connect 1
Если вы запускаете PHP-FPM через fastcgi, возможно, потребуется применить это к демону fpm, а не к httpd.
