wp_mail_failed хук-событие . WP 1.0

Click here to view original web page at wp-kama.ru

Срабатывает при ошибке отправки письма функцией 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

Использование не найдено.