mailparse php как пользоваться есть файлы *.eml

Для работы с файлами .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:
      text
      extension=php_mbstring.dll
      extension=php_mailparse.dll
    • Перезапустите веб-сервер (например, Apache).
  • На Linux:
    • Установите расширение с помощью пакетного менеджера или PECL:
      bash
      pecl install mailparse
    • Добавьте extension=mailparse.so в php.ini.
    • Перезапустите веб-сервер.

Проверьте, что расширение установлено, выполнив команду:

bash
php -m | grep mailparse

Должно вывести mailparse.


2. Использование php-mime-mail-parser (рекомендуемый способ)

Библиотека php-mime-mail-parser является удобной оберткой над mailparse и упрощает работу с .eml файлами. Она позволяет легко извлекать заголовки, тело письма и вложения.

Установка php-mime-mail-parser

Установите библиотеку через Composer:

bash
composer require php-mime-mail-parser/php-mime-mail-parser

Пример кода для парсинга .eml файла

php
<?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
<?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
<?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 файлов без внешних расширений.

6. Полезные замечания

  • Память: mailparse работает с потоками, что делает его эффективным для обработки больших .eml файлов. Всегда освобождайте ресурсы с помощью mailparse_msg_free.
  • Кодировка: Если вы работаете с текстами на разных языках, убедитесь, что кодировка корректно обрабатывается (например, через mb_convert_encoding).
  • Антивирус: Перед открытием .eml файлов рекомендуется проверять их на вирусы, так как они могут содержать вредоносный код (например, вирус Nimda).
  • Ошибки: Если возникают ошибки, проверьте логи PHP и убедитесь, что файл .eml доступен и корректен.

7. Пример извлечения email-адресов

Если вам нужно извлечь, например, адрес получателя (To) из .eml файла:

php
<?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-адрес с помощью регулярного выражения.


Если у вас есть конкретные вопросы или задачи (например, извлечение определённых заголовков или работа с вложениями), уточните, и я предоставлю более детальный пример!

25 веб-страниц
3,9s
Как Grok может помочь?