Включение 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 и другие приходят без проблем.
—
