Отправка письма на PHP с примерами кода

Как отправить письмо php

Как отправить письмо php

PHP предоставляет несколько способов отправки электронных писем, начиная от встроенной функции mail() до использования внешних библиотек, таких как PHPMailer и SwiftMailer. Прямое использование mail() подходит для простых уведомлений, но для работы с вложениями, HTML-шаблонами и SMTP-реле рекомендуется применять специализированные библиотеки.

При отправке писем через SMTP важно указывать точные настройки сервера: адрес SMTP, порт, метод шифрования (SSL или TLS) и корректные учетные данные. Ошибки в этих параметрах чаще всего приводят к недоставке сообщений или попаданию в папку «Спам».

Использование PHPMailer позволяет формировать письма с HTML-содержимым, добавлять вложения, управлять кодировкой и получать детализированные сообщения об ошибках. Такой подход повышает надежность и прозрачность процесса отправки писем, особенно при массовой рассылке или интеграции с CRM-системами.

Далее будут представлены рабочие примеры кода, демонстрирующие как отправку простого текста с помощью mail(), так и более сложные письма через PHPMailer с HTML-разметкой и вложениями, с подробными пояснениями каждого шага.

Настройка функции mail() для отправки писем

Настройка функции mail() для отправки писем

Функция mail() в PHP требует корректной настройки почтового сервера на стороне сервера. На Linux обычно используется sendmail или postfix, а на Windows – SMTP-сервер через файл php.ini.

Для Linux убедитесь, что путь к sendmail указан верно: sendmail_path = /usr/sbin/sendmail -t -i. Параметр -t передает получателя из заголовков письма, -i предотвращает преждевременное завершение письма при встрече с точкой на новой строке.

На Windows настройка SMTP осуществляется через php.ini: SMTP = smtp.example.com, smtp_port = 25. Укажите корректный сервер, порт и при необходимости логин и пароль, если сервер требует аутентификацию. Без правильного SMTP-пути письма не будут отправляться.

При вызове mail() обязательно указывайте заголовки: From, Reply-To и Content-type. Например:
$headers = "From: info@example.com\r\nReply-To: info@example.com\r\nContent-type: text/html; charset=UTF-8\r\n";

Это гарантирует корректное отображение письма и уменьшает риск попадания в спам.

Для тестирования отправки используйте простой скрипт:

mail('user@example.com', 'Тема', 'Текст письма', $headers);
и проверяйте результат через лог сервера или функцию error_get_last() для выявления ошибок.

Если письма не уходят, проверьте: включен ли почтовый сервер, правильны ли права на sendmail, нет ли блокировки портов и корректны ли DNS-записи SPF и DKIM для домена.

Отправка HTML-письма с вложением изображений

Отправка HTML-письма с вложением изображений

Для отправки HTML-письма с изображениями в PHP рекомендуется использовать библиотеку PHPMailer. Она обеспечивает корректную обработку заголовков, кодировку и вложения.

Создайте объект PHPMailer и настройте SMTP-сервер:


use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

Для HTML-содержимого включите:


$mail->isHTML(true);
$mail->Subject = 'Тема письма';
$mail->Body = '<h1>Отчет</h1><p>Смотрите вложенные изображения.</p><img src="cid:logo_img">';

Добавление изображений как вложений с указанием CID для отображения внутри письма:


$mail->addEmbeddedImage('/path/to/logo.png', 'logo_img', 'logo.png');
$mail->addAttachment('/path/to/report.pdf', 'report.pdf');

Отправка письма выполняется командой:


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

При работе с изображениями важно использовать абсолютные пути и корректно задавать MIME-типы. CID-ссылки позволяют вставлять изображения прямо в тело HTML без необходимости внешних URL.

Для нескольких изображений создавайте уникальные идентификаторы для каждого и используйте их в соответствующих тегах <img>.

Добавление нескольких получателей и скрытой копии

Добавление нескольких получателей и скрытой копии

Для отправки письма нескольким адресатам в PHP используется разделитель запятой. В функции mail() это реализуется через параметр $to:

<?php
$to = "user1@example.com, user2@example.com, user3@example.com";
$subject = "Отчет за неделю";
$message = "Здравствуйте, во вложении отчет.";
$headers = "From: sender@example.com\r\n";
mail($to, $subject, $message, $headers);
?>

Если требуется скрытая копия (BCC), добавление выполняется через заголовок Bcc:

<?php
$to = "user1@example.com";
$subject = "Отчет за неделю";
$message = "Здравствуйте, во вложении отчет.";
$headers = "From: sender@example.com\r\n";
$headers .= "Bcc: manager@example.com, auditor@example.com\r\n";
mail($to, $subject, $message, $headers);
?>

Для массовой рассылки рекомендуется ограничивать количество адресов в одном письме, чтобы избежать блокировки на стороне почтового сервера. Оптимально разделять адресатов на группы по 50–100 человек и отправлять письма партиями.

При использовании нескольких получателей и BCC важно корректно формировать заголовки: каждая строка должна заканчиваться \r\n, а From обязательно указывать реальный адрес, иначе письмо может попасть в спам.

Для динамического добавления получателей в массиве удобно применять цикл:

<?php
$recipients = ["user1@example.com", "user2@example.com"];
$bcc = ["manager@example.com", "auditor@example.com"];
$to = implode(", ", $recipients);
$headers = "From: sender@example.com\r\n";
$headers .= "Bcc: " . implode(", ", $bcc) . "\r\n";
mail($to, $subject, $message, $headers);
?>

Использование PHPMailer для отправки через SMTP

PHPMailer предоставляет надёжный способ отправки писем через SMTP-сервер с поддержкой аутентификации и шифрования. Для работы требуется подключение файла PHPMailer и настройка объекта класса PHPMailer.

Пример минимальной конфигурации для SMTP:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host       = 'smtp.example.com';
$mail->SMTPAuth   = true;
$mail->Username   = 'user@example.com';
$mail->Password   = 'securepassword';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port       = 587;
$mail->setFrom('user@example.com', 'Имя Отправителя');
$mail->addAddress('recipient@example.com', 'Имя Получателя');
$mail->isHTML(true);
$mail->Subject = 'Тема письма';
$mail->Body    = '

Содержимое письма в HTML

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

Рекомендуется использовать порт 465 с PHPMailer::ENCRYPTION_SMTPS для прямого TLS-соединения. При работе с SMTP важно проверять:

Параметр Рекомендация
Host Указывать полный домен SMTP-сервера (например, smtp.gmail.com)
SMTPAuth Всегда включать для серверов, требующих авторизацию
Username / Password Использовать отдельный аккаунт для отправки и хранить пароль безопасно
SMTPSecure Использовать STARTTLS или SMTPS для шифрования
Port 587 для STARTTLS, 465 для SMTPS
setFrom Указывать email, совпадающий с учетной записью SMTP, иначе сервер может отклонить письмо

Для отладки можно включить $mail->SMTPDebug = 2; чтобы видеть обмен сообщениями с сервером и точнее диагностировать ошибки. PHPMailer поддерживает добавление вложений через $mail->addAttachment(‘файл.pdf’); и отправку копий через $mail->addCC() и $mail->addBCC().

Обработка ошибок при неудачной отправке письма

Обработка ошибок при неудачной отправке письма

Функция mail() возвращает true, если письмо принято системой для отправки, и false при ошибке. Для выявления причины сбоя используйте error_get_last():


$success = mail($to, $subject, $message, $headers);
if (!$success) {
  $error = error_get_last();
  echo "Ошибка отправки: " . $error['message'];
}

Для SMTP и более сложной логики применяются библиотеки PHPMailer и SwiftMailer, которые возвращают подробные сообщения об ошибках и поддерживают исключения:


use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
try {
  $mail->isSMTP();
  $mail->Host = 'smtp.example.com';
  $mail->SMTPAuth = true;
  $mail->Username = 'user@example.com';
  $mail->Password = 'password';
  $mail->setFrom('from@example.com');
  $mail->addAddress('to@example.com');
  $mail->Subject = 'Тема письма';
  $mail->Body = 'Текст письма';
  $mail->send();
} catch (Exception $e) {
  echo "Ошибка PHPMailer: " . $mail->ErrorInfo;
}

Рекомендации по обработке ошибок:

  • Всегда проверяйте результат mail() или ловите исключения в PHPMailer/SwiftMailer.
  • Логируйте ошибки в файл или базу данных с точным временем и деталями SMTP-сессии.
  • Проверяйте доступность SMTP-сервера и корректность учетных данных перед отправкой.
  • При массовой рассылке внедряйте повторные попытки отправки и уведомления администратору при сбоях.

Эти меры позволяют точно идентифицировать сбои, корректировать конфигурацию и обеспечивать доставку писем без потерь.

Отправка писем с кодировкой UTF-8 и русскими символами

Отправка писем с кодировкой UTF-8 и русскими символами

Для корректной отправки писем с русскими символами в PHP необходимо использовать кодировку UTF-8 и правильно формировать заголовки письма.

Пример минимальной отправки письма с русскими символами через функцию mail():

<?php
$to = 'example@example.com';
$subject = 'Тема письма';
$message = 'Привет! Это тестовое письмо с русскими символами.';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=UTF-8\r\n";
$headers .= "From: sender@example.com\r\n";
mail($to, $subject, $message, $headers);
?>

Рекомендации по работе с UTF-8:

  • Использовать заголовок Content-type: text/plain; charset=UTF-8 или text/html; charset=UTF-8 для HTML-писем.
  • Кодировать тему письма с помощью функции mb_encode_mimeheader(), чтобы избежать проблем с кириллицей:
  • $subject = mb_encode_mimeheader('Тема письма', 'UTF-8');
  • При использовании HTML в письмах применять тег <meta charset="UTF-8"> в начале тела письма:
  • $message = '<html><head><meta charset="UTF-8"></head><body>Привет!</body></html>';
  • Всегда проверять, чтобы PHP-скрипт и исходные файлы были сохранены в UTF-8 без BOM.
  • При массовой отправке или работе с HTML-форматом использовать библиотеки PHPMailer или SwiftMailer, которые автоматически корректно обрабатывают кодировку.

Пример отправки письма через PHPMailer с UTF-8 и русским текстом:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->CharSet = 'UTF-8';
$mail->setFrom('sender@example.com', 'Отправитель');
$mail->addAddress('example@example.com');
$mail->Subject = 'Тема письма';
$mail->Body    = 'Привет! Это письмо с русскими символами.';
$mail->send();
} catch (Exception $e) {
echo "Ошибка отправки: {$mail->ErrorInfo}";
}

Следование этим правилам гарантирует корректное отображение русских символов у получателя и предотвращает искажение текста при передаче.

Вопрос-ответ:

Ссылка на основную публикацию