PHP почта: настройка и примеры отправки сообщений

Раздел: Настройка PHP -> Настройка почты

Основные подходы к настройке почтовой функции PHP

Как надёжно отправлять письма через PHP с аутентификацией и шифрованием?

Наиболее эффективным решением является использование библиотеки PHPMailer в связке с SMTP-сервером. Это обеспечивает поддержку аутентификации, TLS/SSL, вложений и HTML-писем. Установка через Composer:

composer require phpmailer/phpmailer

настройка почты php (настройка почты php)

Пример настройки для Gmail:


require 'vendor/autoload.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    $mail->Host       = 'smtp.gmail.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'your@gmail.com';
    $mail->Password   = 'your_app_password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port       = 587;
    $mail->setFrom('from@gmail.com', 'Sender');
    $mail->addAddress('recipient@example.com', 'Recipient');
    $mail->Subject = 'Тестовое письмо';
    $mail->Body    = 'Это текст письма.';
    $mail->send();
    echo 'Письмо отправлено';
} catch (Exception $e) {
    echo "Ошибка: {$mail->ErrorInfo}";
}

Типичные ошибки и их решения:

  • Ошибка аутентификации: проверьте, что используется пароль приложения (для Gmail) или правильные учётные данные. Убедитесь, что SMTPAuth включён.
  • SSL-сертификат: если возникает ошибка проверки сертификата, временно отключите проверку (не рекомендуется для продакшна):
    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );
  • Порт или шифрование: для TLS обычно порт 587, для SSL – 465. Уточните у провайдера.

Цель: отправка писем через внешний SMTP с полной аутентификацией, подходит для продакшна.

Как отправить письмо без внешних библиотек, используя встроенную функцию mail()?

Функция mail() требует настройки php.ini: параметр sendmail_path (Unix) или SMTP и smtp_port (Windows). Пример для Linux с sendmail:


$to = 'recipient@example.com';
$subject = 'Тема письма';
$message = 'Текст письма';
$headers = 'From: sender@example.com' . "\r\n" .
           'Reply-To: sender@example.com' . "\r\n" .
           'X-Mailer: PHP/' . phpversion();
if (mail($to, $subject, $message, $headers)) {
    echo 'Письмо отправлено';
} else {
    echo 'Ошибка отправки';
}

Проблемы: письма часто попадают в спам, так как нет аутентификации. На Windows требуется корректная настройка SMTP-сервера в php.ini (например, localhost:25). Если функция возвращает false, проверьте логи почтового сервера.

Случаи использования: простые уведомления на локальном сервере, когда не нужна высокая доставляемость.

Как использовать библиотеку SwiftMailer для отправки писем?

SwiftMailer (устаревшая, но ещё встречается в старых проектах). Установка: composer require swiftmailer/swiftmailer. Пример:


require 'vendor/autoload.php';

$transport = (new Swift_SmtpTransport('smtp.gmail.com', 587, 'tls'))
    ->setUsername('your@gmail.com')
    ->setPassword('your_password');

$mailer = new Swift_Mailer($transport);

$message = (new Swift_Message('Тема'))
    ->setFrom(['from@example.com' => 'Sender'])
    ->setTo(['recipient@example.com' => 'Recipient'])
    ->setBody('Текст письма');

$result = $mailer->send($message);

Проблемы: библиотека не обновляется, нет поддержки современных методов аутентификации (OAuth2). Рекомендуется мигрировать на Symfony Mailer или PHPMailer.

Как настроить отправку через Symfony Mailer?

Symfony Mailer – современная альтернатива. Установка: composer require symfony/mailer. Пример с Gmail:


use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mime\Email;

$transport = Transport::fromDsn('smtp://your@gmail.com:your_password@smtp.gmail.com:587');
$mailer = new Mailer($transport);

$email = (new Email())
    ->from('from@example.com')
    ->to('recipient@example.com')
    ->subject('Тест')
    ->text('Текст')
    ->html('

HTML

'); $mailer->send($email);

Ошибки: DSN строка чувствительна к спецсимволам, которые нужно URL-кодировать. Если пароль содержит @ или :, используйте urlencode.

Как тестировать отправку писем локально без реального SMTP?

Для локальной разработки удобно использовать MailHog или Papercut. Настройка php.ini:

sendmail_path = "/usr/local/bin/mailhog sendmail"

Или в коде PHPMailer указать SMTP на localhost:1025 (стандартный порт MailHog):


$mail->isSMTP();
$mail->Host = '127.0.0.1';
$mail->Port = 1025;
$mail->SMTPAuth = false;

Проблема: письма не уходят наружу, только в локальный интерфейс MailHog (доступен по адресу http://localhost:8025). Подходит только для тестирования.

Расширенные примеры настройки отправки почты

Отправка письма с вложением и HTML-контентом (PHPMailer)

Пример

$mail->isHTML(true);
$mail->Subject = 'Письмо с вложением';
$mail->Body    = '

Привет!

Это HTML-письмо.

'; $mail->AltBody = 'Альтернативный текст для почтовых клиентов без HTML'; $mail->addAttachment('/path/to/file.pdf', 'document.pdf'); $mail->send();

Результат: письмо с HTML-форматированием и прикреплённым PDF.

Использование OAuth2 с Gmail (PHPMailer)

Пример

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\OAuth;
use League\OAuth2\Client\Provider\Google;

$provider = new Google([
    'clientId'     => 'YOUR_CLIENT_ID',
    'clientSecret' => 'YOUR_CLIENT_SECRET',
]);

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host       = 'smtp.gmail.com';
$mail->SMTPAuth   = true;
$mail->AuthType   = 'XOAUTH2';
$mail->setOAuth(new OAuth([
    'provider' => $provider,
    'clientId' => 'YOUR_CLIENT_ID',
    'clientSecret' => 'YOUR_CLIENT_SECRET',
    'refreshToken' => 'YOUR_REFRESH_TOKEN',
    'userName' => 'your@gmail.com',
]));
$mail->setFrom('your@gmail.com');
$mail->addAddress('recipient@example.com');
$mail->Subject = 'OAuth2 test';
$mail->Body = 'Успешная отправка через OAuth2.';
$mail->send();

Результат: письмо отправляется без хранения пароля, через токен.

Настройка подписи DKIM (PHPMailer)

Пример

$mail->DKIM_domain = 'example.com';
$mail->DKIM_private = '/path/to/private.key';
$mail->DKIM_selector = 'default';
$mail->DKIM_passphrase = '';
$mail->send();

Результат: письмо подписывается DKIM, что повышает доставляемость.

Отправка через Amazon SES (SMTP)

Пример

$mail->isSMTP();
$mail->Host = 'email-smtp.us-east-1.amazonaws.com';
$mail->SMTPAuth = true;
$mail->Username = 'YOUR_SMTP_USERNAME';  // IAM-ключ
$mail->Password = 'YOUR_SMTP_PASSWORD';  // IAM-секрет
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

Результат: письма отправляются через инфраструктуру Amazon.

Отладка SMTP-соединения с выводом логов

Пример

$mail->SMTPDebug = SMTP::DEBUG_SERVER;  // вывод всех команд и ответов
$mail->Debugoutput = function($str, $level) {
    echo "
$str
"; };

Результат: в браузер выводится подробный протокол SMTP.

Настройка почты PHP - comments

En
настройка почты php (php)