#!/usr/bin/perl -I../../../../.. use strict; use Pos::Webtop::Toolbox; use MIME::Base64 qw(encode_base64 decode_base64); use MIME::Types; use MIME::Type; package Pos::Webtop::Web::ContentModule::Mail::AttachmentFile; my $spoolDirectory = "/data/webtop/mailspool/"; sub new { my $this = shift; my $class = ref($this) || $this; my ($self,$db,$tb) = @{{@_}}{qw/self db/}; if ( not defined $self ) { $self = {}; bless($self,$class); } $self->{'db'} = $db; return $self; } sub DESTROY { my $self = shift; } sub append { my $self = shift; my ($file, $boundary, $inputHandle, $inputFileName) = @{{@_}}{qw/file boundary inputHandle inputFileName/}; my $fd; $file =~ /(.*)/; $file = $1; if (defined(open($fd, ">>$file"))) { my $text = undef; my $actual = 0; my $types = MIME::Types->new; my $type = $types->mimeTypeOf($inputFileName); my $mediaType = 'text'; my $subType = 'plain'; if (defined($type)) { $mediaType = $type->mediaType; $subType = $type->subType; } # /path/to/file # path/to/file # c:\path\to\file # \path\to\file # path\to\file # file $inputFileName =~ s/(.*\/|.*\\|)(.*)/$2/; print $fd "\n--BOUNDARY$boundary\n"; print $fd "Content-Type: $mediaType/$subType\n"; print $fd "Content-Transfer-Encoding: BASE64\n"; print $fd "Content-Disposition: attachment; filename=\"$inputFileName\"\n"; print $fd "X-Orig-FileName: $inputFileName\n\n"; my $buffer = ""; while ($actual = sysread($inputHandle, $text, 1024)) { $buffer .= $text; } $text = MIME::Base64::encode_base64($buffer); print $fd $text; print $fd "\n"; close($fd); } } sub getAttachments { my $self = shift; my ($file) = @{{@_}}{qw/file/}; my $attachment; my @result; my $fd; $file =~ /(.*)/; $file = $1; if (defined(open($fd, "<$file"))) { while ($attachment = $self->enumerate(fd => $fd)) { push @result, $attachment; } close($fd); } return \@result; } sub enumerate { my $self = shift; my ($fd) = @{{@_}}{qw/fd/}; my %header; my %hash; my @lines; my $line; my $name; my $value; my $body = ""; my $raw = ""; while ($line = <$fd>) { if ($line =~ /^--BOUNDARY(.*)/) { last; } $raw .= $line; push @lines, $line; } if (scalar(@lines) == 0 and not defined($line)) { return undef; } my $mode = 'header'; foreach my $line (@lines) { if ($line eq "\n" or $line eq "\r\n" and $mode eq 'header') { if (defined($name) and defined($value)) { $header{$name} = $value; } $mode = 'body'; } if ($mode eq 'header') { if ($line =~ /^(.*):/) { if (defined($name) and defined($value)) { $header{$name} = $value; } ($name, $value) = split /: /, $line; } else { $value .= $line; } } else { $body .= $line; } } if (not defined($header{'X-Orig-FileName'})) { return $self->enumerate(fd => $fd); } $hash{'ATTACHMENT_HEADERS'} = \%header; $hash{'ATTACHMENT_RAW_BUFFER'} = \$raw; $hash{'ATTACHMENT_FILENAME'} = $header{'X-Orig-FileName'}; $hash{'ATTACHMENT_BODY'} = MIME::Base64::decode_base64($body); $hash{'ATTACHMENT_SIZE'} = length($hash{'ATTACHMENT_BODY'}); return \%hash; } 1;