Friday, March 17, 2006

Pemakaian modul Mail::Thread

Hari ini saya mencoba menggunakan module Mail::Thread sebagai salah satu proses ekstraksi informasi terhadap kumpulan email untuk dapat menunjukkan rentetan dan hubungan antara satu email dengan email lain sehingga dapat diketahui mana parent dan mana childnya.

Yang menjadi kesulitan pada saat penerapan modul ini adalah pembuatan array yang berisi referensi objek yang diturunkan dari Email::Abstract, padahal untuk program saya menggunakan modul Mail::MboxParser yang menghasilkan referensi objek Mail::MboxParser::Mail dan objek ini tidak diturunkan dari Email::Abstract.
Setelah mencari-cari, akhirnya ada artikel yang sangat membantu saya, yaitu The Evolution of Perl Email Handling yang ditulis oleh Simon Cozens.
Dari tulisan tersebut, kita dapat menggunakan class Mail::Internet yang juga turunan dari class Email::Abstract dengan perintah berikut :

my $obj = Mail::Internet->new( [ split /\n/, $msg->as_string ] );

dimana $msg merupakan objek sebuah email dari class Mail::MboxParser::Mail, yang dapat diperoleh dengan memanggil method $mb->next_message, dimana $mb merupakan objek dari class Mail::MboxParser:

$mb = Mail::MboxParser->new($mymailbox,
decode => 'ALL',
newline => 'AUTO',
parseropts => $parseropts);

Dari setiap objek Mail::Internet, kita tampung dalam sebuah array:

@mails = (@mails, $obj);

Yang mungkin akan jadi masalah adalah, pembentukan array tersebut jelas akan memakan ruang penyimpanan utama (memori) yang cukup besar. Saya belum menguji untuk jumlah email yang sampai jutaan, namun saya harap cara ini dapat ditangani oleh lingkungan Perl, walaupun mungkin lambat.

Dengan mengikuti contoh dari dokumentasi Mail::Thread, saya tinggal menerapkan program berikut (untuk sekedar debugging) :

my $threader = new Mail::Thread (@mails);
$threader->thread;
dump_em($_,0) for $threader->rootset;

...

sub dump_em {
my ($self, $level) = @_;
print ' \\-> ' x $level;
if ($self->message) {
print $self->message->head->get("Subject") , "\n";
} else {
print "[ Message $self not available ]\n";
}
dump_em($self->child, $level+1) if $self->child;
dump_em($self->next, $level) if $self->next;
}


Demikian hasil percobaan saya hari ini.

Makasih.

No comments: