lire un email en php
Le tite est vague mais, l’idée ici est de lire un email et de sauvegarder les fichiers joints pour une utilisation future.
On part donc d’un email simple avec une image en pièce jointe.
Return-Path: <@gmail.com>
Received: from ?10.0.1.182? ( [82])
by mx.google.com with ESMTPS id 3sm630
(version=TLSv1/SSLv3 cipher=RC4-MD5);
Mon, 25 Aug 2008 03:34:49 -0700 (PDT)
Message-ID: <@gmail.com>
Date: Mon, 25 Aug 2008 12:34:51 +0200
From: Fabien <@gmail.com>
User-Agent: Thunderbird 2.0.0.16 (Windows/20080708)
MIME-Version: 1.0
To: Fabien <@gmail.com>
Subject: un simple mail
Content-Type: multipart/mixed;
boundary="------------060409080107000002080809"
This is a multi-part message in MIME format.
--------------060409080107000002080809
Content-Type: multipart/alternative;
boundary="------------070202030505050805080302"
--------------070202030505050805080302
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
avec un texte :p
--------------070202030505050805080302
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#3366ff">
<font face="Calibri">avec un texte :p<br>
</font>
</body>
</html>
--------------070202030505050805080302--
--------------060409080107000002080809
Content-Type: image/jpeg;
name="Dora-the-explorer-large.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="Dora-the-explorer-large.jpg"
/9j/4AAQSkZJRgABAgEASABIAAD/wAARCAGwAVIDAREAAhEBAxEB/9sAhAABAQEBAQEBAQEB
....
ngcqq4qTqy5FSp1akGpNKHNUulCk0pulVbbnOLjJ
--------------060409080107000002080809
Content-Type: image/jpeg;
name="Dora-the-explorer.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="Dora-the-explorer.jpg"
/9j/4AAQSkZJRgABAgEASABIAAD/Epg1BJRHu2KzbT34PFelD4EOKskelQXIXDcHPXnkVdTI
....
M1Qg8R2zQhSWnmgAcwoMl27AnoAOtZuSTszZyP/Z
L’idée ici est de repérer 3 éléments : les entêtes (headers), le corps du message et les fichiers joints.
On remarque une chaine répétée plusieurs fois :
------------060409080107000002080809
et
------------070202030505050805080302
Ce sont les frontières du mail. La première sépare l’entête du corps du message et des pièces jointes.
La seconde sépare les éléments dans le corps du message (écriture format HTML ou non). Ces frontières sont générées à chaque mail et sont unique dans chaque email.
On va donc faire un script en php qui va “couper” le mail en multiples parties : le header, le mail en lui même puis une partie par pièce jointe.
Ici, je me sers de la fonction eval, celle ci permet d’exécuter un texte comme un script php.
Je l’emploie car la variable utilisée dans base64_decode est trop variable.
Si l’image est petite, le code peut être : base64_decode($more[1]).
Si en revanche elle est très grande, le code devient : base64_decode($more[1].$more[2].$more[3]…).
Ici je crée une chaine ($img) qui va contenir $more[1] ou $more[1].$more[2], ou $more[1]…$more[10] … sans trop consommer la mémoire.