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).
Итак, используемый код:
// Конфигурируем подключение 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 была следующая информация:
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
. Дополнив код им, проблема была решена.
Чтобы получить более подробную информацию об ошибке, используйте следующий код:
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'; }
С такими настройками почта на gmail и другие приходят без проблем.
Список изменений
С версии 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 ) );