全部博文(1144)
分类: LINUX
2009-12-09 11:46:48
#!/usr/local/bin/perl
use MIME::Decoder;
# :set tabstop=3 in vi ;)
# get seperator
while(<>){
chop;
last if(/^$/); # only want to read header
if(/^Content-Type:\s+multipart\/mixed;/i){
my $line = <>;
if($line =~ /boundary="([^"]+)"/i){
$boundary = $1;
}
}
}
exit unless(defined($boundary));
foreach my $foo ('mime','plain'){
# skip
while(<>){
last if(/^--${boundary}/);
}
}
while(<>){
chop;
last if(/^--${boundary}/ || /^$/);
if(/^Content-Transfer-Encoding:\s+(.+)/i){
$encoding = $1;
}elsif(/filename="([^"]+)"/i){
$filename = $1;
# no lamerz
if($filename =~ /\.\./){
$filename =~ s/\.\.//g;
}elsif($filename =~ /\//){
$filename =~ s#/##g;
}
}
}
if(defined($filename) && defined($encoding)){
open(T, ">/tmp/$filename.tmp") || die "cannot write to /tmp/$filename.tmp: $!\n";
while(<>){
# the encoded attachment
last if(/^--${boundary}--/ || /^$/);
print T;
}
close T;
if(-s "/tmp/$filename.tmp"){
if(supported MIME::Decoder "$encoding"){
open(F, ">/tmp/$filename") || die "cannot write to /tmp/$filename: $!\n";
open(T, "/tmp/$filename.tmp") || die "cannot open /tmp/$filename.tmp: $!\n";
my $decode = new MIME::Decoder "$encoding";
$decode->decode(\*T, \*F) || die "cant decode: $!\n";
close F;
close T;
}else{
warn "Found attachment, but I am too primitive to decode it..\n";
}
}
unlink("/tmp/$filename.tmp");
}