#!/usr/bin/perl
#use CGI::Carp "fatalsToBrowser";
require "data/set.cgi";

# Nutzungsbedingungen (Autofileresponder):
#        Lizenz:
#                Stand: 7.09.2001
#
# Durch den Kauf und Einsatz der Software erklären Sie sich mit diesen Lizenzabkommen einverstanden.
#
# Diese Lizenz erlaubt es Ihnen, Autofileresponder auf einer oder mehrere Webseiten zu benutzen.
# Für jede installierte Instanz dieses Programms benötigen Sie jeweils nur eine gesamte Lizenz.
# Jedoch muss die Webseite, auf dem das Script angeboten wird auf ihrem Namen sein.
#
# Als legitimierter Benutzer von Autofileresponder können Sie auf eigenes Risiko die Software verändern
# und/oder auf Ihre Bedürfnisse anpassen. Sie können Dritte mit der Anpassung/Veränderung beauftragen.
#
# Die Original-Software oder die angepasste/veränderte Software und Teile derer dürfen nicht weitergegeben oder
# verkauft oder wiederverkauft werden.
#
# Alle Copyright- und Versions-Hinweise, die im Autofileresponder oder deren HTML-Seiten verwendet,
# erstellt und/oder gezeigt werden, dürfen nicht entfernt werden. Diese müssen für Benutzer sichtbar sein
# und in ungeänderter Form dargestellt werden. Diese Klausel gilt nicht für das Copyright im unteren Bereich
# in jeder Seite ,ansonsten gilt diese Klausel für alle Copyright- und Versions-Hinweise!
#
# Dieses Lizenzabkommen beruht auf der aktuellen internationalen Gesetzeslage.
#
# Bei einem Verstoß gegen diesen Lizenzvertrag kann durch die Firma Coder-World oder deren Beauftragten die
# erworbene Lizenz jederzeit zurückgezogen und für nichtig erklärt werden, es werden keinerlei geleisteten
# Zahlungen für erworbene Lizenzen erstattet.
#
# Autofileresponder und die dazugehörenden Dateien werden ohne Funktionsgarantie für die im Umfeld
# verwendete Hardware oder Software verkauft.
#
# Coder-World oder deren Beauftragten sind in keiner Form für Inhalte oder Verfasser verantwortlich, die
# durch diese Software erstellt wurden.
#
# Das Risiko der Benutzung von Autofileresponder obliegt dem Lizenznehmer, jegliche Erstattungen im
# Rechtsfall erstrecken sich maximal auf den Kaufpreis der Lizenz.
# Eine Lizenz ist zeitlich unbegrenzt nutzbar, im Preis ist grundsätzlich der Zugriff auf alle neuen Versionen
# für den Zeitraum von mindestens 365 Tagen ab Zahlungseingang enthalten.
#
# Hinweis: Es existieren keine Reseller-, Wiederverkaufs- oder Schüler-/Studenten - Versionen. Nach den
# Lizenzbedingungen muß der Website-Besitzer die Lizenz selbst kaufen.
#
# Autor: Stefan Gipper (Stefanos)
# Webseite: http://www.coder-world.de
# E-Mail: support@coder-world.de
$OS = $ENV{HTTP_USER_AGENT};
if($OS=~/vms/i){
        $CRLF = "\n";
}elsif($OS=~/^MacOS$/i){
        $CRLF = "\n\r";
}else{
        $CRLF = "\015\012";
}

binmode STDIN;
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});

if($ENV{'CONTENT_TYPE'} =~ /^(.+)boundary=(.+)$/){
        $boundary = '--'.$2;
        @parts = split(/$boundary/, $Daten);
}else{
        @parts = split(/&/, $Daten);
}
foreach (@parts){
        if($boundary){
                ($header, $content) = split(/$CRLF$CRLF/,$_,2);
                ($name) = ($header =~ / name="([^"]*?)"/s);
        }else{
                ($name, $content) = split(/=/,$_,2);
        }
        if($name =~ /^[Ff][Ii][Ll][Ee]-[Uu][Pp][Ll][Oo][Aa][Dd]-[\d]+$/){
                ($filename) = ($header =~ /; filename="([^"]*?)"/s);
                $filename =~ s/^.*\\//;
                ($mimetype) = ($header =~ /Content-Type: (.*)/s);
                $mimetype =~ s/($CRLF.*)//s;

                if($filename ne ""){
                        $content =~ s/^$CRLF//gs;
                        $content =~ s/$CRLF$//gs;
                        $FORM{$name} = "$content";
                        $FILE{$name} = "$filename";
                        $MIME{$name} = "$mimetype";
                }
        }else{
                $name =~ tr/+/ /;
                $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                $content =~ tr/+/ /;
                $content =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                $content =~ s/$CRLF/\n/g;

                chomp($content);
                if($FORM{$name} ne ""){
                        $FORM{$name} .= ",$content";
                }else{
                        $FORM{$name} = "$content";
                }
        }
}
foreach (split(/&/, $ENV{QUERY_STRING})){
        ($name,$value) = split(/=/,$_,2);
        $name =~ tr/+/ /;
        $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/<!--(.|\n)*-->//g;
        if($INFO{$name} ne ""){
                $INFO{$name} .= ",$value";
        }else{
                $INFO{$name} = "$value";
        }
}

$action = $FORM{'action'} || $INFO{'action'};
$version = "1.3";

if($action){&$action;}
&index;

sub send {
        &error("E-Mailadresse ist inkorrekt.") if($FORM{'email'} !~ /^([a-zA-Z0-9][a-zA-Z_0-9-\.]*)(\@)([a-zA-Z0-9][a-zA-Z_0-9-\.]*[a-zA-Z0-9])(\.)([a-zA-Z0-9]*)$/);
        if($urlon == 1){
                &error("URL ist inkorrekt.") if($FORM{'url'} !~ /^http:\/\/(.+?)$/);
        }
        &error("Dateiname ung&uuml;ltig.") if($FORM{'file'} =~ /\.\.|\/|\\|\|/);
        foreach (split(/\,/,$FORM{'file'})){
                &error("Datei existiert nicht.") if(!(-e("files/$_")));
        }
        &error("Name ist leer.") unless($FORM{'name'});

        open(F,"<autoresponder2.html");
        $x = join("",<F>);
        close(F);

        open(F,"<data/sperren.dat");
        ($sperre,$sperre2,$sperre3) = split(/<!-- SPLIT -->/,join("",<F>));
        close(F);

        foreach my $i (split /\n/,$sperre){
                $i =~ s/[\n\r]//g;
                if($i =~ /^\*/){
                        $stern = 1;
                        ($vor,$maili) = split(/\@/,$i);
                }else{
                        $stern = 0;
                }

                if(lc($i) eq lc($FORM{'email'})){
                        &error("Diese E-Mailadresse wurde gesperrt.");
                }elsif(lc($FORM{'email'}) =~ /\@$maili$/i && $stern == 1){
                        &error("Diese E-Mailadresse wurde gesperrt.");
                }
        }

        foreach my $i (split /\n/,$sperre2){
                $i =~ s/[\n\r]//g;

                if(lc($FORM{'url'}) =~ /$i/i){
                        &error("Diese Webseite wurde gesperrt.");
                }
        }

        foreach my $i (split /\n/,$sperre3){
                $i =~ s/[\n\r]//g;

                if(uc($i) ne $i){
                        if(lc($FORM{'name'}) =~ /$i/i){
                                &error("Dieser Accountname wurde gesperrt.");
                        }
                }else{
                        if(lc($FORM{'name'}) eq lc($i)){
                                &error("Dieser Accountname wurde gesperrt.");
                        }
                }
        }

        foreach ("/bin/sendmail","/sbin/sendmail","/usr/lib/sendmail","/usr/bin/sendmail","/usr/share/sendmail","/usr/sbin/sendmail","/usr/bin/sendmail.restart","/etc/sendmail.cf","/etc/sendmail.cw","/usr/man/man8/sendmail.8","/var/qmail/bin/qmail-inject"){
                if(-e $_ && -X _){
                        $mailprog = $_;
                        last;
                }
        }

        open(F,"<autoresponder.txt");
        @data = <F>;
        close(F);
        $subject = shift(@data);
        shift(@data);
        $i = join("",@data);
        $i =~ s/<_email>/$FORM{'email'}/g;
        $i =~ s/<_webseite>/$FORM{'url'}/g;
        $i =~ s/<_name>/$FORM{'name'}/g;
        $i =~ s/<_file>/$FORM{'file'}/g;
        $i =~ s/<_ip>/$ENV{'REMOTE_ADDR'}/g;
        $boundary = &generate_boundary();

        open (M,"| $mailprog -t");
        print M "To: $FORM{'email'}\n";
        print M "From: $webmasteremail (TBK-Autoresponder)\n";
        print M $subject;
        print M "MIME-Version: 1.0\n";
        print M "Content-type: multipart/mixed; boundary=\"$boundary\"\n\n";
        print M "\n--$boundary\nContent-type: text/plain\nContent-Disposition: inline;\nContent-Transfer-Encoding: quoted-printable\n\n$i";
        foreach $file (split(/\,/,$FORM{'file'})){
                print M "\n--$boundary\n";
                $mime_type = &get_mime_type($file);
                print M "Content-type: $mime_type;\n" . " name=\"$file\"\n";
                print M "Content-Transfer-Encoding: base64\n";
                print M 'Content-Disposition: attachment;' . " filename=\"$file\"\n\n";
                &base64enc( M, "files/$file");
        }
        print M "\n--$boundary--\n";
        close(M);

        if($mail == 1){
                open(F,"<autoresponder2.txt");
                $r = join("",<F>);
                close(F);
                $r =~ s/<_email>/$FORM{'email'}/g;
                $r =~ s/<_webseite>/$FORM{'url'}/g;
                $r =~ s/<_name>/$FORM{'name'}/g;
                $r =~ s/<_file>/$FORM{'file'}/g;
                $r =~ s/<_ip>/$ENV{'REMOTE_ADDR'}/g;

                open (M,"| $mailprog -t");
                print M "To: $webmasteremail\n";
                print M "From: $FORM{'email'}\n";
                print M $r;
                close(M);
        }

        if($update == 1){
                $FORM{'name'} =~ s/\;//g;
                $FORM{'url'} =~ s/\;//g;

                open(F,"+<data/liste.dat");
                @liste = <F>;
                unless($doppelt){
                        foreach (@liste){
                                ($namey,$emaily,$urly) = split(/\;/);
                                $no = 1 if($namey eq $FORM{'name'} or $emaily eq $FORM{'email'} or $urly eq $FORM{'url'});
                        }
                }
                seek(F,0,0);
                truncate(F,0);
                print F "$FORM{'name'}\;$FORM{'email'}\;$FORM{'url'}\n" unless($no);
                print F @liste;
                close(F);
        }

        if($FORM{'finish'} ne ""){
                print "Location: $FORM{'finish'}\n\n";exit;
        }

        print "Content-Type: text/html\n\n";
        print $x;
        exit;
}

sub index {
        open(F,"<autoresponder.html");
        $temp = join("",<F>);
        close(F);
        ($checkbox2) = ($temp =~ /<!--C(.+?)C-->/sg);

        opendir(V,"files");
        foreach $i (readdir V){
                if($i ne "\." && $i ne "\.\." && $i ne "\.htaccess"){
                        if($list){
                                $list .= qq~<option>$i</option>~;
                        }else{
                                $list .= qq~<option selected>$i</option>~;
                        }

                        $check = $checkbox2;
                        $check =~ s/<_list>/$i/g;
                        unless($rest){
                                $check =~ s/<_check>/checked/g;
                        }else{
                                $check =~ s/<_check>//g;
                        }
                        $rest .= $check;
                }
        }
        closedir(V);

        if($checkbox == 1){
                $temp =~ s/<!--C(.+?)C-->/$rest/sg;
                $temp =~ s/<!--D(.+?)D-->//sg;
        }else{
                $temp =~ s/<!--C(.+?)C-->//sg;
                $temp =~ s/<!--D(.+?)D-->/$1/sg;
                $temp =~ s/<_list>/$list/g;
        }

        print "Content-Type: text/html\n\n";
        print $temp;
        exit;
}

sub admin {
        open(F,"<admin.html");
        my $i = join("",<F>);
        close(F);
        $i =~ s/<_m>/Bitte Passwort eingeben./g;

        print "Content-Type: text/html\n\n";
        print $i;
        exit;
}

sub admin2 {
        $FORM{'pass'} = $INFO{'pass'} unless($FORM{'pass'});
        &error("Passwort inkorrekt.") if($FORM{'pass'} ne $passwort && !sid);
        $sid = $INFO{'sid'} || $FORM{'sid'};

        $Times = time();
        open(F,"+<data/session.txt");
        flock(F,2) if($flock);
        @session = <F>;
        seek(F,0,0);
        truncate(F,0);
        foreach(@session){
                s/[\n\r]//g;
                ($SESSIONkey,$SESSIONtime,$SESSIONip) = split(/\|/);
                if($Times < ($SESSIONtime+1800)){
                        if($ENV{'REMOTE_ADDR'} eq $SESSIONip && $SESSIONkey eq $sid){
                                $ySESSIONkey = $SESSIONkey;
                                $ySESSIONtime = $Times;
                                $ySESSIONip = $SESSIONip;
                                print F "$SESSIONkey\|$Times\|$SESSIONip\|\n";
                                $yes = 1;
                        }else{
                                print F $_ . "\n" if($ENV{'REMOTE_ADDR'} ne $SESSIONip);
                        }
                }
        }
        if($yes eq "" && $FORM{'pass'} eq $passwort){
                @random = (0..9, 'A'..'Z', 'a'..'z');
                $ySESSIONkey .= $random[rand 62] while (length($ySESSIONkey) < 33);

                print F "$ySESSIONkey\|$Times\|$ENV{'REMOTE_ADDR'}\|\n";
                $yes = 1;
        }
        flock(F,8) if($flock);
        close(F);
        &error("Keine g&uuml;ltige Session gefunden.") unless($yes);

        open(F,"<data/sperren.dat");
        ($sperre,$sperre2,$sperre3) = split(/<!-- SPLIT -->/,join("",<F>));
        close(F);

        open(F,"<data/liste.dat");
        $liste = join("",<F>);
        close(F);

        opendir(V,"files");
        foreach my $i (readdir V){
                if($i ne "\." && $i ne "\.\." && $i ne "\.htaccess"){
                        $list .= qq~<option>$i</option>~;
                }
        }
        closedir(V);

        if($mail == 1){$mail2 = "checked";}else{$mail3 = "checked";}
        if($urlon == 1){$urlon2 = "checked";}else{$urlon3 = "checked";}
        if($update == 1){$update2 = "checked";}else{$update3 = "checked";}
        if($doppelt == 1){$doppelt2 = "checked";}else{$doppelt3 = "checked";}
        if($checkbox == 1){$checkbox2 = "checked";}else{$checkbox3 = "checked";}

        open(F,"<admin2.html");
        $i = join("",<F>);
        close(F);
        $i =~ s/<_email>/$webmasteremail/g;
        $i =~ s/<_pass>/$passwort/g;
        $i =~ s/<_sid>/$ySESSIONkey/g;
        $i =~ s/<_liste>/$liste/g;
        $i =~ s/<_sperre>/$sperre/g;
        $i =~ s/<_sperre2>/$sperre2/g;
        $i =~ s/<_sperre3>/$sperre3/g;
        $i =~ s/<_list>/$list/g;
        $i =~ s/<_version>/$version/g;
        $i =~ s/<_mail>/$mail2/g;
        $i =~ s/<_mail2>/$mail3/g;
        $i =~ s/<_urlon>/$urlon2/g;
        $i =~ s/<_urlon2>/$urlon3/g;
        $i =~ s/<_update>/$update2/g;
        $i =~ s/<_update2>/$update3/g;
        $i =~ s/<_doppelt>/$doppelt2/g;
        $i =~ s/<_doppelt2>/$doppelt3/g;
        $i =~ s/<_checkbox>/$checkbox2/g;
        $i =~ s/<_checkbox2>/$checkbox3/g;
        if($INFO{'m'} eq "gen"){
                $i =~ s~<_m>~Einstellungen wurden gespeichert.~g;
        }elsif($INFO{'m'} eq "gen"){
                $i =~ s~<_m>~Einstellungen wurden nicht gespeichert.~g;
        }elsif($INFO{'m'} eq "news"){
                $i =~ s~<_m>~Newsletter wurde versendet.~g;
        }else{
                $i =~ s~<_m>~Keine~g;
        }

        print "Content-Type: text/html\n\n";
        print $i;
        exit;
}

sub admin3 {
        $sid = $INFO{'sid'} || $FORM{'sid'};

        $Times = time();
        open(F,"+<data/session.txt");
        flock(F,2) if($flock);
        @session = <F>;
        seek(F,0,0);
        truncate(F,0);
        foreach(@session){
                s/[\n\r]//g;
                ($SESSIONkey,$SESSIONtime,$SESSIONip) = split(/\|/);
                if($Times < ($SESSIONtime+1800)){
                        if($ENV{'REMOTE_ADDR'} eq $SESSIONip && $SESSIONkey eq $sid){
                                $ySESSIONkey = $SESSIONkey;
                                $ySESSIONtime = $Times;
                                $ySESSIONip = $SESSIONip;
                                print F "$SESSIONkey\|$Times\|$SESSIONip\|\n";
                                $yes = 1;
                        }else{
                                print F $_ . "\n" if($ENV{'REMOTE_ADDR'} ne $SESSIONip);
                        }
                }
        }
        flock(F,8) if($flock);
        close(F);
        &error("Keine g&uuml;ltige Session gefunden.") unless($yes);

        &error("E-Mailadresse ist inkorrekt.") if($FORM{'email'} !~ /^([a-zA-Z0-9][a-zA-Z_0-9-\.]*)(\@)([a-zA-Z0-9][a-zA-Z_0-9-\.]*[a-zA-Z0-9])(\.)([a-zA-Z0-9]*)$/);
        &error("Passwort enth&auml;lt Sonderzeichen.") if($FORM{'pass2'} !~ /^[\w]+$/);

        if(-w("data/liste.dat") && -w("data/sperren.dat") && -w("data/set.cgi")){
                open(F,">data/liste.dat");
                print F $FORM{'liste'};
                close(F);

                open(F,">data/sperren.dat");
                print F $FORM{'sperre'} . "<!-- SPLIT -->" . $FORM{'sperre2'} . "<!-- SPLIT -->" .  $FORM{'sperre3'};
                close(F);

                $FORM{'email'} =~ s/\@/\\\@/g;
                open(F,">data/set.cgi");
                print F qq~\$checkbox = "$FORM{'checkbox'}";\n\$doppelt = "$FORM{'doppelt'}";\n\$webmasteremail = "$FORM{'email'}";\n\$passwort = "$FORM{'pass2'}";\n\$mail = "$FORM{'mail'}";\n\$update = "$FORM{'update'}";\n\$urlon = "$FORM{'urlon'}";\n;1;~;
                close(F);

                print "Location: autoresponder.pl?sid=$sid&action=admin2&m=gen\n\n";exit;
        }else{
                print "Location: autoresponder.pl?sid=$sid&action=admin2&m=genf\n\n";exit;
        }
}

sub admin4 {
        $sid = $INFO{'sid'} || $FORM{'sid'};

        $Times = time();
        open(F,"+<data/session.txt");
        flock(F,2) if($flock);
        @session = <F>;
        seek(F,0,0);
        truncate(F,0);
        foreach(@session){
                s/[\n\r]//g;
                ($SESSIONkey,$SESSIONtime,$SESSIONip) = split(/\|/);
                if($Times < ($SESSIONtime+1800)){
                        if($ENV{'REMOTE_ADDR'} eq $SESSIONip && $SESSIONkey eq $sid){
                                $ySESSIONkey = $SESSIONkey;
                                $ySESSIONtime = $Times;
                                $ySESSIONip = $SESSIONip;
                                print F "$SESSIONkey\|$Times\|$SESSIONip\|\n";
                                $yes = 1;
                        }else{
                                print F $_ . "\n" if($ENV{'REMOTE_ADDR'} ne $SESSIONip);
                        }
                }
        }
        flock(F,8) if($flock);
        close(F);
        &error("Keine g&uuml;ltige Session gefunden.") unless($yes);

        $start = $INFO{'start'} || 0;
        $boundary = &generate_boundary();

        foreach ("/bin/sendmail","/sbin/sendmail","/usr/lib/sendmail","/usr/bin/sendmail","/usr/share/sendmail","/usr/sbin/sendmail","/usr/bin/sendmail.restart","/etc/sendmail.cf","/etc/sendmail.cw","/usr/man/man8/sendmail.8","/var/qmail/bin/qmail-inject"){
                if(-e $_ && -X _){
                        $mailprog = $_;
                        last;
                }
        }

        $FORM{'subject'} =~ s/[\n\r]//g;
        if($start eq 0){
                open(F,">data/nl.dat");
                print F "$FORM{'subject'}\n$FORM{'file'}\n$FORM{'text'}";
                close(F);
        }else{
                open(F,"<data/nl.dat");
                @nl = <F>;
                close(F);
                $FORM{'subject'} = shift(@nl);
                $FORM{'subject'} =~ s/[\n\r]//g;

                $FORM{'file'} = shift(@nl);
                $FORM{'file'} =~ s/[\n\r]//g;

                $FORM{'text'} = join("",@nl);
        }

        open(F,"<data/liste.dat");
        @file = <F>;
        close(F);

        $start2 = $start + 50;
               for($i=$start;$i<@file;$i++){
                $file[$i] =~ s/[\n\r]//g;
                my($name,$email,$url) = split(/\;/,$file[$i]);
                if($i eq $start2){print "Location: autoresponder.pl?sid=$sid&action=admin4&start=$start2\n\n";exit;}

                if($email =~ /^([a-zA-Z_0-9-\.]+)(\@)([a-zA-Z_0-9-\.]+)(\.)(\w+)$/){
                        my $text = $FORM{'text'};
                        $text =~ s/<_url>/$url/g;
                        $text =~ s/<_email>/$email/g;
                        $text =~ s/<_name>/$name/g;
                        open (M,"| $mailprog -t");
                        print M "To: $email\n";
                        print M "From: $webmasteremail\n";
                        print M "Subject: $FORM{'subject'}\n";
                        print M "MIME-Version: 1.0\n";
                        print M "Content-type: multipart/mixed; boundary=\"$boundary\"\n\n";
                        print M "--$boundary\nContent-type: plain/text\n\n$FORM{'text'}";
                        my $mime_type = &get_mime_type($FORM{'file'});
                        print M "\n--$boundary\n";
                        print M "Content-type: $mime_type;\n" . " name=\"$FORM{'file'}\"\n";
                        print M "Content-Transfer-Encoding: base64\n";
                        print M 'Content-Disposition: attachment;' . " filename=\"$FORM{'file'}\"\n\n";
                        &base64enc( M, "files/$FORM{'file'}");
                        print M "\n--$boundary--\n";
                        close(M);
                }
        }
        open(F,">data/nl.dat");
        print F "";
        close(F);

        print "Location: autoresponder.pl?action=admin2&sid=$sid&m=news\n\n";exit;
}

sub error {
        local($e) = @_;
        if($FORM{'error'} ne ""){
                print "Location: $FORM{'error'}\n\n";exit;
        }

        open(F,"<error.html");
        my $error = join("",<F>);
        close(F);
        $error =~ s/<_e>/$e/g;

        print "Content-Type: text/html\n\n";
        print $error;
        exit;
}

sub generate_boundary() {
        return "------=====================_" . time() . "==_";
}

sub get_mime_type {
    my $filename = shift;

    my %types = (
        'avi' => 'video/x-msvideo',
        'doc' => 'application/msword',
        'gif' => 'image/gif',
        'jpeg' => 'image/jpeg',
        'jpg' => 'image/jpeg',
        'gz' => 'application/x-gzip',
        'mov' => 'video/quicktime',
        'mpeg' => 'video/mpeg',
        'mpg' => 'video/mpeg',
        'pdf' => 'application/pdf',
        'png' => 'image/png',
        'rtf' => 'application/rtf',
        'swf' => 'application/x-shockwave-flash',
        'tar' => 'application/x-tar',
        'tgz' => 'application/x-gzip',
        'tif' => 'image/tiff',
        'tiff' => 'image/tiff',
        'wav' => 'audio/x-wav',
        'zip' => 'application/zip',
    );
    chomp(my $typ = [split(/\./, $filename)]->[-1]);
    return ( $types{$typ} or 'application/octet-stream');
}

sub base64enc {

    my $mailpipe = shift;
    my $filename = shift;

    open(F, "< $filename") or die "Fehler: Konnte $filename nicht oeffnen!";
    my @b64str = ("A".."Z","a".."z","0".."9","+","/");
    my($buflen,$num,$len,$dat,@dat,$a,$b,$c,$d,$e,$f,$g);
    $buflen=300*3;
    $num=0;
    { local $^W = 0;
      while (!eof(F)) {
          $len=read(F, $dat, $buflen);
          @dat=unpack('C*', $dat);
          while (@dat) {
              $a=shift(@dat);
              $b=shift(@dat);
              $c=shift(@dat);
              if ($b eq "") {
                  ($d,$e)=($a>>2, ($a<<4)&0x3f);
                  print $mailpipe "$b64str[$d]$b64str[$e]==";
              } elsif ($c eq "") {
                  ($d,$e,$f)=(($a>>2),
                  ((($a<<4)&0x3f) | $b>>4), ($b<<2)&0x3f);
                  print $mailpipe
                    "$b64str[$d]$b64str[$e]$b64str[$f]=";
              } else {
                  ($d,$e,$f,$g)=
                      ($a>>2,
                       (($a<<4)&0x3f) | $b>>4,
                       ($b<<2)&0x3f | $c>>6,
                       $c&0x3f);
                  print $mailpipe
                    "$b64str[$d]$b64str[$e]$b64str[$f]$b64str[$g]";
              }
              if (++$num==15) {print $mailpipe "\n"; $num=0;}
          }
      }
    }
    print $mailpipe "\n" unless ($num==0);
}