E-Mails via PHP auslesen funktioniert noch nicht 100%

Werner S

Neues Mitglied
Grüß euch,

einfach just4fun, um mich mit imap_open mal auseinanderzusetzen möchte ich mal Versuchen meine E-Mails via PHP auszulesen.
Soweit ist das kein Problem.
Der Betreff, Absender sogar der Inhalt werden richtig dar gestellt.

Das Problem fängt an wenn sich in der Mail ein Anhang befindet.
Hat die Mail einen Anhang, wird zwar dieser gespeichert aber der E-Mail Inhalt, in dem Fall der Text nicht ausgegeben.
Ich habe die PHP Doku schon bemüht und einiges Versucht aber noch keine Lösung gefunden.

Der Übersicht habe ich das ganze Script mal in eine Datei gepackt

PHP:
function get_decode_value($message, $encoding)
{
    switch ($encoding) {
        case 0:
        case 1:
            $message = imap_8bit($message);
            break;
        case 2:
            $message = imap_binary($message);
            break;
        case 3:
        case 5:
            $message = imap_base64($message);
            break;
        case 4:
            $message = imap_qprint($message);
            break;
    }
    return $message;
}

$srv = '{imap.gmail.com:993/imap/ssl}INBOX';
$usr = 'xxxx';
$pw = 'xxxx';
$mailbox = imap_open($srv, $usr, $pw) or die('Cannot connect to Mailserver: ' . imap_last_error());
$emails = imap_search($mailbox, 'ALL');

foreach ($emails as $m) {
    $header = imap_headerinfo($mailbox, $m);
    $messages = imap_fetchbody($mailbox, $m, 1);
    $structure = imap_fetchstructure($mailbox, $m);

    // Attachment
    $message = array();
    $message["attachment"]["type"][0] = "text";
    $message["attachment"]["type"][1] = "multipart";
    $message["attachment"]["type"][2] = "message";
    $message["attachment"]["type"][3] = "application";
    $message["attachment"]["type"][4] = "audio";
    $message["attachment"]["type"][5] = "image";
    $message["attachment"]["type"][6] = "video";
    $message["attachment"]["type"][7] = "other";

    // Damit die Nachricht korrekt dargestellt werden kann muss ermittelt werden wie diese kodiert ist
    $part = $structure->parts[1];

    // Attachment
    $att = '';
    for ($jk = 1; $jk <= imap_num_msg($mailbox); ++$jk) {
        // Prüfen ob Anhang
        if (isset($structure->parts)) {
            $parts = $structure->parts;
            $fpos = 2;
            for ($i = 1; $i < count($parts); $i++) {

                $part = $parts[$i];
                if (isset($part->disposition) == "INLINE") {
                    $message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
                    $message["subtype"][$i] = strtolower($part->subtype);
                    $ext = $part->subtype;
                    $params = $part->dparameters;
                    $filename = $part->dparameters[0]->value;
                    $body = "";
                    $data = "";
                    $body = imap_fetchbody($mailbox, $jk, $fpos);
                    $inhalt1 = get_decode_value($body, $part->type);
                    //Schreibe Anhänge in Datei
                    $fp = fopen('file/' . $part->dparameters[0]->value, 'w+');
                    fwrite($fp, $inhalt1);
                    fclose($fp);
                    $att .= $part->dparameters[0]->value . ';';
                    $ticket_array['attachment'] = $att;
                    $fpos++;
                }
            }
        }
    }

    if ($part->encoding == 3) {
        $messages = imap_base64($messages);
    } else if ($part->encoding == 1) {
        $messages = imap_8bit($messages);
    } else {
        $messages = imap_qprint($messages);
    }

    echo 'Betreff: ' . imap_utf8($header->subject) . '<br>';
    echo 'Absender: ' . $header->fromaddress . '<br>';
    echo 'Nachricht: ' . $messages . '<hr>';
}
Ich hoffe mir kann da jemand weiter helfen.
 

asc

Mitglied
devCommunity-Experte
Hey, ich weiß, dass es nicht die feine Art ist bei solchen Problemen mit irgendwelchen Libraries anzukommen, aber ich habe selbst Erfahrungen mit den imap_*** Funktionen gemacht (machen müssen) und bin relativ schnell auf eine fertige Lösung umgestiegen.

Ich habe dieses Paket genutzt:

Vielleicht hilft es dir ja weiter :)
 

Werner S

Neues Mitglied
Hallo,

Vielleicht hilft es dir ja weiter :)
Die Librarie hab ich mir die Nacht mal angeschaut und zum laufen gebracht.
Soweit funktioniert mit dieser alles.

Allerdings möchte ich ungern auf was fertiges zurück greifen solange ich das noch nicht ganz Verstehe.
Derzeit finde ich mich gerade in Laravel ein, da wäre es Optimal wenn ich erst mal nicht auf was fertiges zurück greife.

Ich muss ehrlich Sagen, hätte nicht gedacht das es mit php imap so Schwer ist Attachment und den Message Inhalt getrennt auszugeben.
 

Werner S

Neues Mitglied
Nachtrag: Ich habe mich doch für eine Librarie entschieden. Spart Zeit, Nerven und Kaffee :D
Dazu aber in einem anderen Thread mehr.
 
Oben Unten