wp_mail() не работает на локальном сервере
Я пытаюсь протестировать wp_mail() на локальном сервере. Когда я делаю var_dump для wp_mail, я получаю Boolean false. Вот мой код:
$to = "abcd@gmail.com";
$subject = 'my subject';
$message = 'I would like to work with you';
$headers = '';
$sent_message = wp_mail( $to, $subject, $message, $headers);
var_dump($sent_message); // здесь я получаю boolean false
if ( $sent_message ) {
echo 'Тестовое сообщение было отправлено. Проверьте ваш почтовый ящик.';
} else {
echo 'Сообщение не было отправлено!'; // в итоге выводится это
}
Буду благодарен за любую помощь.
wp_mail()
по умолчанию использует PHP-функцию mail()
, для работы которой требуется настроенный MTA (агент передачи сообщений) на вашем хостинге. Вы можете установить и настроить такой MTA. Если у вас ОС на базе Linux, SSMTP — это простое решение, позволяющее использовать любого почтового провайдера для отправки системных писем через SMTP. Другой вариант MTA — Sendmail, мощный, но сложный в настройке агент передачи сообщений.
Или вы можете просто использовать плагин, например WP Mail SMTP, который реализует прямое SMTP-подключение в PHP, минуя использование mail()
.

Если вы хотите протестировать функциональность почты во время разработки, вы можете использовать mailcatcher: https://mailcatcher.me На Windows я его не тестировал, но на Mac OS он работает. На других Linux-системах он тоже должен работать.

Если кто-то наткнётся на этот старый вопрос:
В моём случае причиной было то, что я указал для локального сайта имя без домена верхнего уровня. Например, "mysite" (вместо "mysite.com"). В результате WordPress использовал адрес отправителя "wordpress@mysite".
Phpmailer (который вызывается функцией wp_mail) затем выдавал ошибку: "Неверный адрес: (From): wordpress@mysite"
Решение заключалось в явном указании адреса отправителя через заголовок:
$headers[] = 'From: Wordpress<wordpress@mysite.com>';
$sent_message = wp_mail( $to, $subject, $message, $headers );
После этого wp_mail заработала.

Дополняя полезный ответ Ронни, вот как можно переопределить адрес From:
для всей исходящей почты:
if (defined('WP_CLI')) {
WP_CLI::add_wp_hook('wp_mail_from', function () {
return 'my@addr.com';
});
} else {
add_filter('wp_mail_from', function () {
return 'my@addr.com';
});
}
Для локальной среды разработки я обнаружил, что удобно размещать этот код в wp-config.php
, в самом конце, после require_once ABSPATH . 'wp-settings.php';
.
Добавлен обходной путь для wp-cli, так как он не предоставляет функцию add_filter()
, как это делает обычный WordPress.
