Отправка Email на PHP: PHPMailer, mail() и альтернативы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка Email на PHP: от встроенной mail() до мощных библиотек

Отправка электронных писем — одна из ключевых функций любого веб-приложения: регистрация пользователей, восстановление паролей, уведомления, рассылки. В PHP существует несколько подходов: от простейшей встроенной функции mail() до специализированных библиотек, таких как PHPMailer и SwiftMailer. В этой статье мы подробно разберём каждый метод, покажем примеры кода и дадим рекомендации по выбору.

1. Встроенная функция mail()

Функция mail() — самый простой способ отправить письмо. Она использует почтовый сервер, настроенный в конфигурации PHP (sendmail_path или SMTP). Однако её возможности ограничены, и она не поддерживает современные требования: HTML-форматирование, вложения, SMTP-аутентификацию.

Базовый пример

<?php
$to = 'user@example.com';
$subject = 'Тема письма';
$message = 'Привет! Это тестовое письмо.';
$headers = 'From: no-reply@mysite.ru' . "\r\n" .
    'Reply-To: support@mysite.ru' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

if (mail($to, $subject, $message, $headers)) {
    echo 'Письмо отправлено';
} else {
    echo 'Ошибка отправки';
}
?>

Недостатки mail()

  • Нет поддержки HTML-писем (нужно вручную указывать Content-Type: text/html)
  • Невозможность прикрепить файлы без сложных манипуляций с MIME
  • Нет шифрования и аутентификации SMTP
  • Письма часто попадают в спам из-за отсутствия правильных заголовков
  • Сложно отлаживать ошибки

Для современных проектов mail() не рекомендуется. Лучше использовать специализированные библиотеки.

2. PHPMailer — золотой стандарт

PHPMailer — самая популярная библиотека для отправки email в PHP. Она поддерживает SMTP, SSL/TLS, HTML-письма, вложения, альтернативный текст, несколько получателей и многое другое. Устанавливается через Composer:

composer require phpmailer/phpmailer

Пример отправки через SMTP (Gmail)

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
    // Настройки сервера
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $mail->isSMTP();
    $mail->Host       = 'smtp.gmail.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'your@gmail.com';
    $mail->Password   = 'your-app-password'; // пароль приложения
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port       = 465;

    // Отправитель и получатели
    $mail->setFrom('from@example.com', 'Отправитель');
    $mail->addAddress('user@example.com', 'Получатель');
    $mail->addReplyTo('info@example.com', 'Информация');

    // Вложения (опционально)
    $mail->addAttachment('/path/to/file.pdf', 'document.pdf');

    // Контент
    $mail->isHTML(true);
    $mail->Subject = 'Тема письма';
    $mail->Body    = '<h1>Привет!</h1><p>Это письмо содержит <b>HTML</b>.</p>';
    $mail->AltBody = 'Привет! Это текстовая версия письма.';

    $mail->send();
    echo 'Письмо отправлено';
} catch (Exception $e) {
    echo "Ошибка: {$mail->ErrorInfo}";
}
?>

Преимущества PHPMailer

  • Полная поддержка SMTP с аутентификацией
  • Автоматическое формирование MIME-заголовков
  • Поддержка вложений и встроенных изображений
  • Работа с HTML и текстовой версией письма
  • Детальные сообщения об ошибках
  • Активная поддержка сообщества

3. SwiftMailer — альтернатива с гибкой архитектурой

SwiftMailer — ещё одна мощная библиотека (ныне заменена на Symfony Mailer, но всё ещё популярна). Отличается модульной архитектурой и поддержкой различных транспортов (SMTP, sendmail, mail()).

Пример

Рекомендаций