Mail-Anhänge speichern

Funky_MF

Erfahrenes Mitglied
Ich bin auf der Such nach einer Möglichkeit, wie ich Anhänge von Mails, welche ich per imap-Funktion von einer POP3-Mailbox abhole, automatisch auf dem Webserver speichern kann, der Pfad und den Dateinamen möchte ich in eine DB speichern.

Nach Durcharbeiten etlicher Tutorial-Threads hab ich Dennis' Wronkas Skript gefunden:
http://www.tutorials.de/forum/php/249388-e-mailfunktionen-pop3-anhaenge-werden-nicht-erkannt.html

PHP:
<?php 
ob_start(); 
session_start(); 
//require("config.php"); 
if ((isset($_GET['msgid'])) && (isset($_GET['part']))) 
    { 
        $mbox=imap_open("{localhost/pop3:110}INBOX", "Name", "Passwort"); 
        $struct=imap_fetchstructure($mbox,$_GET['msgid']); 
        $body=imap_fetchbody($mbox,$_GET['msgid'],$_GET['part']+1); 
        imap_close($mbox); 
        if ($struct->parts[$_GET['part']]->type==0) 
            { 
                $content_type="text"; 
            } 
        elseif ($struct->parts[$_GET['part']]->type==4) 
            { 
                $content_type="audio"; 
            } 
        elseif ($struct->parts[$_GET['part']]->type==5) 
            { 
                $content_type="image"; 
            } 
        //elseif ($struct->parts[$_GET['part']]->type==3) 
        else 
            { 
                $content_type="application"; 
            } 
        $content_type.="/".strtolower($struct->parts[$_GET['part']]->subtype); 
        $content_disposition=strtolower($struct->parts[$_GET['part']]->disposition); 
        
        header("Content-Type: ".$content_type); 

        header("Content-Disposition: ".$content_disposition."; filename=\"".$struct->parts[$_GET['part']]->dparameters[0]->value."\""); 
        if ($struct->parts[$_GET['part']]->encoding==3) 
            { 
                $body=base64_decode($body); 
            } 
        if ($struct->parts[$_GET['part']]->encoding==4) 
            { 
                $body=quoted_printable_decode($body); 
            } 
        echo $body; 
    } 
ob_end_flush(); 
?>

Ich denke damit komme ich zurecht, nur weiß ich nicht wie ich nun anstelle des Downloads die Anhänge direkt abspeichere. Ich bin aber der Meinung, daß ich an der Stelle, wo die Header gesendet werden, den Code entsprechend abändern muß...?

Kann mir jemand weiterhelfen ?
 
Die Teilinhalte selbst befinden sich jeweils in der $body-Variable. Es sollte also kein Problem sein den Wert dieser Variable in einer Datei zu speichern statt ihn direkt auszugeben. Zusätzlich solltest du jedoch noch den MIME-Typ und die Kodierung speichern, damit die Daten später richtig verarbeitet werden können.
 
Danke, soweit habe ich mir das schon gedacht, aber kannst du mir da mal auf die Sprünge helfen, wie ich da genau vorgehe, bzw. welche Funktion ich da verwenden muß ?
 
Den Dateinamen zum Speichern kannst Du in dieser Zeile sehen:
PHP:
header("Content-Disposition: ".$content_disposition."; filename=\"".$struct->parts[$_GET['part']]->dparameters[0]->value."\"");
Er befindet sich in $struct->parts[$_GET['part']]->dparameters[0]->value
Mit fopen() erstellst Du also diese Datei, decodierst gegebenenfalls den Anhand und schreibst ihn in die Datei.
Also ca. so:
PHP:
if ($struct->parts[$_GET['part']]->encoding==3)
{
 $body=base64_decode($body);
}
if ($struct->parts[$_GET['part']]->encoding==4)
{
 $body=quoted_printable_decode($body);
}
$attachment=fopen($struct->parts[$_GET['part']]->dparameters[0]->value,'w');
fwrite($attachment,$body);
fclose($attachment);
Dies setzt Du dann anstelle dieses Codes ein:
PHP:
        header("Content-Type: ".$content_type); 

        header("Content-Disposition: ".$content_disposition."; filename=\"".$struct->parts[$_GET['part']]->dparameters[0]->value."\""); 
         if ($struct->parts[$_GET['part']]->encoding==3) 
            { 
                $body=base64_decode($body); 
            } 
        if ($struct->parts[$_GET['part']]->encoding==4) 
            { 
                $body=quoted_printable_decode($body); 
            } 
        echo $body; 
    }
 
Alles klar, fopen() und fwrite() war das, was ich gesucht hab, stand mal wieder völllig auf dem Schlauch....

Vieln Dank !
 
Zurück