Как реализовать почтовую отправку в PHP: пошаговые инструкции

Раздел: Программирование на PHP -> Работа с почтой

Отправка почты в PHP: основные варианты

Наиболее эффективное решение - библиотека PHPMailer.

PHPMailer предоставляет удобный интерфейс для отправки писем через SMTP, поддерживает HTML, вложения, кириллицу и защищённые соединения. Установка через Composer:

composer require phpmailer/phpmailer

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

Пример минимального использования:

<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer();
$mail->setFrom('from@example.com', 'Sender');
$mail->addAddress('to@example.com');
$mail->Subject = 'Тестовое письмо';
$mail->Body = 'Привет, мир!';
$mail->send();
?>

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

Для отправки через SMTP добавляются настройки:

$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;

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

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

  • Ошибка аутентификации - проверьте логин/пароль, разрешите доступ для сторонних приложений.
  • Письма попадают в спам - настройте SPF/DKIM/DMARC, проверьте репутацию домена.
  • Ошибка времени выполнения (timeout) - увеличьте timeout в скрипте или настройках SMTP.

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

Функция mail() доступна по умолчанию, но требует ручной настройки заголовков MIME. Пример отправки простого текстового письма:

<?php
$to = 'to@example.com';
$subject = 'Тестовое письмо';
$message = 'Привет, мир!';
$headers = 'From: from@example.com' . "\r\n" .
           'Content-Type: text/plain; charset=UTF-8' . "\r\n";
mail($to, $subject, $message, $headers);
?>

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

Проблемы:

  • Кириллица в теме и теле - кодировка заголовков требует специального кодирования (base64 или quoted-printable).
  • Без установленного локального MTA (sendmail, postfix) письма не отправляются.
  • Сложно добавлять вложения и HTML-форматирование.

Как отправить письмо с поддержкой кириллицы и HTML через mail()?

Необходимо правильно оформить заголовки MIME и закодировать тему:

<?php
$to = 'to@example.com';
$subject = '=?UTF-8?B?' . base64_encode('Тестовое письмо') . '?=';
$message = '<html><body><p>Привет, мир!</p></body></html>';
$headers = 'From: from@example.com' . "\r\n" .
           'MIME-Version: 1.0' . "\r\n" .
           'Content-Type: text/html; charset=UTF-8' . "\r\n";
mail($to, $subject, $message, $headers);
?>

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

Проблемы:

  • Кодирование темы - base64 или quoted-printable могут быть некорректно обработаны некоторыми почтовыми клиентами.
  • Длина строки заголовка - некоторые MTA обрезают слишком длинные строки.

Как отправить почту через библиотеку SwiftMailer (устаревшая, но ещё встречается)?

SwiftMailer устанавливается через Composer: composer require swiftmailer/swiftmailer Пример:

<?php
require 'vendor/autoload.php';
$transport = (new Swift_SmtpTransport('smtp.example.com', 587, 'tls'))
    ->setUsername('user@example.com')
    ->setPassword('secret');
$mailer = new Swift_Mailer($transport);
$message = (new Swift_Message('Тестовое письмо'))
    ->setFrom(['from@example.com' => 'Sender'])
    ->setTo(['to@example.com'])
    ->setBody('Привет, мир!', 'text/plain');
$mailer->send($message);
?>

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

Проблемы:

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

Как отправить почту с помощью встроенного SMTP через fsockopen (без библиотек)?

Это низкоуровневый способ, требующий реализации протокола SMTP вручную. Пример фрагмента:

<?php
$smtp = fsockopen('smtp.example.com', 587, $errno, $errstr, 30);
fgets($smtp, 512);
fputs($smtp, "EHLO localhost\r\n");
fgets($smtp, 512);
// ... последующие команды AUTH LOGIN, MAIL FROM, RCPT TO, DATA
fclose($smtp);
?>

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

Проблемы:

  • Большой объём кода для реализации всех шагов.
  • Сложность обработки ошибок и разных ответов сервера.
  • Не рекомендуется для production.

Как настроить sendmail в php.ini для работы mail()?

В файле php.ini нужно указать путь к sendmail (например, /usr/sbin/sendmail -t -i). Пример настройки для Windows:

SMTP = smtp.example.com
smtp_port = 25
sendmail_from = from@example.com

Проблемы:

  • Требуется установленный и настроенный почтовый сервер на сервере.
  • На общих хостингах настройки php.ini могут быть недоступны для изменения.

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

Пример 1. Отправка HTML-письма с вложением через PHPMailer

Пример
<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your@gmail.com';
$mail->Password = 'app_password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;
$mail->setFrom('from@gmail.com', 'Sender');
$mail->addAddress('to@example.com', 'Recipient');
$mail->addAttachment('/path/to/file.pdf', 'document.pdf');
$mail->isHTML(true);
$mail->Subject = 'Письмо с вложением';
$mail->Body = '<h1>Привет!</h1><p>Это HTML письмо с вложением.</p>';
if ($mail->send()) {
    echo 'Письмо отправлено';
} else {
    echo 'Ошибка: ' . $mail->ErrorInfo;
}
?>
Письмо отправлено

Пример 2. Отправка письма множественным получателям с разными типами содержимого (multipart/alternative) через PHPMailer

Пример
<?php
$mail = new PHPMailer();
$mail->isSMTP();
// ... настройки SMTP
$mail->setFrom('from@example.com');
$mail->addAddress('user1@example.com');
$mail->addAddress('user2@example.com');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');
$mail->isHTML(true);
$mail->Subject = 'Тестовое письмо';
$mail->Body = '<p>HTML версия</p>';
$mail->AltBody = 'Текстовая версия для клиентов без поддержки HTML';
$mail->send();
?>
Письмо отправлено

Пример 3. Использование mail() с заголовками MIME для кириллицы и вложения

Пример
<?php
$boundary = md5(uniqid(time()));
$headers = 'From: from@example.com' . "\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . "\r\n";
$subject = '=?UTF-8?B?' . base64_encode('Письмо с вложением') . '?=';
$message = '--' . $boundary . "\r\n";
$message .= 'Content-Type: text/plain; charset=UTF-8' . "\r\n";
$message .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n";
$message .= chunk_split(base64_encode('Текст письма')) . "\r\n";
$attachment = chunk_split(base64_encode(file_get_contents('/path/to/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', $subject, $message, $headers);
?>
Письмо отправлено (если функция поддерживается)

Пример 4. Обработка ошибок и логирование при отправке через SMTP

Пример
<?php
$mail = new PHPMailer(true);
try {
    $mail->SMTPDebug = 2; // выводить подробный отчёт
    $mail->Debugoutput = function($str, $level) { file_put_contents('mail.log', $str, FILE_APPEND); };
    // ... настройки SMTP и отправка
    $mail->send();
    echo 'Успешно';
} catch (Exception $e) {
    echo 'Ошибка: ' . $mail->ErrorInfo;
}
?>
Успешно

Пример 5. Отправка через встроенный sendmail с использованием почтовой очереди

Пример
// Предположим, sendmail настроен в php.ini
$to = 'user@example.com';
$subject = '=?UTF-8?B?' . base64_encode('Очередь') . '?=';
$headers = 'From: from@example.com' . "\r\n";
mail($to, $subject, 'Тело письма', $headers);
// Если письмо не уходит сразу, можно проверить очередь sendmail: mailq
Письмо попадает в очередь, результат можно проверить командой mailq

Пример 6. Отправка письма с использованием библиотеки Symfony Mailer (современная альтернатива)

Пример
composer require symfony/mailer
// код
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Mailer;
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('Тест Symfony Mailer')
    ->text('Текст письма')
    ->html('<p>HTML</p>');
$mailer->send($email);
?>
Письмо отправлено

Отправка почты в PHP - comments

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