[Cascavel-pm] EL::mime - Uma nova LIB

Ednardo Lobo ednardo em elobo.cjb.net
Quarta Abril 2 18:56:16 CST 2003


On Wed, Apr 02, 2003 at 08:05:37PM -0300, Gabriel Vieira wrote:
> ultimamente não, exatamente :P
> 
> []s,
> 
> Gabriel Vieira
> 

    O  que  pretendo,   é  construir  um  "MIME::Tools"   melhor  que  o
MIME::Tools. Uma parte importante desse objetivo já está pronto, que é o
módulo EL::mime::core,  que analiza e  quebra a mensagem em  suas partes
mais macros  (head, preamble, parts,  epilogue), como é  especificado na
RFC  1521. Mapea  essas partes  em uma  estrutura complexa,  composta de
'hashes',  'arrays' e  'scalars' -  estrutura  essa, que  torna fácil  e
direto o acesso as diferentes partes da mensagem.

    O  que precisa  ser feito,  então, é  a codificação  de um  conjunto
de  métodos  para  acesso  e  manipulação  dessas  partes.  Inicialmente
criei dois  outros módulos, sendo eles  EL::mime::head e EL::mime::body,
cujo  o objetivo,  é conter  o conjunto  de métodos  com funcionalidades
especializadas, ou seja,  manipular o conteúdo do 'head' e  do 'body' da
mensagem.

    O módulo EL::mime::core, possui três métodos públicos sendo eles:

        $obj->part($part)

            retorna um objeto que faz  referência a uma sub-parte de uma
            mensagem do tipo 'multipart'.

            Ex.:

                -------------------------------------------[ Início ] --
                From: jose em cascavel.pm
                To: maria em cascavel.pm
                Subject: Teste
                Content-Type: multipart/mixed; boundary="--delimitador"

                Está é uma mensagem no formato MIME-multipart
                
                --delimitador
                Content-Type: text/plain;
                Content-Disposition: inline;

                Em anexo um arquivo HTML
                
                --delimitador
                Content-Type: text/html;
                Content-Disposition: attachment;

                <html>
                    <head>
                        Anexo HTML
                    </head>

                    <body>
                        <h2>Anexo HTML
                    </body>
                </html>
                
                --delimitador--
                ----------------------------------------------[ Fim ] --
    
                #!/usr/bin/perl
                use strict;
                
                my $msg = EL::mime:core->new({msg => 'msg.txt'})

                print $msg->head('from');
                print $msg->head('to');
                print $msg->head('subject');

                if ($msg->is_multipart) {
                    my $part1 = $msg->part(0);
                    my $part2 = $msg->part(1);

                    print $part1->head('content-type');
                    print $part1->body;
                    
                    print $part2->head('content-type');
                    print $part2->body;
                }

        $obj->size

            retorna o tamanho  em bytes da mensagem ou  de uma sub-parte
            da  mensagem, calculado  através  da  subtração do  'offset'
            final e inicial.

        $obj->fh

            retorna o  'filehandle' do  arquivo referente a  mensagem em
            análise.  É  útil, por  exemplo,  para  extrair o  corpo  da
            mensagem ou o corpo das  sub-partes da mensagem, usando-se o
            'offset' inicial e final em  conjunto com a função 'seek'. É
            mais  eficiente manter  os 'offsets'  em memória  do que  os
            dados  propriamente. Com  isso  não  preciso criar  arquivos
            temporários e nem consumir uma imensidão de memória quando o
            arquivo  for muito  grande,  por exemplo,  uma mensagem  com
            um  vídeo  (mpeg) anexado.  Mantenho  em  memória apenas  os
            cabeçalhos,  pois  são  pequenos  e cujo  o  acesso  é  mais
            frequente.


    Os    métodos    '->head'    e    '->body'    estão    especificados
minimalisticamente em EL::mime::head  e EL::mime::body, entranto, muitas
outras  funcionalidades  podem ser  acrescentadas  a  eles. Existem  uma
infinidade de 'mime-types' e para  cada um, um tratamento diferenciado é
necessário e métodos para isso necessitam ser criados. É justamente para
isso que conto com colaboradores.

    Quando pronto, esse  módulo será útil para  aplicações que manipulem
esse  tipo  de arquivos,  como  leitores  de mensagens  (ex.:  webmail),
gerenciadores de  listas de discussão,  filtros e para um  infinidade de
scripts para otimização de tarefas diversas.

    A motivação,  é criar  algo realmente útil,  simples e  eficiente, e
também  adquirir  experiência  na  programação  orientada  a  objetos  e
conhecimentos, sempre úteis, das especificações que definem a composição
de  mensagens  de e-mail  que  trafegam  de uma  lado  para  o outro  na
Internet.

    Grabriel, se  estiver interessando  começe dando  uma olhada  na RFC
1521  (http://www.rfc.net) e  terá uma  idéia do  que ainda  precisa ser
feito. Fique à vontade para  baixar meus fontes, testá-los, estudá-los e
implementar os métodos que achar interessante.

    Valeu!!!

> ----- Original Message -----
> From: "Ednardo Lobo" <ednardo em elobo.cjb.net>
> To: <cascavel-pm em mail.pm.org>
> Sent: Wednesday, April 02, 2003 5:31 PM
> Subject: [Cascavel-pm] EL::mime - Uma nova LIB
> 
>
> >     Pessoal por esses dias precisei  de um módulo/lib para manipular
> > arquivos  de  mensagens  de  e-mail.  Acabei  encontrando  o  módulo
> > MIME::Tools,  entretanto, ao  utilizá-lo achei-o  um tanto  confuso.
> > Mesmo possuindo  uma boa estruturação, os  métodos que disponibiliza
> > para  manipulação das  partes da  mensagem não  são muito  diretos e
> > simples.  Ele  também  costuma  gerar arquivos  temporários  para  a
> > realização do 'parser', os  quais acho completamente desnecessários.
> > E, além disso,  consome uma quantidade de  processamento que julguei
> > um tanto alta.
> >
> >     Resolvi  então  construir  outro   módulo  para  essa  tarefa  e
> > gostaria  de convidar  quem estiver  interessado a  participar desse
> > desenvolvimento.  Já  construi  o  módulo  que  faz  o  'parser'  da
> > mensagem,  permitindo assim,  agora,  a criação  de  métodos para  a
> > manipulação do  conteúdo dessa mensagem  e suas partes  (head, body,
> > preambule,  epilogue,  etc).  Esse  módulo é  bastante  otimizado  e
> > consome  pouquíssimo recurso  de processamento  e memória.  Uma 'man
> > page' inicial e os 'sources' publiquei em:
> >
> >     http://www.elobo.cjb.net/index.cgi?op=3
> >
> >     Pretendo  com  a  ajuda   de  colaborares  construir  um  módulo
> > completamente funcional e posteriormente publicá-lo no CPAN como uma
> > alternativa mais eficiente ao  MIME::Tools. E aproveitar também para
> > divulgar ainda mais o Cascavel Perl Mongers.
> >
> >     Interessados entrem em contato  postando mensagens aqui mesmo na
> > lista. Sugestões, idéias, palpites são também muito bem-vindos.
> >
> >     Referências sobre o assunto:
> >
> >     - man pages
> >
> >         MIME::Tools
> >         MIME::Entity
> >         MIME::Body
> >         MIME::Head
> >
> >     - RFCs
> >
> >         1521
> >         2045
> >
> >         e possivelmente outros
> >
> >
> >     Obrigado,
> >
> > --
> >     Ednardo Lobo - www.elobo.cjb.net

-- 
    Ednardo Lobo - www.elobo.cjb.net

    Por favor, evitem enviar anexos no formato MS-Office, obrigado!
    Veja: http://www.fsf.org/philosophy/no-word-attachments.pt.html



Mais detalhes sobre a lista de discussão Cascavel-pm