404 motivation not found | t_ishidaのブログ

11月/07

6

へなちょこメールリーダー

おもむろに、perlで使えるメールリーダーを書いてみたくなった。

perl久しぶり過ぎて、笑える位に書けなかった。

ってか、メール受け取るの意外と面倒くさいのね。

  1. Encodeと接続をラップして、複数プロトコルに対応できるようにする
  2. 複数アカウントからメールを取得できるようにする
  3. メールの送信もサポートする
  4. メールの振り分けをサポートする
  5. 未読管理をする

で、サクラエディタから使えるようにしてみようかと。

outlookの奴は本当にうざかったので。

ActivePerlで使う場合のポイント

ppm install MIME-Tools

ppm install MailTools

ppm install libnet

use strict;
use Net::POP3;
use MIME::Words qw(:a{ll);
use MIME::Parser;
use Encode;

my %settings = (
host => 'your.mail.host' ,
user => 'your_user' ,
pwd  => 'your_passwd' ,
enc  => 'shiftjis' ,
);

my %cmds = (
'l' => \&showList,
'b' => \&showBody ,
);

print $cmds{$ARGV[0]}->($ARGV[1]);
sub showList{
my $parser = MIME::Parser->new;
my $pop = Net::POP3->new($settings{host});
unless ( $pop->login($settings{user}, $settings{pwd}) ){
print '無いよ' and return;
}

my $msgnums = $pop->list;
foreach my $msgnum (keys %$msgnums) {
my $ent =  $parser->parse_data($pop->get($msgnum));
print  "■ID:$msgnum" .
&DecodeFld( $ent->head->get('Subject') ) .
'<' . &DecodeFld( $ent->head->get('From') ) . ">\n" ;
}
$pop->quit;
}

sub showBody{
my ( $id  ) = @_;
$id =~ /^\d+$/ or die 'そんなのダメだよ';

my $parser = MIME::Parser->new;
#$parser->output_dir('pop3');
my $pop = Net::POP3->new($settings{host});
unless(  $pop->login($settings{user}, $settings{pwd}) ){
print '無いよ' and return
}
my $ent =  $parser->parse_data($pop->get($id));

print "■ID:$id\n";
print "from : "    .
&DecodeFld( $ent->head->get('From') ). "\n";
print "subject : " .
&DecodeFld( $ent->head->get('Subject') ) . "\n" ;
print "body : \n\n";

my $body = '';
if( !$ent->is_multipart ) {
$body = $ent->bodyhandle->as_string;
} else {
$body = $ent->parts(0)->bodyhandle->as_string;
}
Encode::from_to( $body, 'ISO-2022-JP' ,$settings{enc} );
print $body , "\n";

if( $ent->is_multipart ){
print "ファイルある\n";
for( 0..$ent->parts ){
print $ent->parts($_)->path .
"<". $ent->parts($_)->mime_type . ">\n";
}
}
}

sub DecodeFld($) {
my($buf) = @_;
my $ret;

chomp($buf);
foreach my $Wk (decode_mimewords( $buf, )){
my ($txt, $code) = @$Wk;
Encode::from_to( $txt , $code ,$settings{enc} ) if $code;
$ret .= $txt;
}
return $ret;
}
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 贅沢な土日(笑)

私信 >>

Find it!

Theme Design by devolux.org

Tag Cloud