Отправка писем из WordPress по умолчанию происходит через функцию wp_mail(), которая использует стандартную функцию PHP mail(). Однако она часто не обеспечивает надежную доставку писем, особенно на современных хостингах с усиленной защитой от спама. В таких случаях правильным решением становится настройка отправки писем через SMTP-сервер. В этой статье мы подробно рассмотрим, как настроить отправку писем через SMTP в WordPress без использования плагинов, используя собственный код, а также разберем типичные ошибки и способы их решения.
Почему стоит использовать SMTP для отправки писем WordPress
SMTP (Simple Mail Transfer Protocol) — это протокол для отправки электронной почты, который обеспечивает более надежную и безопасную доставку сообщений. В отличие от PHP mail(), SMTP позволяет подключаться к реальному почтовому серверу с аутентификацией и поддержкой шифрования.
Преимущества SMTP в WordPress:
- Увеличение вероятности доставки писем в почтовые ящики пользователей.
- Поддержка аутентификации и шифрования (SSL/TLS).
- Ограничение попадания писем в спам.
- Возможность отправлять письма с адреса вашего домена.
Использование SMTP особенно важно для уведомлений, сброса паролей, регистраций и любых других писем от сайта.
Как работает функция wpgen_wp_mail_smtp: переопределение wp_mail для SMTP
Вместо использования плагинов, мы можем самостоятельно переопределить поведение wp_mail(), чтобы отправка писем шла через SMTP. Для этого добавим в файл functions.php вашей темы (или в кастомный плагин) следующий код.
function wpgen_wp_mail_smtp($to, $subject, $message, $headers = '', $attachments = array()) {
$smtp_host = 'smtp.example.com'; // SMTP хост
$smtp_port = 587; // Порт SMTP
$smtp_username = 'your-email@example.com'; // Логин SMTP
$smtp_password = 'yourpassword'; // Пароль SMTP
$smtp_secure = 'tls'; // Шифрование: 'ssl' или 'tls'
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
try {
// Настройки SMTP
$mail->isSMTP();
$mail->Host = $smtp_host;
$mail->SMTPAuth = true;
$mail->Username = $smtp_username;
$mail->Password = $smtp_password;
$mail->SMTPSecure = $smtp_secure;
$mail->Port = $smtp_port;
// От кого
$mail->setFrom($smtp_username, 'Ваш сайт');
// Кому
foreach ((array)$to as $recipient) {
$mail->addAddress($recipient);
}
// Тема и тело письма
$mail->Subject = $subject;
$mail->Body = $message;
$mail->isHTML(true);
// Заголовки
if ($headers) {
if (is_array($headers)) {
foreach ($headers as $header) {
$mail->addCustomHeader($header);
}
} else {
$mail->addCustomHeader($headers);
}
}
// Вложения
if (!empty($attachments)) {
foreach ($attachments as $attachment) {
$mail->addAttachment($attachment);
}
}
return $mail->send();
} catch (Exception $e) {
error_log('SMTP error: ' . $mail->ErrorInfo);
return false;
}
}
// Переопределяем wp_mail
remove_filter('wp_mail', 'wp_mail');
function wpgen_override_wp_mail($to, $subject, $message, $headers = '', $attachments = array()) {
return wpgen_wp_mail_smtp($to, $subject, $message, $headers, $attachments);
}
add_filter('wp_mail', 'wpgen_override_wp_mail', 10, 5);Обратите внимание, что для работы кода потребуется библиотека PHPMailer. Она уже встроена в WordPress, поэтому подключать дополнительно не нужно. В примере мы создаем функцию wpgen_wp_mail_smtp, которая отправляет письмо через SMTP, а затем через фильтр заменяем стандартную отправку.
Основные параметры SMTP и как их получить
Для корректной работы SMTP нужно знать:
- SMTP-сервер вашего почтового провайдера (например, smtp.gmail.com, smtp.yandex.ru).
- Порт — чаще всего 465 (SSL) или 587 (TLS).
- Тип шифрования — SSL или TLS.
- Логин и пароль — обычно это ваша почта и пароль от неё или пароль приложения.
Если вы используете почту на вашем домене, эти данные можно узнать у хостера или в панели управления почтой.
Решение распространённых проблем при отправке писем через SMTP
Письма не отправляются — проверка логов и ошибок
Если письма не уходят, первым делом включите логирование ошибок SMTP. В коде выше это делается через error_log(). Включите журнал ошибок PHP и просмотрите записи. Часто встречаются ошибки аутентификации, неправильного порта или блокировки со стороны хостинга.
Проблема с сертификатами SSL/TLS
Если вы видите ошибки, связанные с сертификатами, проверьте, что на сервере актуальные корневые сертификаты. В некоторых случаях можно временно отключить проверку сертификата (не рекомендуется в продакшене) с помощью:
$mail->SMTPOptions = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
];Почта попадает в спам
Чтобы уменьшить вероятность попадания писем в папку «Спам», настройте на домене SPF, DKIM и DMARC-записи. Также используйте адрес отправителя с вашим доменом, а не бесплатную почту.
Пример настройки отправки через SMTP Gmail
Для отправки писем через SMTP Gmail используйте следующие параметры:
- SMTP-сервер:
smtp.gmail.com - Порт: 587 (TLS) или 465 (SSL)
- Шифрование: tls или ssl
- Логин: ваша полная почта Gmail
- Пароль: пароль приложения Google (не основной пароль)
Создайте пароль приложения в Google аккаунте, если включена двухфакторная аутентификация. Пример кода для Gmail:
$smtp_host = 'smtp.gmail.com';
$smtp_port = 587;
$smtp_username = 'your-email@gmail.com';
$smtp_password = 'your-app-password';
$smtp_secure = 'tls';Альтернативные варианты и плагины для SMTP
Если не хочется писать код, можно использовать популярные плагины:
- WP Mail SMTP — самый популярный SMTP-плагин с поддержкой многих сервисов.
- Clearfy Pro — плагин для оптимизации и безопасности, в том числе помогает исправлять проблемы с отправкой почты.
Но при желании можно обойтись и собственным кодом, как показано выше.
Итоговые рекомендации по настройке SMTP в WordPress
1. Используйте SMTP с аутентификацией и шифрованием для надежной доставки писем.
2. Тестируйте отправку с помощью специализированных инструментов или кода.
3. Настройте SPF, DKIM, DMARC на домене для снижения риска попадания в спам.
4. Логируйте ошибки SMTP и анализируйте их для быстрого устранения проблем.
5. При необходимости используйте проверенные плагины, если нет возможности писать код.