[Programación] Re: [Programación] Re: [Programació
n] ¿Como hacer para sacar el html de
un mail con ayuda de Perl?
Nicolás Aimetti
programacion@lugro.org.ar
Fri, 30 Dec 2005 00:46:47 -0300
Hola...
Bueno, tarde o temprano tenía que sumarme...
Acá hay un pequeño boceto de como hacer para que guarde cualquier parte
text/html en donde se te ocurra
que quieras guardarla, sin que cree otro archivo más que el necesario
(ver consideración 3).
Si hubiese un application/pdf o algo así se sigue del ejemplo que hay
que agregar otro if
y seguir más o menos como indica el ejemplo...
-----------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use MIME::Parser;
my $dir = './mails';
my $parser = new MIME::Parser;
mkdir $dir || die $! if ! -e $dir;
$parser->output_under($dir);
$parser->output_dir($dir);
$parser->output_to_core(1); # esto hace que no generr los archivos por
defecto
my $entity = $parser->parse(\*STDIN) or die "parse failed\n";
for my $part ( $entity->parts ){
if( $part->effective_type() eq 'text/html' ){
#el archivo en donde lo guado se llamara... (ademas me
aseguro de no pisar nada)
my $filename = $dir. '/file_'.int(rand(100000)).'.html';
$filename = $dir.'/file_'.int(rand(100000)).'.html'
while -e $filename ;
open(my $file,">$filename") or die $!;
$part->print_body($file);
close($file);
}
}
exit(0);
__END__
----------------------------------------------
Algunas consideraciones:
1- Para testear esté ejemplo use el mail que mandaron está tarde creo a
la list lugro que contenía dos partes en el body, una con texto plano
(text/plain) que el ejemplo ignora, y otra con texto html que de la cual
se almacena el body. Puede que este ejemplo ande mal en otros contextos,
habría que laburarlo un poco bastante más.
2- A la hora de buscar documentación más vale referirse a la pagina
principal, el link anterior de la MIME:Parser
era de 1997, por tanto más vale ir a las fuente (CPAN a muerte) :
(creo que alguién ya menciono CPAN, no me puteen si soy reiterativo, más
vale que sobre que que falte)
http://search.cpan.org/~dskoll/MIME-tools-5.419/lib/MIME/Tools.pm
Antes que nada...
http://search.cpan.org/~dskoll/MIME-tools-5.419/lib/MIME/Parser.pm
Seteos generales
http://search.cpan.org/~dskoll/MIME-tools-5.419/lib/MIME/Entity.pm Acá
pasan las cosas más importantes...
http://search.cpan.org/~dskoll/MIME-tools-5.419/ El resto de las clases
que andan dando vueltas...
3- Como dice en la documentación de MIME::Parser, si al momento de
parsear el archivo no guarda las partes
en un archivo las almacena internamente en memoria lo cual puede ser MUY
PELIGROSO(puede llegar a consumir demasiados recursos sobre todo su hay
attach grandes), lo cual invalida completamente el ejemplo anterior...
Lo que yo haría sería dejar todo más o menos como está pero permitir que
cree los temporales estos y despumes simplemente borrarlos... No conozco
mucho esta clase, pero le prestaría atención a las opciones new_tmpfile
y algunas otras que andan dando vueltas... Ojo, tendría que investigar
un poco, pero seguramente alguna vuelta se le puede encontrar para hacer
esto de la forma más segura...
Bueno, espero que sirva de algo...
Saludos,
Nicolás.
Sebastián D. Criado wrote:
>El Lunes 26 Diciembre 2005 13:39, Federico Wiecko escribió:
>
>
>>On Monday 26 December 2005 13:04, Sebastián D. Criado wrote:
>>
>>
>>>El Lunes 26 Diciembre 2005 12:14, Federico Wiecko escribió:
>>>
>>>
>>>>Hola Sebastian,
>>>>
>>>>hace años que no estoy con esto, pero me parece innecesario meterse a
>>>>parsear html cuando sólo necesitas extraerlo a un archivo.
>>>>
>>>>Probá utilizar MIME::Parser, aqui van algunos ejemplos de uso:
>>>>
>>>>http://www.unbf.ca/its/documentation/perl/mime/Parser.pm.html
>>>> http://www.hmug.org/man/3/MIME::Parser.php
>>>>
>>>>
>>>Encotnre un ejemplo de MIME::Parser bastante útil.
>>>http://www.cs.indiana.edu/~kinzler/home/binp/mimeexplode
>>>
>>>Funciona dejandote los archivos obtenidos en un directorio que crea on
>>>the fly.
>>>
>>>Ahora solo me queda ver como hago para que me deje siempre el mismo
>>>nombre de archivo y que pueda hacer una u otra cosa leyendo el Subject.
>>>
>>>
>>fijate la opción output_prefix, si no es esa .. fijate en el manual page.
>>
>>
>>
>>>Necesti algún otro modulo para leer el subject del mail o simplemente
>>>busco la cadena y comparo?
>>>
>>>
>>No, el módulo Parser parsea el MIME y mantiene un hash de cada cabecera.
>>Por ejemplo, para leer el subject tenes que hacer
>>
>>my $parser= new MIME::Parser;
>>$entity=$parser->read(\*STDIN) or Error::error "No se pudo parsear la
>>entrada";
>>my $head = $entity->head;
>>my $body= $entity->bodyhandle;
>>
>>$subject=$head->get('Subject',0)
>>
>>
>Todo lo otro me funciono perfecto, muchas gracias, ahora me queda esta duda.
>Quiero obtener solo una parte del mail. En un caso es un pdf y en otro un html
>El tema es que cuando hace el parseo me deja 3 archivos por cada mail con el
>nombre del prefix y un numero.
>
>Yo lo que quiero es que me deje directamente un archivo llamado
>
>
>file.html
>o
>file.pdf
>
>y descartar lo demas.
>
>Es estado viendo la documentacion de CPAN y lo único que esta es el prefix lo
>cual he usado, pero tengo que andar renombrando los archivos usando wildcard.
>
>Sañuidos._
>
>
>