modo PHP corretto di allegati e-mail di parsing dal formato EML
-
25-10-2019 - |
Domanda
Ho un file contenente una e-mail in "formato di messaggio di testo normale MIME". Non sono sicuro se questo è il formato EML. L'e-mail contiene un allegato e voglio estrarre l'attaccamento e creare nuovamente i file. Questo è come l'attaccamento sembra parte come -
...
...
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--
posso vedere che la parte compresa tra X-Attachment-Id: f_gj5n2yx60
e ZyBmZyAKCjIKNDIzCnQ2Mwo=
, entrambi inclusi
è il contenuto del primo allegato. Voglio analizzare quegli allegati (nomi di file e contenuti e di creare tali file).
Ho ottenuto questo file dopo l'analisi di un file di formato dbx utilizzando un DBX Parser classe disponibili in classi PHP.
Ho cercato in molti posti e non ha trovato molte discussioni riguardo a questa qui a SO diverso da script per analizzare le email per gli allegati . Può essere Ho perso alcuni termini durante la ricerca. In quella risposta è menzionato -
è possibile utilizzare le boundries all'estratto il base64 informazioni codificate
Ma non sono sicuro che sono i confini e come esattamente di utilizzare i confini? Ci deve essere già alcune librerie o un metodo ben definito di fare questo. Credo che commetterò molti errori se provo reinventare la ruota qui.
Soluzione
C'è un'estensione PHP Mailparse, hai provato?
Il modo manuale sarebbe, elaborare la linea di posta elettronica per riga. Quando si colpisce il vostro primo header Content-Type (questo nel tuo esempio): Content-Type: multipart / mixed; boundary = 20cf3054ac85d97721049a465e12
Hai il confine. Questa stringa viene utilizzata come il confine tra le parti multiple (è per questo che lo chiamano più parti). Ogni volta che una linea inizia con i trattini e questa stringa, una nuova parte iniziare. Nel tuo esempio: --20cf3054ac85d97721049a465e12
Ogni parte inizia con le intestazioni, una riga vuota, e contenuti. Guardando il tipo di contenuto delle intestazioni è possibile determinare quali sono gli allegati, quale sia il loro tipo è e il loro nome. Leggi l'intero contenuto, spogliare gli spazi, base64_decode esso, e hai il contenuto binario del file. Fa questo aiuto?