|
What this is
Other links
The source code
/**
* Transport.java
*
* Bill Lynch
* CoolServlets.com
* April 21 1999
*
* Email Package Version 1.1
*
* Copyright (C) 1999 Bill Lynch
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.coolservlets.email;
/**
* Transport class
*
* This class is the class that actually sends an email by talking to an SMTP
* server.
*
* What's changed in 1.1 (most changes to 1.1 occured in THIS class)
* 1. Improved the FROM field a little so that the correct error is thrown if
* the FROM is not included. (It's required inorder to send an email.)
* 2. Fixed the behavior of the "To" and "Cc" fields. In 1.0, multiple To's
* or Cc's would display as multiple copies of the first email address.
* There was no problem in sending, just displaying.
* 3. Brackets are no longer printed for a single email address:
* Before: <bill@coolservlets.com>
* After: bill@coolservlets.com
*
* SMTP documentation (RFC821) can be found at:
* http://freesoft.org/CIE/RFC/821/index.htm
*
* This class also checks for errors. An exception is thrown if a connection
* to the SMTP server cannot be established.
* The message itself must have the FROM and TO fields specified. (Acutally,
* to send an email through SMTP, you don't need a FROM field. I decided to
* require it to prevent totally anonymous emails. However, you could take
* that requirement out if you wanted to.)
*
* Here's how this class should be used:
*
* Message msg = new Message(); // fill this up, ie, FROM, TO's, etc... (see Message class)
* Transport tr = new Transport( "yourHost.com", 25 ); // SMTP ports are 25 by default
* try
* { tr.send( msg );
* }
* catch( TransportExeception te )
* { }
*
* You should probably do something with the exception instead of ignoring it
* like I just did. :)
*
* Public Methods:
* Transport()
* Transport( String smtpHost, int smtpPort )
* String getSmtpHost( )
* getSmtpPort( )
* void setSmtpHost( String smtpHost )
* void setSmtpPort( int smtpPort )
* void send( Message msg ) throws TransportException
*
* Private Methods/Fields:
* String smtpHost;
* int smtpPort;
*
*/
import java.io.*;
import java.net.*;
import java.util.*;
/**
* Transport class
*
* This class
*/
public class Transport
{
public Transport()
{}
/**
* Construct a Transport object by specifying a host and port.
*/
public Transport( String smtpHost, int smtpPort )
{ this.smtpHost = smtpHost;
this.smtpPort = smtpPort;
}
/**
* Returns the SMTP host (ie, smtpServer.coolservlets.com).
*/
public String getSmtpHost( )
{ return smtpHost;
}
/**
* Returns the SMTP port number (usually 25).
*/
public int getSmtpPort( )
{ return smtpPort;
}
/**
* Sets the SMTP host.
*/
public void setSmtpHost( String smtpHost )
{ this.smtpHost = smtpHost;
}
/**
* Sets the SMTP port number.
*/
public void setSmtpPort( int smtpPort )
{ this.smtpPort = smtpPort;
}
/**
* Sends the message by talking to a SMTP port.
*
* Here's a quick bit of SMTP info (you DON'T need to know this to use this class):
*
* To send an email via SMTP, simply connect to the SMTP server on
* port 25. Here's the basic X commands to send an email:
* (The ">" lines will be what is written back from the SMTP server)
* Also note, that I've removed my own server info with "x"'s
*
* > 220 xxx.xxx.net ESMTP Sendmail 8.9.1/8.9.1; Thu, 1 Apr 1999 12:55:27 -0600 (CST)
* HELO yourHost.com
* > 250 xxx.xxx.net Hello xxx.xxx.xxx.net [000.000.000.000], pleased to meet you
* MAIL FROM: <yourName@yourPlace.com>
* > 250 <yourName@yourPlace.com>... Sender ok
* RCPT TO: <someoneYouKnow@theirPlace.com>
* > 250 <someoneYouKnow@theirPlace.com>... Recipient ok
* DATA
* > 354 Enter mail, end with "." on a line by itself
* From: Your Name <yourName@yourPlace.com>
* To: Someone You Know <someoneYouKnow@theirPlace.com>
* Subject: Hi There
* Hi, how's it going?
* Later!
* .
* > 250 MAA19177 Message accepted for delivery
* QUIT
*
*/
public void send( Message msg ) throws TransportException
{
try
{
Socket s = new Socket( this.smtpHost, this.smtpPort );
PrintWriter out = new PrintWriter( s.getOutputStream() );
// Successive versions of this class will get feedback from the SMTP server like so:
// InputStreamReader in = new InputStreamReaders( s.getInputStream() );
// This will allow for more robust error checking.
// Say Hi...
out.println( "HELO " + this.smtpHost );
// FROM
Address[] from = msg.getFrom();
if( from == null || from.length == 0 )
throw new TransportException( "No \"FROM\" specified." );
/* added new "else" statement: 1.1 */
/* This is necessary to make sure that the FROM is included */
else
{ if( from[0].getAddress() != null && from[0].getAddress().length() > 0 )
out.println( "MAIL FROM: <" + from[0].getAddress() + ">" );
else
throw new TransportException( "No \"FROM\" specified." );
}
// TO, CC, BCC (all are added to the recipient list)
Address[] to = msg.getRecipients( RecipientType.TO );
if( to == null || to.length == 0 )
throw new TransportException( "No \"TO\" specified." );
else
for( int i=0; i<to.length; i++ )
out.println( "RCPT TO: <"+ to[i].getAddress() +">" );
Address[] cc = msg.getRecipients( RecipientType.CC );
if( cc != null )
for( int i=0; i<cc.length; i++ )
out.println( "RCPT TO: <"+ cc[i].getAddress() +">" );
Address[] bcc = msg.getRecipients( RecipientType.BCC );
if( bcc != null )
for( int i=0; i<bcc.length; i++ )
out.println( "RCPT TO: <"+ bcc[i].getAddress() +">" );
// Start of data section
out.println( "DATA" );
// From:
if( from != null )
out.println( "From: "+ ( (from[0].getPersonal() != null) ? from[0].getPersonal()+" " : "" )
+ "<"+ from[0].getAddress() +">" );
// To:
if( to != null && to.length > 0 )
{
String line = "To: ";
for( int i=0; i<to.length; i++ )
{
line += ( (to[i].getPersonal()!=null)
? ( to[i].getPersonal() + " <" + to[i].getAddress() + ">" )
: ( to[i].getAddress() )
);
if( i < to.length - 1 )
line += ", ";
}
out.println( line );
}
// CC:
if( cc != null && cc.length > 0 )
{
String line = "CC: ";
for( int i=0; i<cc.length; i++ )
{
line += ( (cc[i].getPersonal()!=null)
? ( cc[i].getPersonal() + " <" + cc[i].getAddress() + ">" )
: ( cc[i].getAddress() )
);
if( i < cc.length - 1 )
line += ", ";
}
out.println( line );
}
// Subject:
if( msg.getSubject() != null )
out.println( "Subject: "+ msg.getSubject() );
// The text of the email:
if( msg.getText() != null )
{ //out.println( new Date() ); // Uncomment for a timestamp in your message!
out.println( msg.getText() );
}
// Signal to the smtp server that we're all done and then quit.
out.println( "." );
out.println( "QUIT" );
out.close();
}
catch( IOException ioe )
{ throw new TransportException( "Error connecting to SMTP port." );
}
}
private String smtpHost;
private int smtpPort;
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.