Срабатывает при ошибке отправки письма функцией wp_mail().
Использование
add_action( 'wp_mail_failed', 'action_function_name_8763' ); function action_function_name_8763( $error ){ // Делаем что-либо... }
Примеры
#1 Включение SMTP для Beget и дебаг ошибок
Заметка для тех, кто имеет хостинг у Beget, имеет там доменную почту и хочет настроить отправку писем через SMTP.
В большинстве случаев случаев SMTP настраивается в WordPress кодом, который мы публиковали в заметке Как подключить smtp для office 365, но для Beget этого оказалось недостаточным, хотя все требования, указанные в документации Beget по настройке почты были соблюдены. Здесь на помощью пришёл хук wp_mail_failed, на котором можно было посмотреть ошибки, возвращаемые сервером SMTP. Для удобства просмотра ошибки был включен дебаг в WordPress (ошибки писались в файл /wp-content/debug.log).
Итак, используемый код:
// Конфигурируем подключение SMTP add_action( 'phpmailer_init', 'beget_smtp_enable' ); function beget_smtp_enable( 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', [ $this, 'mail_failed' ] ); function mail_failed( $wp_error ) { error_log( print_r( $wp_error, true ) ); }
В нужном месте использовал отправку письма:
wp_mail( 'my-mail@gmail.com', 'Тестовое письмо', 'Это тестовое письмо!' );
В итоге в переменной $wp_error была следующая информация:
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() )
Ошибка говорит, что почта пользователя SMPT не совпадает с указанной в параметре From
, хотя в коде она совпадает. Изучая код класса PHPMailer, можно встретить параметр Sender
. Дополнив код им, проблема была решена.
Рабочий вариант кода
// Конфигурируем подключение SMTP add_action( 'phpmailer_init', 'beget_smtp_enable' ); function beget_smtp_enable( 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'; }
С такими настройками почта на gmail и другие приходят без проблем.
Кстати, если из кода удалить параметры From
и FromName
, то gmail пометит ваше письмо следующим образом:
Поэтому указывайте все параметры, чтобы не было проблем.
Где вызывается хук
Где используется хук в ядре WordPress
Использование не найдено.