Работа с электронной почтой в PHP: функции, библиотеки, конфигурация

Раздел: -> Работа с почтой

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

Как отправлять сложные письма с вложениями и HTML через защищенное SMTP-соединение?

Наиболее эффективное решение - использование библиотеки PHPMailer. Она обеспечивает поддержку SMTP с аутентификацией, шифрование (TLS/SSL), отправку HTML и вложений, работу с кодировками и отлов ошибок.

Установка и подключение:

composer require phpmailer/phpmailer

Php mail (отправка почты в php)

require 'vendor/autoload.php';

Message php (отправка сообщений в php)

Пример базовой отправки через SMTP:

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

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'secret';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

$mail->setFrom('from@example.com', 'Отправитель');
$mail->addAddress('to@example.com', 'Получатель');
$mail->Subject = 'Тема письма';
$mail->Body = '

Привет!

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

'; $mail->AltBody = 'Текстовая версия.'; $mail->send(); echo 'Письмо отправлено';

Mail php p (отправка email через php)

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

  • Ошибка аутентификации - проверьте логин и пароль, включите доступ для сторонних приложений (например, в Gmail).
  • Проблемы с SSL сертификатами - используйте $mail->SMTPOptions = ['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]; (только для тестирования).
  • Порт заблокирован хостингом - используйте порт 587 или 465.

Цель и случаи использования:

PHPMailer подходит для любого проекта, где требуется надежная отправка писем, особенно с вложениями, HTML-форматированием или через внешние SMTP-серверы (например, Gmail, Yandex, Mail.ru).

Как отправить простое письмо без установки дополнительных библиотек?

В PHP есть встроенная функция mail(). Она отправляет письма через локальный почтовый сервер (sendmail).

$to = 'recipient@example.com';
$subject = 'Тестовое письмо';
$message = 'Привет, мир!';
$headers = 'From: sender@example.com' . "\r\n" .
    'Reply-To: sender@example.com' . "\r\n" .
    'Content-Type: text/plain; charset=UTF-8' . "\r\n" .
    'MIME-Version: 1.0';
if(mail($to, $subject, $message, $headers)) {
    echo 'Письмо отправлено';
} else {
    echo 'Ошибка отправки';
}

Php mail sender (отправитель почты php)

Проблемы mail():

  • Не поддерживает SMTP-аутентификацию и шифрование.
  • Письма часто попадают в спам из-за неправильных заголовков.
  • Необходимость настройки sendmail на сервере.
  • Кодировка текста: заголовки Subject и From должны быть закодированы (например, ?UTF-8?B?...).

Когда использовать:

Для быстрых прототипов, внутренней отправки уведомлений, когда сервер уже настроен на отправку почты.

Как реализовать отправку с поддержкой очередей и гибкой маршрутизацией?

Библиотека SwiftMailer (старая, но всё ещё используется) позволяет отправлять письма через различные транспорты (SMTP, sendmail, встроенная очередь).

require_once 'vendor/autoload.php';

$transport = (new Swift_SmtpTransport('smtp.example.com', 587, 'tls'))
    ->setUsername('user@example.com')
    ->setPassword('pass');

$mailer = new Swift_Mailer($transport);

$message = (new Swift_Message('Тема письма'))
    ->setFrom(['from@example.com' => 'Отправитель'])
    ->setTo(['to@example.com' => 'Получатель'])
    ->setBody('Привет, это HTML!', 'text/html')
    ->addPart('Текстовая версия', 'text/plain');

$result = $mailer->send($message);
if ($result) {
    echo 'Отправлено успешно';
}

Php mail https (отправка email через https в php)

Ошибки:

  • Библиотека больше не поддерживается, для новых проектов лучше использовать Symfony Mailer.
  • Проблемы с памятью при большом количестве писем.

Когда выбирать:

Существующие проекты на старой версии, где не хотят менять архитектуру.

Как интегрировать отправку писем в Symfony-проект?

Symfony Mailer - современная библиотека, работающая с MailerInterface. Легко конфигурируется через DSN.

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

$transport = Transport::fromDsn('smtp://user:pass@smtp.example.com:587');
$mailer = new Mailer($transport);

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

HTML

'); $mailer->send($email); echo 'Письмо отправлено';

отправить почту php (отправка почты в php)

Типичные проблемы:

  • Необходимость установки компонентов (composer require symfony/mailer).
  • Конфликт с другими библиотеками, если версии не совпадают.

Когда применять:

В проектах на Symfony или в любом PHP-приложении, где нужна гибкая поддержка разных транспортов, очередей (через Messenger) и расширенное логирование.

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

Можно использовать сокеты и протокол SMTP напрямую. Это низкоуровневый, но контролируемый способ.

$smtp = fsockopen('smtp.example.com', 25, $errno, $errstr, 30);
fputs($smtp, "EHLO client\r\n");
fputs($smtp, "AUTH LOGIN\r\n");
fputs($smtp, base64_encode('user') . "\r\n");
fputs($smtp, base64_encode('pass') . "\r\n");
fputs($smtp, "MAIL FROM:\r\n");
fputs($smtp, "RCPT TO:\r\n");
fputs($smtp, "DATA\r\n");
fputs($smtp, "Subject: Test\r\n\r\nMessage body\r\n." . "\r\n");
fputs($smtp, "QUIT\r\n");
fclose($smtp);

Сложности:

  • Необходимо вручную обрабатывать ответы сервера и коды ошибок.
  • Требуется поддержка TLS/SSL через stream_socket_client.
  • Неудобно при добавлении вложений и кодировок.

Когда использовать:

В образовательных целях, для глубокого понимания SMTP, или на платформах, где нет возможности использовать Composer.

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

1. PHPMailer: отправка HTML с вложением и через Gmail

Пример
require 'vendor/autoload.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHpmailer\PHPMailer\Exception;

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your@gmail.com';
$mail->Password = 'app_password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

$mail->setFrom('your@gmail.com', 'Ваше имя');
$mail->addAddress('recipient@example.com', 'Имя получателя');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->addAttachment('doc.pdf', 'Документ.pdf');
$mail->addAttachment('image.jpg');

$mail->Subject = 'Отчет за март 2025';
$mail->Body = '

Отчет

Во вложении файлы.

'; $mail->AltBody = 'Отчет во вложениях.'; if ($mail->send()) { echo 'Письмо отправлено'; } else { echo 'Ошибка: ' . $mail->ErrorInfo; }
Письмо отправлено

2. SwiftMailer: отправка через Яндекс.Почту с вложением

Пример
require 'vendor/autoload.php';

$transport = (new Swift_SmtpTransport('smtp.yandex.ru', 465, 'ssl'))
    ->setUsername('user@yandex.ru')
    ->setPassword('password');

$mailer = new Swift_Mailer($transport);

$message = (new Swift_Message('Конфиденциальная информация'))
    ->setFrom(['user@yandex.ru' => 'Администратор'])
    ->setTo(['boss@example.com' => 'Директор'])
    ->setBody('Секретные данные в приложенном файле.', 'text/plain')
    ->attach(Swift_Attachment::fromPath('secret.txt'));

$result = $mailer->send($message);
if ($result) {
    echo 'Отправлено: ' . $result;
} else {
    echo 'Не удалось отправить';
}
Отправлено: 1

3. Встроенная mail() с поддержкой UTF-8 и вложений через границы MIME

Пример
$boundary = md5(uniqid(time()));
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . "\r\n";
$headers .= 'From: sender@example.com' . "\r\n";

$message = '--' . $boundary . "\r\n";
$message .= 'Content-Type: text/plain; charset=UTF-8' . "\r\n\r\n";
$message .= 'Текст письма' . "\r\n";

$attachment = chunk_split(base64_encode(file_get_contents('file.pdf')));
$message .= '--' . $boundary . "\r\n";
$message .= 'Content-Type: application/pdf; name="file.pdf"' . "\r\n";
$message .= 'Content-Disposition: attachment; filename="file.pdf"' . "\r\n";
$message .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n";
$message .= $attachment . "\r\n";
$message .= '--' . $boundary . '--';

mail('to@example.com', '=?UTF-8?B?' . base64_encode('Тема') . '?=', $message, $headers);
(Письмо отправлено без ошибок, но без гарантии доставки)

4. Отправка через SMTP с помощью stream_socket_client (SSL)

Пример
$context = stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]);
$smtp = stream_socket_client('ssl://smtp.gmail.com:465', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);

fputs($smtp, "EHLO client\r\n");
fgets($smtp);
fputs($smtp, "AUTH LOGIN\r\n");
fgets($smtp);
fputs($smtp, base64_encode('user@gmail.com') . "\r\n");
fgets($smtp);
fputs($smtp, base64_encode('app_password') . "\r\n");
fgets($smtp);
fputs($smtp, "MAIL FROM:\r\n");
fgets($smtp);
fputs($smtp, "RCPT TO:\r\n");
fgets($smtp);
fputs($smtp, "DATA\r\n");
fgets($smtp);
fputs($smtp, "Subject: Test\r\n");
fputs($smtp, "From: user@gmail.com\r\n");
fputs($smtp, "To: recipient@example.com\r\n");
fputs($smtp, "\r\nBody of the message\r\n.\r\n");
fgets($smtp);
fputs($smtp, "QUIT\r\n");
fclose($smtp);
echo 'Запрос отправлен';
Запрос отправлен (проверьте ящик получателя)

Отправка сообщений в PHP - comments

En
Message php (php)