Включение 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 пометит ваше письмо следующим образом:

Поэтому указывайте все параметры, чтобы не было проблем.

Эта заметка встроена в: wp_mail_failed