wp_mail_failed
Срабатывает при ошибке отправки письма функцией wp_mail().
Использование
add_action( 'wp_mail_failed', 'wp_kama_mail_failed_action' );
/**
* Function for `wp_mail_failed` action-hook.
*
* @param WP_Error $error A WP_Error object with the PHPMailer\PHPMailer\Exception message, and an array containing the mail recipient, subject, message, headers, and attachments.
*
* @return void
*/
function wp_kama_mail_failed_action( $error ){
// action...
}
- $error(WP_Error)
- Объект класса WP_Error, с указанной ошибкой и другими данными.
Примеры
#1 Включение SMTP для Beget и дебаг ошибок
Заметка для тех, кто имеет хостинг у Beget, имеет там доменную почту и хочет настроить отправку писем через SMTP этой почты. В большинстве случаев случаев SMTP настраивается в WordPress кодом, который мы публиковали в заметке Как подключить smtp для office 365, но для Beget этого оказалось недостаточно. Хотя все требования, указанные в документации Beget по настройке почты были соблюдены. Чтобы выяснить в чем проблема для дебага использовался хук wp_mail_failed, на котором можно было посмотреть ошибки, возвращаемые SMTP сервером. Для просмотра ошибки был включен дебаг в WordPress (ошибки писались в файл /wp-content/debug.log). Итак, используемый код: В нужном месте использовал отправку письма: В итоге в переменной $wp_error была следующая информация: Ошибка говорит, что почта пользователя SMPT не совпадает с указанной в параметре Чтобы получить более подробную информацию об ошибке, используйте следующий код: С такими настройками почта на gmail и другие приходят без проблем.Проблемный код (отлов ошибки)
// Конфигурируем подключение SMTP
add_action( 'phpmailer_init', 'beget_smtp_enable' );
function beget_smtp_enable( $phpmailer ) {
/** @var \PHPMailer\PHPMailer\PHPMailer $phpmailer */
$phpmailer->isSMTP();
$phpmailer->SMTPAuth = true;
$phpmailer->Host = 'smtp.beget.com';
$phpmailer->Port = '2525';
$phpmailer->Username = 'notification@site.com';
$phpmailer->Password = 'a2G&n60A';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->From = 'notification@site.com';
$phpmailer->FromName = get_bloginfo( 'name' );
}
add_action( 'wp_mail_failed', 'mail_failed_error_log' );
function mail_failed_error_log( $wp_error ) {
error_log( print_r( $wp_error, true ) );
}
wp_mail( 'my-mail@gmail.com', 'Тестовое письмо', 'Это тестовое письмо!' );
WP_Error Object (
[errors] => Array (
[wp_mail_failed] => Array (
[0] => The following From address failed: my-mail@gmail.com :
MAIL FROM command failed,LTD BeGet: MAIL FROM must match AUTHENTICATED USER
(MAIL FROM: 'my-mail@gmail.com' != AUTH LOGIN: 'notification@site.com')
,550,SMTP server error: MAIL FROM command failed Detail: LTD BeGet:
MAIL FROM must match AUTHENTICATED USER (MAIL FROM:
'my-mail@gmail.com' != AUTH LOGIN: 'notification@site.com')
SMTP code: 550
)
)
[error_data] => Array (
[wp_mail_failed] => Array (
[to] => Array (
[0] => my-mail@gmail.com
)
[subject] => Тестовое письмо
[message] => Это тестовое письмо!
[headers] => Array()
[attachments] => Array()
[phpmailer_exception_code] => 2
)
)
[additional_data:protected] => Array()
)
From, хотя в коде она совпадает. Изучая код класса PHPMailer, можно встретить параметр Sender. Дополнив код им, проблема была решена.add_action( 'wp_mail_failed', 'mail_failed_error_log' );
function mail_failed_error_log( \WP_Error $wp_error ) {
global $phpmailer;
$err_data = json_encode( $wp_error->get_error_data(), JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE );
$msg = <<<MSG
wp_email() Error:
- PHPMailer ErrorInfo: {$phpmailer->ErrorInfo}
- WP_Error Message: {$wp_error->get_error_message()}
- WP_Error Error Data: {$err_data}
MSG;
error_log( $msg );
}Рабочий вариант кода
// Конфигурируем подключение SMTP
add_action( 'phpmailer_init', 'beget_smtp_enable' );
function beget_smtp_enable( $phpmailer ) {
/** @var \PHPMailer\PHPMailer\PHPMailer $phpmailer */
$phpmailer->isSMTP();
$phpmailer->SMTPAuth = true;
$phpmailer->Host = 'smtp.beget.com';
$phpmailer->Port = '2525';
$phpmailer->Username = 'notification@site.com';
$phpmailer->Password = 'a2G&n60A';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->From = 'notification@site.com';
$phpmailer->FromName = get_bloginfo( 'name' );
$phpmailer->Sender = 'notification@site.com';
}
Список изменений
| С версии 4.4.0 | Введена. |
Где вызывается хук
do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_data ) );
do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );
