key0-96/
key0-96/doc/key/
key0-96/doc/key/credits/
key0-96/doc/key/developers/
key0-96/doc/key/developers/resources/
key0-96/setup/caves/
key0-96/setup/help/
key0-96/setup/ruins/
key0-96/src/
key0-96/src/commands/
key0-96/src/events/
key0-96/src/hack/
key0-96/src/sql/
key0-96/src/swing/
key0-96/src/talker/forest/
key0-96/src/talker/objects/
key0-96/src/terminals/
/*
**               j###t  ########## ####   ####
**              j###t   ########## ####   ####
**             j###T               "###L J###"
**          ######P'    ##########  #########
**          ######k,    ##########   T######T
**          ####~###L   ####
**          #### q###L  ##########   .#####
**          ####  \###L ##########   #####"
**
**  $Id$
**  
**    This code was originally written by
**    James Driscoll, maus@io.com
**
**    I've 'tidied' it up a little.  The
**    copy I had didn't work. *shrug*
**  
**  Class History
**
**  Date        Name         Description
**  ---------|------------|-----------------------------------------------
**  19Aug98     subtle       start of recorded history
**
*/

package key.util;

import java.net.*;
import java.io.*;
import java.util.*;

public class SMTP
{
	public static final int DEFAULT_PORT = 25;

	protected DataInput reply = null;
	protected PrintStream send = null;
	protected Socket sock = null;

	public SMTP( String hostid ) throws UnknownHostException, IOException
	{
		this( hostid, DEFAULT_PORT );
	}

	public SMTP( String hostid, int port ) throws UnknownHostException, IOException
	{
		sock = new Socket( hostid, port );
		reply = new DataInputStream( sock.getInputStream() );
		send = new PrintStream( sock.getOutputStream() );

		String recv = reply.readLine();
		if( !recv.startsWith( "220" ) )
			throw new ProtocolException( recv );

		while( recv.indexOf( '-' ) == 3 )
		{
			recv = reply.readLine();
			if( !recv.startsWith( "220" ) )
			throw new ProtocolException( recv );
		}
	}

	public SMTP( InetAddress address ) throws IOException
	{
		this( address, DEFAULT_PORT );
	}

	public SMTP( InetAddress address, int port ) throws IOException
	{
		sock = new Socket( address, port );
		reply = new DataInputStream( sock.getInputStream() );
		send = new PrintStream( sock.getOutputStream() );

		String recv = reply.readLine();

		if( !recv.startsWith( "220" ) )
			throw new ProtocolException( recv );
		
		while( recv.indexOf( '-' ) == 3 )
		{
			recv = reply.readLine();
			if( !recv.startsWith( "220" ) )
			throw new ProtocolException( recv );
		}
	}

	public void send( String from_address, String to_address, String subject, String message ) throws IOException, ProtocolException
	{
		String recv;

		send.println( "HELO smtp" );
		recv = reply.readLine();
		if( !recv.startsWith( "250" ) )
			throw new ProtocolException(recv);

		send.println( "MAIL FROM: " + from_address );

		recv = reply.readLine();
		if( !recv.startsWith( "250" ) )
			throw new ProtocolException(recv);

		send.println( "RCPT TO: " + to_address );
		recv = reply.readLine();
		if( !recv.startsWith( "250" ) )
			throw new ProtocolException(recv);

		send.println("DATA");
		recv = reply.readLine();
		if( !recv.startsWith( "354" ) )
			throw new ProtocolException( recv );

		send.println( "From: " + from_address );
		send.println( "To: " + to_address );
		send.println( "Subject: " + subject );
		send.println( "Date: " + msgDateFormat( new Date() ) );
		send.println( "Comment: Automated message" );
		send.println( "X-Mailer: Key Smtp" );

			// Sending a blank line ends the header part.
		send.println();

			// Now send the message proper
		send.println( message );
		send.println( "." );
		recv = reply.readLine();
		if( !recv.startsWith( "250" ) )
			throw new ProtocolException( recv );
	}

	protected void finalize() throws Throwable
	{
		send.println( "QUIT" );
		sock.close();
		super.finalize();
	}

	private static String Day[] =
	{
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
	};
	
	private static String Month[] =
	{
		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
	};

	private final String msgDateFormat( Date senddate )
	{
		StringBuffer formatted = new StringBuffer();
		
		formatted.append( Day[ senddate.getDay() ] );
		formatted.append( ", " );
		formatted.append( String.valueOf( senddate.getDate() ) );
		formatted.append( " " );
		formatted.append( Month[ senddate.getMonth() ] );
		formatted.append( " " );
		
		if( senddate.getYear() > 99 )
			formatted.append( String.valueOf( senddate.getYear() + 1900 ) );
		else
			formatted.append( String.valueOf( senddate.getYear() ) );

		formatted.append( " " );

		appendLeadingZeroNumber( senddate.getHours(), formatted );
		formatted.append( ":" );
		
		appendLeadingZeroNumber( senddate.getMinutes(), formatted );
		formatted.append( ":" );
		
		appendLeadingZeroNumber( senddate.getSeconds(), formatted );
		formatted.append( " " );
		
		if( senddate.getTimezoneOffset() < 0 )
			formatted.append( "+" );
		else
			formatted.append( "-" );
		
		appendLeadingZeroNumber( senddate.getTimezoneOffset()/60, formatted );
		appendLeadingZeroNumber( senddate.getTimezoneOffset()%60, formatted );
		
		return( formatted.toString() );
	}

	private final void appendLeadingZeroNumber( int num, StringBuffer sb )
	{
		if( num < 10 )
			sb.append( "0" );

		sb.append( String.valueOf( num ) );
	}
}