Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5376228
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: 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");
}
阅读(600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~