Отправка писем с вложениями — стандартная задача для веб-приложений. Хотя встроенная функция mail() позволяет это делать, ручное формирование заголовков (headers) и границ (boundaries) для файлов — процесс сложный и подверженный ошибкам. Поэтому в современной разработке чаще используют библиотеки вроде PHPMailer.
Основной метод для добавления файла — addAttachment($path, $name). Первый аргумент — это путь к файлу на сервере, а второй (необязательный) — имя, которое увидит получатель. Это позволяет переименовывать файлы «на лету».
В этом уроке мы разберем, как прикрепить документы и картинки к письму, как работает код библиотек и как избежать типичных ошибок с путями к файлам. Вас ждут примеры и интерактивные задания.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Iterator интерфейс
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- IteratorAggregate интерфейс
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Функция htmlspecialchars().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Вложения в письмах.
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
1. Компоненты письма
Перед вами список элементов, которые являются компонентами email-сообщения в PHP. Распределите их по двум категориям: «Тело письма» (содержимое, которое видит получатель) и «Мета-данные» (служебная информация о письме). Обратите внимание, что тело письма может быть представлено в виде HTML или обычного текста, а мета-данные включают информацию, необходимую для доставки и отображения письма.
2. Метод добавления
Дополните фрагмент кода для отправки email с прикреплённым файлом. В коде используется библиотека PHPMailer для работы с электронной почтой. Вам нужно вызвать метод объекта $mail, который позволяет добавить файл-вложение к письму, и передать ему путь к файлу в виде строки. Путь к файлу указан в комментарии. Заполните пропуски так, чтобы документ был корректно прикреплён к письму.
<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);
$mail->setFrom('sender@example.com', 'Отправитель');
$mail->addAddress('recipient@example.com', 'Получатель');
$mail->Subject = 'Письмо с документом';
$mail->Body = 'Во вложении находится документ';
// Прикрепите файл documents/contract.pdf
$mail->input1S(input2S);
$mail->send();
?>3. Переименование файла
В коде нужно правильно добавить вложение к email-сообщению с помощью метода addAttachment(). Файл с именем 'report_2023_final_v2.pdf' хранится в папке 'uploads' на сервере, но получатель письма должен увидеть его под более простым и понятным именем 'Report.pdf'. Используйте выпадающие списки, чтобы выбрать правильные аргументы для метода: первый должен указывать на реальное расположение файла, второй — на имя, которое будет отображаться в письме.
<?php
$mail = new PHPMailer(true);
// Настройка параметров отправки
$mail->setFrom('sender@example.com');
$mail->addAddress('recipient@example.com');
$mail->Subject = 'Отчет за 2023 год';
// Добавление вложения с переименованием
$mail->addAttachment(input1S, input2S);
$mail->send();4. Порядок сборки
Перед вами строки кода PHP для отправки письма с вложением с использованием библиотеки PHPMailer. Код представлен в перемешанном порядке. Восстановите правильную последовательность строк, чтобы получился рабочий скрипт отправки email. Учтите, что строка с подключением библиотеки должна быть первой, создание объекта - второй, а отправка - последней. Остальные строки (настройка отправителя, получателя и добавление вложения) можно расставить в любом порядке между созданием объекта и отправкой.
$mail->addAddress('client@example.com', 'Иван Иванов');$mail->setFrom('noreply@example.com', 'Отдел рассылок');$mail->send();$mail = new PHPMailer\PHPMailer\PHPMailer();require 'vendor/autoload.php';$mail->addAttachment('/путь/к/файлу/document.pdf', 'Документ.pdf');5. Несуществующий файл
Проанализируйте представленный код отправки email с вложением через PHPMailer. В коде указан неверный путь к файлу для вложения. Определите, что произойдет при выполнении этого кода.
<?php
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 = 'password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('from@example.com', 'Отправитель');
$mail->addAddress('to@example.com', 'Получатель');
$mail->Subject = 'Тестовое письмо с вложением';
$mail->Body = 'Это тестовое сообщение';
// Указан неверный путь к файлу
$mail->addAttachment('/var/www/nonexistent_file.pdf');
$mail->send();
echo 'Письмо успешно отправлено';
} catch (Exception $e) {
echo "Письмо не отправлено. Ошибка: {$mail->ErrorInfo}";
}
?>6. Исправление пути
В приведённом фрагменте PHP-кода для отправки email с вложением допущена ошибка в указании пути к прикрепляемому файлу. Используется относительный путь, который может не работать в зависимости от того, откуда запускается скрипт. Найдите и исправьте строку, чтобы путь к файлу стал абсолютным и надёжно работал независимо от точки запуска скрипта.
<?phpuse PHPMailer\PHPMailer\PHPMailer; $mail = new PHPMailer();$mail->setFrom('sender@example.com');$mail->addAddress('recipient@example.com');$mail->Subject = 'Отчёт за месяц';$mail->addAttachment('uploads/report.pdf');$mail->send();7. Отправка картинки
Соберите из предложенных строк PHP-код для отправки электронного письма с прикреплённым изображением 'logo.png' с помощью библиотеки PHPMailer. Расположите строки в следующем логическом порядке: открывающий тег PHP, подключение класса PHPMailer через оператор use, создание объекта почтового сообщения, указание адреса получателя, установка темы письма, добавление изображения как вложения методом addAttachment(), отправка письма. Некоторые строки являются лишними и не должны входить в решение.
<?phpuse PHPMailer\PHPMailer\PHPMailer;$mail = new PHPMailer();$mail->addAddress('user@example.com');$mail->Subject = 'Логотип компании';$mail->addAttachment('logo.png');$mail->send();$mail->Attachment = 'logo.png';attach($mail, 'logo.png');