entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Script para guardar correos de un Inbox como archivos .eml

Estoy ahora por crear un Script que lea un inbox y los correos que allá encuentre los guarde en una carpeta como correos que son. Es decir, que coja los correos, los lea y los guarde tal como están en un archivo .eml cada correo.

Por ahora abro correctamente la bandeja de correos usando la función imap_open tal como veréis en el ejemplo. Leo los correos también correctamente porque haciendo echo $message; logro ver el mensaje por pantalla pero sin embargo la función imap_savebody no me funciona correctamente. ¿Qué estoy haciendo mal? No logro ver el fallo.

Gracias!

<?
//** Setting for connecting to the mailbox **\\
    $mailserver = 'host';
    $port = '143';
    $user = 'domain\user';
    $pass = 'pwpw';

    $mbox=imap_open("{".$mailserver.":".$port."/imap/notls/novalidate-cert}INBOX/Test_Inbox", $user, $pass) or die(var_dump(imap_errors()));

    //Connecting to the mailbox end\\

    if ($hdr = imap_check($mbox)) 
    {
        //Contamos los correos por si lo necesitamos
        $msgCount = $hdr->Nmsgs;

    }
    else 
    {

        echo "Failed to get mail";

    }

    $result = imap_search($mbox, 'ALL', SE_UID);
    $output='';
    //var_dump($result);
    if ($result == false)
    {
        $output.='<tr><td colspan=3 class="white_centered" style="width:100%">There are currently no e-mails to show here</td></tr>';
    }
    $i=1;
    $j=1;
    foreach($result as $uid) 
    {
        //echo $uid;

        /* get information specific to this email */
        $overview = imap_fetch_overview($mbox,$uid,FT_UID);
        $overview2 = imap_headerinfo($mbox,$i);
        //var_dump($overview2);
        $message = imap_body($mbox,$uid,FT_UID);
        $s = imap_fetchstructure($mbox,$uid,FT_UID);
        $part = $s->parts[1];
        //var_dump($s);
        if ($s->encoding==4)

            $message = quoted_printable_decode($message);

        elseif ($s->encoding==3)

            $message = base64_decode($message);

        //Este echo funciona y puedo ver dos mensajes de prueba que tengo en ese INBOX/Test_Inbox
        $echo $message;
        //ESTA PARTE ES LA QUE NO FUNCIONA CORRECTAMENTE
        //*******************************************//

        //Asigno nombres genéricos a los correos, en el futuro podría usar un ID o bien el propio asunto del correo ($overview[0]->subject)
        $File = "mail".$j.".eml"; 
        $Handle = fopen($File, 'w');
        stream_filter_append($handle, 'convert.base64-decode', STREAM_FILTER_WRITE); 
        imap_savebody($mbox, $handle, $uid, "", FT_UID);
        //fwrite($Handle, imap_body($mbox,$uid,FT_UID)); 
        fclose($Handle);
        $j++;
    }

    //echo $output;*/

//$mbox=imap_open("{".$mailserver.":".$port."/imap/notls/novalidate-cert}INBOX/Inbox2", $user, $pass) or die(var_dump(imap_errors())); 

imap_close($mbox, CL_EXPUNGE);

imap_close($mbox);

?>

1 Respuesta

3votos

ankeorum Puntos7210

He encontrado una solución, si tenéis alguna otra comentad por favor.

Mi solución ha sido esta (pongo solo el bucle foreach que recorre todos los correos y los trata para no repetir todo el código):

foreach($result as $uid) 
    {
        //echo $uid;

        /* get information specific to this email */
        $headers = imap_fetchheader($mbox, $uid, FT_UID);
        $overview = imap_fetch_overview($mbox,$uid,FT_UID);
        $overview2 = imap_headerinfo($mbox,$i);
        //var_dump($overview2);
        $message = imap_body($mbox,$uid,FT_UID);
        $s = imap_fetchstructure($mbox,$uid,FT_UID);
        $part = $s->parts[1];
        //var_dump($s);
        /*if ($s->encoding==4)

            $message = quoted_printable_decode($message);

        elseif ($s->encoding==3)

            $message = base64_decode($message);
        */

        file_put_contents("mail".$j.".eml", $headers ."\n".$message);
        /*  
        $File = "mail".$j.".eml"; 
        $Handle = fopen($File, 'w');
        //stream_filter_append($handle, 'convert.base64-decode', STREAM_FILTER_WRITE); 
        //imap_savebody($mbox, $handle, $uid, "", FT_UID);
        fwrite($Handle, imap_body($mbox,$uid,FT_UID)); 
        fclose($Handle);*/
        $j++;
    }

1voto

Peter comentado

Gracias por compartir la solución! :D

1voto

ankeorum comentado

Construyendo comunidad! :-). Si alguien tiene una mejor solución que no dude en compartirla, gracias.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta