By using imap_fetchbody() you may run in trouble by using too much memory. Using imap_savebody() may prevent this.
But the content will be encoded, in other words it is useless. Adding a filter can help here.
<?php
$whandle = fopen('./incomming/tmp.tif','w');
stream_filter_append($whandle,
'convert.base64-decode',STREAM_FILTER_WRITE);
imap_savebody ($mbox, $whandle, $i, $partcounter++);
fclose($whandle);
?>
NOTE: To find the proper filter you need to check the encoding given by the structure of the body.
imap_savebody
(PHP 5 >= 5.1.3)
imap_savebody — Sauvegarde une partie spécifique du corps dans un fichier
Description
$imap_stream
, mixed $file
, int $msg_number
[, string $part_number = ""
[, int $options = 0
]] )Sauvegarde une partie du corps du message spécifié.
Liste de paramètres
-
imap_stream -
Un flux IMAP retourné par la fonction imap_open().
-
file -
Le chemin vers le fichier de sauvegarde, sous la forme d'une chaîne de caractères ou un descripteur de fichier valide retourné par la fonction fopen().
-
msg_number -
Le numéro du message
-
part_number -
Le numéro de la section. C'est une chaîne de caractères d'entiers, délimités par une virgule qui correspondent à l'index dans la liste des sections du corps, tel que prévu par la spécification IMAP4.
-
options -
Un masque qui contient une ou plusieurs des valeurs suivantes :
-
FT_UID- Le numéromsg_numberest un UID -
FT_PEEK- Ne pas définir le drapeau \Seen s'il n'est pas déjà défini -
FT_INTERNAL- La chaîne de caractères retournée est dans un format interne, qui ne correspondant pas à CRLF.
-
Valeurs de retour
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
It seems that imap_savebody saves attachments with special characters above ascii 127 as quoted printable.
But if you need it in utf8, you may use the imap_qprint function after the attachment is saved:
<?php
$tFile = "/path/to/attachment";
$tFileOutput="";
$tFileHandle = fopen($tFile, "r");
//get the content of the file into a string
while(!feof($tFileHandle))
$tFileOutput = $tFileOutput . fgets($tFileHandle, 4096);
fclose ($tFileHandle);
$tFileHandle = fopen($tFile, "w");
//write the new 8Bit string to the file
fwrite($tFileHandle, imap_qprint($tFileOutput));
fclose ($tFileHandle);
?>
I tried to use this function. But it seems it requires php_zip.dll to be load.. i got the php errror like below.
[20-Dec-2007 13:38:17] PHP Warning: PHP Startup: Unable to load dynamic library './php_zip.dll' - ./php_zip.dll: cannot open shared object file: No such file or directory in Unknown on line 0
[20-Dec-2007 13:38:17] PHP Fatal error: Call to undefined function imap_savebody() in /opt/oss/share/apache2/htdocs/blogtest/wp-inst/batch/pop3_mail.php on line 153
This function will save ALL information from the email if the part number is left out. Pretty handy for archiving.
