Для работы с файлами .eml в PHP с использованием расширения mailparse можно использовать как само расширение mailparse, так и библиотеку, которая его оборачивает, например, php-mime-mail-parser. Расширение mailparse — это эффективный инструмент для парсинга email-сообщений, включая .eml файлы, с поддержкой MIME (RFC 822, 2822, 5322). Ниже приведены основные шаги и примеры, как использовать mailparse для работы с .eml файлами.
1. Установка расширения mailparse
Для начала убедитесь, что расширение mailparse установлено:
- На Windows:
- Скачайте DLL-файл php_mailparse.dll с сайта PECL.

- Поместите его в папку с расширениями PHP (обычно ext/ в директории PHP).
- Добавьте строку extension=php_mailparse.dll в php.ini.
- Убедитесь, что расширение mbstring загружается до mailparse в php.ini:
textextension=php_mbstring.dllextension=php_mailparse.dll
- Перезапустите веб-сервер (например, Apache).
- Скачайте DLL-файл php_mailparse.dll с сайта PECL.
- На Linux:
- Установите расширение с помощью пакетного менеджера или PECL:
bashpecl install mailparse
- Добавьте extension=mailparse.so в php.ini.
- Перезапустите веб-сервер.
- Установите расширение с помощью пакетного менеджера или PECL:
Проверьте, что расширение установлено, выполнив команду:
php -m | grep mailparseДолжно вывести mailparse.
2. Использование php-mime-mail-parser (рекомендуемый способ)
Библиотека php-mime-mail-parser является удобной оберткой над mailparse и упрощает работу с .eml файлами. Она позволяет легко извлекать заголовки, тело письма и вложения.
Установка php-mime-mail-parser
Установите библиотеку через Composer:
composer require php-mime-mail-parser/php-mime-mail-parserПример кода для парсинга .eml файла
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpMimeMailParser\Parser;
$path = 'path/to/email.eml'; // Путь к вашему .eml файлу
// Инициализация парсера
$parser = new Parser();
// Указываем путь к файлу
$parser->setPath($path);
// Альтернативные способы ввода:
// $parser->setText(file_get_contents($path)); // из строки
// $parser->setStream(fopen($path, 'r')); // из потока
// Извлечение заголовков
$from = $parser->getHeader('from');
$to = $parser->getHeader('to');
$subject = $parser->getHeader('subject');
// Извлечение тела письма
$text = $parser->getMessageBody('text'); // Текстовое тело
$html = $parser->getMessageBody('html'); // HTML тело
// Извлечение вложений
$attachments = $parser->getAttachments();
foreach ($attachments as $attachment) {
echo 'Имя файла: ' . $attachment->getFilename() . "\n";
echo 'Тип: ' . $attachment->getContentType() . "\n";
echo 'Размер: ' . filesize($attachment->getFilename()) . " байт\n";
// Сохранение вложения
$attachment->save('/path/to/save/attachments/', \PhpMimeMailParser\Parser::ATTACHMENT_DUPLICATE_SUFFIX);
}
// Вывод информации
echo "From: $from\n";
echo "To: $to\n";
echo "Subject: $subject\n";
echo "Text: $text\n";
echo "HTML: $html\n";
?>Этот код:
- Читает .eml файл.
- Извлекает заголовки (From, To, Subject).
- Получает текстовое и HTML тело письма.
- Извлекает и сохраняет вложения.

3. Использование нативного mailparse
Если вы хотите работать напрямую с функциями mailparse, вот пример, как парсить .eml файл и извлечь его части:
Пример кода
<?php
$filename = 'path/to/email.eml';
// Парсинг .eml файла
$mime = mailparse_msg_parse_file($filename);
if ($mime === false) {
die('Ошибка парсинга файла');
}
// Получение структуры сообщения
$struct = mailparse_msg_get_structure($mime);
// Вывод информации о каждой части
foreach ($struct as $part_id) {
$section = mailparse_msg_get_part($mime, $part_id);
$info = mailparse_msg_get_part_data($section);
echo "Часть: $part_id\n";
echo "Content-Type: " . ($info['content-type'] ?? 'не определено') . "\n";
echo "Content-Disposition: " . ($info['content-disposition'] ?? 'не определено') . "\n";
echo "Имя файла: " . ($info['disposition-filename'] ?? 'нет') . "\n";
echo "Кодировка: " . ($info['charset'] ?? 'не определено') . "\n";
// Извлечение содержимого части
ob_start();
mailparse_msg_extract_part_file($section, $filename);
$contents = ob_get_clean();
echo "Содержимое:\n" . htmlentities($contents) . "\n\n";
}
// Освобождение ресурсов
mailparse_msg_free($mime);
?>Этот код:
- Парсит .eml файл с помощью mailparse_msg_parse_file.
- Получает структуру сообщения (mailparse_msg_get_structure).
- Извлекает информацию о каждой части (заголовки, тип содержимого, вложения).
- Извлекает содержимое каждой части с помощью mailparse_msg_extract_part_file.
- Освобождает ресурсы с помощью mailparse_msg_free для предотвращения утечек памяти.


4. Извлечение вложений
Для извлечения вложений с помощью нативного mailparse можно использовать следующий пример:
<?php
$filename = 'path/to/email.eml';
$mime = mailparse_msg_parse_file($filename);
$struct = mailparse_msg_get_structure($mime);
foreach ($struct as $part_id) {
$part = mailparse_msg_get_part($mime, $part_id);
$part_data = mailparse_msg_get_part_data($part);
// Проверка, является ли часть вложением
if (isset($part_data['content-disposition']) && $part_data['content-disposition'] === 'attachment') {
$filename = $part_data['disposition-filename'] ?? $part_data['content-name'] ?? 'unknown';
$contents = mailparse_msg_extract_part($part, file_get_contents($filename), null);
// Сохранение вложения
file_put_contents('/path/to/save/' . $filename, $contents);
echo "Сохранено вложение: $filename\n";
}
}
mailparse_msg_free($mime);
?>Этот код проверяет, является ли часть сообщения вложением, и сохраняет его в указанную директорию.
5. Альтернативы
Если вы не хотите использовать mailparse, рассмотрите следующие библиотеки:
- zbateson/mail-mime-parser: Не требует расширения mailparse, но может быть медленнее. Подходит для парсинга .eml файлов без дополнительных зависимостей.
- it\icosaedro\email: Библиотека для парсинга и создания .eml файлов без внешних расширений.
.png)
6. Полезные замечания
- Память: mailparse работает с потоками, что делает его эффективным для обработки больших .eml файлов. Всегда освобождайте ресурсы с помощью mailparse_msg_free.

- Кодировка: Если вы работаете с текстами на разных языках, убедитесь, что кодировка корректно обрабатывается (например, через mb_convert_encoding).
- Антивирус: Перед открытием .eml файлов рекомендуется проверять их на вирусы, так как они могут содержать вредоносный код (например, вирус Nimda).
.png)
- Ошибки: Если возникают ошибки, проверьте логи PHP и убедитесь, что файл .eml доступен и корректен.
7. Пример извлечения email-адресов
Если вам нужно извлечь, например, адрес получателя (To) из .eml файла:
<?php
$emlContent = file_get_contents('path/to/email.eml');
$lines = explode("\n", $emlContent);
$to = '';
foreach ($lines as $line) {
if (strpos($line, 'To: ') === 0) {
preg_match('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}/i', $line, $matches);
if (!empty($matches)) {
$to = $matches[0];
}
break;
}
}
echo "To: $to\n";
?>Этот код ищет строку с заголовком To: и извлекает email-адрес с помощью регулярного выражения..png)
Если у вас есть конкретные вопросы или задачи (например, извлечение определённых заголовков или работа с вложениями), уточните, и я предоставлю более детальный пример!


