2008-10-02 6 views
6

Ich habe PHP die E-Mail-Lese-Funktionen für den Großteil der zwei Tage gekämpft. Ich schreibe ein Skript, um E-Mails von einem Postfach zu lesen und Anhänge auf dem Server zu speichern. Wenn Sie jemals etwas Ähnliches getan haben, können Sie meinen Schmerz verstehen: PHP spielt nicht gut mit E-Mail!Wie kann ich E-Mail-Anhänge auf dem Server in PHP speichern?

Ich habe mit dem POP3-Server verbunden und ich kann die Dateien iterieren. Hier ist eine grobe Gliederung des Codes:

if (!$mbox = imap_open ("{myserver.com:110/pop3/notls}INBOX", "u", "p")) 
    die ('Cannot connect/check mail! Exiting'); 

if ($hdr = imap_check($mbox)) 
    $msgCount = $hdr->Nmsgs; 
else 
    die ("Failed to get mail"); 

foreach ($overview as $message) { 
    $msgStruct = imap_fetchstructure($mbox, $message->msgno); 

    // if it has parts, there are attachments that need reading 
    if ($msgStruct->parts) { 
     foreach ($msgStruct->parts as $key => $part) { 
      switch (strtoupper($part->subtype)) { 
       case 'GIF': case 'JPEG':case 'PNG': 

        //do something - but what?! 

        break; 
      } 
     } 
    } 
} 

Ich habe markiert, wo ich feststecke. Ich kann imap_fetchbody($mbox, $message->msgno, $key+1) verwenden, aber das wird mir ein Bündel von Daten wie folgt aus:

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S 
EhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU 
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR 
CAHiAi0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA 
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK 
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG 
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA 
... 

Ich bin zu der Annahme verleiten, dass diese MIME-Daten ist. Ich brauche es als Bild! Ich habe mehrere Klassen im Internet bombardieren sehen, die behaupten, die erforderliche Zauberei zu machen. Ich kann keine von ihnen zur Arbeit bekommen. Ich verstehe nicht, warum ich das so schwer finde!

In Kürze, ich bin auf der Suche nach etwas, das eine rohe MIME-Zeichenfolge in echte Daten verwandeln kann.

+0

haben Sie überprüft, was die Anlage Codierung ist? – kender

+0

Hey, kannst du ein vollständigeres Snippet posten? Ich kann nicht scheinen, es zu arbeiten, bc ich bin nicht sicher, wo $ überblick kommt von – st4ck0v3rfl0w

+0

Ich habe das gleiche Problem wie Ihr. Ich fand einen guten Artikel, und ich denke, es könnte Ihnen helfen http://www.linuxscope.net/articles/mailAttachmentsPHP.html genießen Sie es :) – Hassan

Antwort

4

ich eine kurze Anleitung gefunden, wie E-Mails zu behandeln, die mit PHP: here.

Am unteren Ende dieser Seite gibt es einen Befestigungskörper echo:

if (substr($ContentType,0,4) == "text") { 
echo imap_qprint($fileContent); 
} else { 
echo imap_base64($fileContent); 
} 

Ich denke, das ist das, was man so braucht ...

(edit: in Ihrem Fall, wenn es Bild ist immer Sie können die if Teil überspringen. und natürlich die Datei speichern, anstatt es zu Echo :)

+0

Arbeitete wie ein Charme. Ja, ich mache bereits die Content-Type-Erkennung (mit meiner switch-Anweisung), also brauchte ich nur die imap_base64. – Oli

1

MIME-Daten ist Base64-codierte, also denke ich, sollten Sie in der Lage sein, sie zu entschlüsseln base64_decode mit

1

Sie die imap_base64 Funktion und nur ausgegeben, dass in einer Datei verwenden können, oder verwenden Sie imap_savebody

+0

imap_savebody (aus meiner jüngsten Erfahrung) speichert die codierten Daten (genau so, als ob Sie fetchbody ausführen) – Oli

1

Zend Framework enthält Zend_Mail, das das Lesen von Mail-Nachrichten erleichtern soll, und Zend_Mime, von dem ich glaube, dass es eine mehrteilige Mime-Nachricht in eine sinnvolle Datenstruktur parsen kann.

http://framework.zend.com/manual/en/zend.mail.read.html

+0

Ich würde gerne auf dem Zend Framework bereitstellen können, aber Hosting-Einschränkungen beschränken es. Es ist sehr schade, weil die Mail-Lese-Funktionalität in PHP einfach über alle logischen Zusammenhänge hinausgeht. – Oli

+0

Ist es die Größe des Frameworks, die dich zurückhält? Unsere Web-Apps bündeln zend framework, wenn es auf dem Webserver des Kunden nicht verfügbar ist. –