Правильный PHP-способ разбора вложений электронной почты из формата EML
-
25-10-2019 - |
Вопрос
У меня есть файл, содержащий электронное письмо в "формате обычного текстового MIME-сообщения".Я не уверен, что это формат EML.Электронное письмо содержит вложение, и я хочу извлечь вложение и снова создать эти файлы.Вот как выглядит крепежная часть -
...
...
Receive, deliver details
...
...
From: sac ascsac <sacsac@sacascsac.ascsac>
Date: Thu, 20 Jan 2011 18:05:16 +0530
Message-ID: <AANLkTimmSL0iGW4rA3tvSJ9M3eT5yZLTGsqvCvf2fFC3@mail.gmail.com>
Subject: Test attachments
To: ascsacsa@ascsac.com
Content-Type: multipart/mixed; boundary=20cf3054ac85d97721049a465e12
--20cf3054ac85d97721049a465e12
Content-Type: multipart/alternative; boundary=20cf3054ac85d97717049a465e10
--20cf3054ac85d97717049a465e10
Content-Type: text/plain; charset=ISO-8859-1
hello this is a test mail. It contains two attachments
--20cf3054ac85d97717049a465e10
Content-Type: text/html; charset=ISO-8859-1
hello this is a test mail. It contains two attachments<br>
--20cf3054ac85d97717049a465e10--
--20cf3054ac85d97721049a465e12
Content-Type: text/plain; charset=US-ASCII; name="simple_test.txt"
Content-Disposition: attachment; filename="simple_test.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gj5n2yx60
aGVsbG8gd29ybGQKYWMgYXNj
...
encoded things here
...
ZyBmZyAKCjIKNDIzCnQ2Mwo=
--20cf3054ac85d97721049a465e12
Content-Type: application/x-httpd-php; name="oscomm_backup_code.php"
Content-Disposition: attachment; filename="oscomm_backup_code.php"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gj5n5gxn1
PD9waHAKCg ...
...
encoded things here
...
X2xpbmsoRklMRU5BTUVfQkFDS1VQKSk7Cgo/Pgo=
--20cf3054ac85d97721049a465e12--
Я вижу, что часть между X-Attachment-Id: f_gj5n2yx60
и ZyBmZyAKCjIKNDIzCnQ2Mwo=
, оба в том числе
является содержанием первого вложения.Я хочу проанализировать эти вложения (имена файлов и содержимое и создать эти файлы).
Я получил этот файл после синтаксического анализа файла формата dbx с помощью Анализатор DBX класс доступен в классах PHP.
Я искал во многих местах и не нашел особого обсуждения этого здесь, в SO, кроме Скрипт для анализа электронных писем на наличие вложений.Возможно, я пропустил некоторые термины при поиске.В этом ответе упоминается -
вы можете использовать границы для извлечения информации в кодировке base64
Но я не уверен, какие это границы и как именно их использовать?Уже должны существовать какие-то библиотеки или какой-то четко определенный метод для этого.Я предполагаю, что совершу много ошибок, если попытаюсь здесь заново изобрести велосипед.
Решение
Есть расширение PHP Mailparse, вы его пробовали?
Ручным способом было бы обрабатывать почту построчно.Когда вы нажимаете свой первый заголовок Content-Type (этот в вашем примере):Тип содержимого:многокомпонентный/смешанный;граница=20cf3054ac85d97721049a465e12
У вас есть граница.Эта строка используется в качестве границы между вашими несколькими частями (вот почему они называют ее составной).Каждый раз, когда строка начинается с тире и этой строки, начинается новая часть.В вашем примере:--20cf3054ac85d97721049a465e12
Каждая часть будет начинаться с заголовков, пустой строки и содержимого.Взглянув на тип содержимого заголовков, вы можете определить, какие из них являются вложениями, каков их тип и имя файла.Прочитайте все содержимое, уберите пробелы, base64_decode его, и вы получите двоичное содержимое файла.Помогает ли это?