ParseMail

From: gruban@oocities.com
To: tetractys@oocities.com
Subject: Mail Parser for UNIX

Thanks for your Java Post class. I am using it on my own pages and have written a Java class of my own to filter out the form-generated mail from my UNIX news feed.

Basically I put the line

java ParseMail /var/mail/gruban formMail "Subject: FORM results"
in my .login file, so that whenever I log on to my UNIX system to check my mail, all the email that includes those words will be appended to the file formMail, and the other email will be left behind in /var/mail.

Yes, it likely won't work on non-UNIX systems, but I thought you might be interested.

George Ruban, gruban@oocities.com

import java.io.*;
import java.util.StringTokenizer;

/** Class to pull selected mail messages out of a mail file
 * to a separate file. 
 * It seems that the /var/mail/user-name file is separated by
 * From a@b Date lines. 
 * The post mail example is at the end.
 * A minimal valid mail is the next 2 lines.
 * <PRE>
 * From MAILER-DAEMON@cs.bu.edu Wed Aug  6 10:00:30 1997
 * 
 * </PRE>
 * The following file is treated as 2 valid mails.
 * <PRE>
 * From MAILER-DAEMON@cs.bu.edu Wed Aug  6 10:00:30 1997
 * 
 * From MAILER-DAEMON@cs.bu.edu Wed Aug  6 10:00:30 1997
 * </PRE>
 * @author George Ruban
 * @version 1.0 8/6/97
 */
public class ParseMail
{
  /** Usage:
   * java ParseMail /path/to/mail/file /path/to/new/file "selection string" 
   */
  public static void main(String args[]) throws IOException
  {
    if(args.length!= 3)
    {
      System.err.println("Usage: java ParseMail /path/to/mail/file "
			 + "/path/to/new/file \"selection string\"");
      System.exit(1);
    }

    File mailFile = new File(args[0]);
    RandomAccessFile outFile = new RandomAccessFile(args[1], "rw");
    String searchString = args[2];
    DataInputStream in = new DataInputStream(new FileInputStream(mailFile));
    // holds mails to be left in mail file
    StringBuffer outBuf = new StringBuffer((int)mailFile.length());
    
    // read mail, one line at a time.
    String line = "";
    while(line != null)
    {
      // build up a complete mail, one line at a time
      StringBuffer mailBuf = new StringBuffer(1000);
      mailBuf.append(line);
      while(true)
      {
	line = in.readLine();
	if(line == null) break;
	if(line.startsWith("From "))
	{
	  StringTokenizer tok = new StringTokenizer(line);
	  if(tok.countTokens() == 7)
	  {
	    try
	    {
	      tok.nextToken(); // From
	      if(tok.nextToken().indexOf('@') < 0) // MAILER-DAEMON@cs.bu.edu 
		throw new RuntimeException(); 
	      tok.nextToken(); // Wed 
	      tok.nextToken(); // Aug  
	      Integer.parseInt(tok.nextToken());   // 6 
	      if(tok.nextToken().indexOf(':') != 2) // 10:00:30 
		throw new RuntimeException(); 
	      Integer.parseInt(tok.nextToken());   // 1997
	      break; // yup, it's a From - line
	    }
	    catch(RuntimeException notAFromLine) {}
	  }
	}   
	mailBuf.append(line + '\n');
      }

      // complete mail built up in mailBuf
      // decide whether to parse it out or not
      if(mailBuf.toString().indexOf(searchString) >= 0)
      {
	outFile.seek(outFile.length());
	outFile.writeBytes(mailBuf.toString());
      }
      else
      {
	outBuf.append(mailBuf);
      }
    } // end while(line != null)
    
    // complete mail read, write back the unparsed parts
    in.close();
    in = null;
    outFile.close();
    FileOutputStream out = new FileOutputStream(mailFile);
    byte [] buf = new byte[outBuf.length()];
    outBuf.toString().getBytes(0, buf.length, buf, 0);
    out.write(buf);
  }
}

TETRACTYS Freeware Main Page

In the next Issue Java GeoUtilities will be

Using the GeoCities GuestBook for Hiscores

GeoCities