#!/usr/bin/php -f
<?
if ($dh opendir(".")) {
  while ((
$file readdir($dh)) !== false) {
    if (
$file != '.' && $file != '..') {
      
fixmail($file);
    }
  }
}

function 
printhead($filename$headers) {
  
//echo "\n" . $filename . "\n";
  
echo "\n" $headers['From'] . " ";
  echo 
$headers['Subject'] . "\n";
}

function 
fixmail($filename) {
  
$headers = array();
  
$headersall '';
  
$data false;
  
$lines = array();
  
$headerpattern "/([A-Za-z0-9_-]+): ?(.*)/";
  
$boundarypattern '/multipart\/mixed; boundary="(.*)"/';
  
$getheaders array_flip(array('Content-Type''Subject''From''Mime-Version'));

  
$in fopen($filename'r');
  while (!
feof($in) && count($lines) < 2) {
    
$buffer fgets($in4096);
    if (
trim($buffer) == '' && !$data) {
      
$data true;
    } elseif(!
$data) {
      
$headersall .= $buffer;
      
preg_match_all($headerpattern$buffer$matches);
      if (isset(
$getheaders[$matches[1][0]])) {
        
$headers[$matches[1][0]] = $matches[2][0];
      }
    } elseif(
count($lines) < 2) {
      
$lines[] = $buffer;
    }
  }

  
  if (!isset(
$headers['Content-Type'])) {
    
fclose($in);

    if (
$lines[0] == "<x-html>\n" || $lines[0] == "<html>\n" || $lines[0] == "<x-html><html>\n") {
      
// Content-type is missing, but it's a HTML email.
      
printhead($filename$headers);
      
addcontenttype($filename);
    } elseif(
$lines[0] == "<x-flowed>\n") {
      
// Plain text message.  Remove <x-flowed> tag.
      
printhead($filename$headers);
      
removexflowed($filename);
    }
  } elseif (
$headers['Content-Type'] != 'text/html') {
    
// Content-Type is set and it's not HTML.  It's probably multipart/mixed.
    
    // Get the label for the next MIME boundary
    
preg_match_all($boundarypattern$headers['Content-Type'], $matches);
    
$boundary $matches[1][0];
    
    
// Advance the file pointer to the next boundary
    
while (!feof($in) && !$buffer == "--" $boundary) {
      
$buffer fgets($in4096);
    }
    
    
// Grab the "headers" for this MIME part
    
$thiscontenttype '';
    
$lines = array();
    
$data false;
    while (!
feof($in) && count($lines) < 2) {
      
$buffer fgets($in4096);
      if (
trim($buffer) == '' && !$data) {
        
$data true;
      } elseif(!
$data) {
        
preg_match_all($headerpattern$buffer$matches);
        
$thiscontenttype $matches[2][0];
      } elseif(
count($lines) < 2) {
        
$lines[] = $buffer;
      }
    }
    
fclose($in);
    if (
$thiscontenttype == 'text/plain' && ($lines[0] == "<x-html>\n" || $lines[0] == "<x-html><html>\n")) {
      
printhead($filename$headers);
      
fixmultipartcontenttype($filename);
    } elseif(
$lines[0] == "<x-flowed>\n") {
      
printhead($filename$headers);
      
removexflowed($filename);
    }
  }
}

function 
addcontenttype($file) {
  
$in fopen('/tmp/mail/' $file'r');
  
$out fopen($file'w');
  
$found false;

  while (!
feof($in)) {
    
$buffer fgets($in4096);
    if (
$buffer == "Mime-Version: 1.0\n" && !$found) {
      echo 
" Adding Content-Type header...\n";
      
fwrite($out"Content-Type: text/html\n");
      
$found true;
    }
    
fwrite($out$buffer);
  }
  
fclose($in);
  
fclose($out);
}

function 
removexflowed($file) {
  
$in fopen('/tmp/mail/' $file'r');
  
$out fopen($file'w');
  
$found false;

  echo 
" Removing x-flowed tags...\n";
  while (!
feof($in)) {
    
$buffer fgets($in4096);
    if (
$buffer == "<x-flowed>\n" || $buffer == "</x-flowed>\n") {
      
$buffer "";
    }
    
fwrite($out$buffer);
  }
  
fclose($in);
  
fclose($out);
}

function 
fixmultipartcontenttype($file) {
  
$data false;
  
$mimedata false;
  
$mimeheader false;
  
$thiscontenttype '';
  
$lines = array();
  
$headerpattern "/([A-Za-z0-9_-]+): ?(.*)/";
  
$boundarypattern '/multipart\/mixed; boundary="(.*)"/';

  
$in fopen('/tmp/mail/' $file'r');
  
$out fopen($file'w');
  
  
$i 0;
  while (!
feof($in)) {
    
$buffer fgets($in4096);
    
$i++;
    if (
trim($buffer) == '' && !$data) {
      
$data true;
    } elseif(!
$data) {
      
preg_match_all($headerpattern$buffer$matches);
      if (
$matches[1][0] == 'Content-Type') {
        
// Get the label for the next MIME boundary
        
preg_match_all($boundarypattern$matches[2][0], $matches);
        
$boundary $matches[1][0];
      }
    } elseif(
$data && $boundary && !$mimeheader) {
      if (
$buffer == "--" $boundary "\n") {
        
$mimeheader true;
      }
    } elseif (
$mimeheader) {
      if (
trim($buffer) == '' && !$mimedata) {
        
$mimedata true;
      } elseif(!
$mimedata) {
        
preg_match_all($headerpattern$buffer$matches);
        
$thiscontenttype $matches[2][0];
        if (
$thiscontenttype == "text/plain") {
          echo 
" Fixing MIME Content-Type...\n";
          
$buffer "Content-Type:text/html\n";
        }
      }
    }
    
fwrite($out$buffer);
  }

  
fclose($in);
  
fclose($out);
}
?>