#!/usr/bin/perl
###
### Pipes mail to a smbhost via smbclient
###

my($smbclient, $message1, $msg1_len, $message2, $msg2_len,
   $maxbytes, $host);

###
### Configuration section
###

### Set secure path
$ENV{PATH} = "/usr/local/bin:/usr/bin/:/bin:/usr/local/sbin:/usr/sbin:/sbin";

### Where is the smbclient
$smbclient = "/usr/bin/smbclient -U MAIL";

### The continue message
$message1 = "\n\n...continued in next message\n";

### Length of message1, add one byte for every \n, because
### smbclient converts \n to \r\n
$msg1_len = length($message1)+3;

### The continued message
$message2 = "...continued message:\n\n";

### Length of message2, add one byte for every \n, because
### smbclient converts \n to \r\n
$msg2_len = length($message2)+2;

###
### Nothing to configure below
###

### Maximum bytes per Messages
$maxbytes = 1600 - $msg1_len;

### Get the receiving NetBIOS host as the #1 argument
$host = shift;

### If called non interactivly use the logger to report errors
-t STDERR || open(STDERR,"|logger -tmail2smb")
          || die "$0: Can't open logger: $!\n";

### Hostname is required
($host) || die "No hostname\n";

### Standard output goes to nowhere
open(STDOUT,">/dev/null" );

my($smballow, $smbdeny, %allow, %deny, $key, $val, $checkit, $sendit);

### Set default values
$checkit = 0;
$sendit = 1;

### Read the 'no forward' file
### (this file will be ignored, of the 'forward' file exists)
$smbdeny = 0;
if (open(A,"<.smbnoforward")) {
  while (<A>) {
    s/[\r\n]//g;
    ($key,$val) = split(/ /, $_, 2);
    $deny{$key} = $val;
  }
  close(A);
  $smbdeny = 1;
  $checkit = 1;
  $sendit = 1;
}

### Read the 'forward' file
$smballow = 0;
if (open(A,"<.smbforward")) {
  while (<A>) {
    s/[\r\n]//g;
    ($key,$val) = split(/ /, $_, 2);
    $allow{$key} = $val;
  }
  close(A);
  $smballow = 1;
  $checkit = 1;
  $sendit = 0;
  $smbdeny = 0;
}

my($inheader,$bytes,$mkey,$mval);

$inheader = 1;
$bytes = $maxbytes;
while (<>) {
  if ($inheader) {
    if (/^[\r\n]+/) {
      if (! $sendit) { exit 0 };
      $inheader = 0;
      open(S,"|$smbclient -M $host" ) || exit 0;
      if ( $from ) { print S $from; $bytes -= length($from)+1; }
      elsif ( $from1 ) { print S $from1; $bytes -= length($from1)+1; }
      else { print S $return_path; $bytes -= length($return_path)+1; }
      print S "$subject\n";
      $bytes -= length($subject)+2;
    } else {
      # Check only if forward files present
      if ($checkit) {
        ($mkey,$mval) = split(/ /, $_, 2);
        $mval =~ s/[\r\n]//g;
        if ($smbdeny) {
          DENY: while (($key,$val) = each %deny) {
            if (($mkey eq $key) && ($mval =~ /$val/)) {
              $sendit = 0;
              $checkit = 0;
              last DENY;
            }
          }
        } elsif ($smballow) {
          ALLOW: while (($key,$val) = each %allow) {
            if (($mkey eq $key) && ($mval =~ /$val/)) {
              $sendit = 1;
              $checkit = 0;
              last ALLOW;
            }
          }
        }
      }
      if (/^From:/ ) { $from = $_ unless $from; }
      elsif (/^From / ) { $from1 = $_ unless $from1; }
      elsif (/^Return-Path:/ ) { $return_path = $_ unless $return_path; }
      elsif (/^Subject:/ ) { $subject = $_ unless $subject; }
    }
  } else {
    if (length() > $bytes) {
      print S $message1;
      close(S);
      open(S,"|$smbclient -M $host") || exit 0;
      print S $message2;
      $bytes = $maxbytes - $msg2_len;
    }
    print S;
    $bytes -= length()+1;
  }
}

close(S);

exit 0;
