[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