|
What this is
Other links
The source code
/**
* Transport.java
*
* Version 1.2
*
* September 27, 1999
*
* Copyright (C) 1999 Bill Lynch, CoolServlets.com
*
* 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.
* http://www.coolservlets.com/LGPL.html
*
* 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
*
* Version 1.2 now reads from the SMTP port and reports errors in a more robust fashion.
* It also implements the Transportable interface.
*
* Version 1.1.1 includes a minor bugfix.
* This line in the send method:
* PrintWriter out = new PrintWriter( s.getOutputStream(), true );
* was fixed. (Thanks to Jon Barber.)
*
* 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 ) {
* System.err.println( "TransportException! " + te );
* }
*
*/
import java.io.*;
import java.net.*;
import java.util.*;
/**
* Transport class
*
* This class accepts a Message object and uses its data to construct and send an email message.
*/
public class Transport implements Transportable {
private String smtpHost;
private String smtpResponse;
private int smtpPort;
/**
* 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 this.smtpHost;
}
/**
* Returns the SMTP port number (usually 25).
*/
public int getSmtpPort( ) {
return this.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;
}
/**
* send method
* -------------------------------------------------------------------------
* 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 5 or 6 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 {
PrintWriter out = null;
BufferedReader in = null;
try {
// Open a connection to the SMTP port:
Socket s = new Socket( this.smtpHost, this.smtpPort );
// The following line now includes a "true" in the PrintWriter constructor.
// This makes the stream flush after every println by default. This fixes a bug
// found by Jon Barber.
out = new PrintWriter( s.getOutputStream(), true );
// Create a BufferedReader so we can read back response codes from the SMTP port
in = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
// Check to see that we connected the SMTP port correctly by reading a
// line from the SMTP port and checking the error response code.
// We use StringBuffers to maximize efficiency.
if( smtpErrorExists( in,"220" ) ) {
throw new TransportException( "Can't connect to: " + this.smtpHost + ". Port: " + this.smtpPort + "\t" + this.smtpResponse );
}
}
catch( IOException ioe ) {
throw new TransportException( "Can't connect to: " + this.smtpHost + ". Port: " + this.smtpPort + "\t " );
}
sendMessage( msg, in, out );
}
private void sendMessage( Message msg, BufferedReader in, PrintWriter out ) throws TransportException {
//Date timestamp = new Date();
// Say hello to the SMTP port then check for the appropriate response code
out.println( "HELO " + this.smtpHost );
if( smtpErrorExists( in,"250" ) ) {
throw new TransportException( "SMTP error: HELO failed.\t" + smtpResponse );
}
// Start writing our mail data to the SMTP port starting with the sender of the email.
// Actually, to send an email via SMTP, you don't need to included the MAIL FROM field -- this
// allows you to send emails completely anonymously. In this package, I make it a requirement
// to include the MAIL FROM field just so this email package isn't spammer friendly 'out of the box'.
Address[] from = msg.getFrom();
if( from == null ) {
throw new TransportException( "SMTP error: No FROM address specified, can't send email.\t " );
}
/* added new "else" statement in ver 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() + ">" );
if( smtpErrorExists( in,"250" ) ) {
throw new TransportException( "SMTP error: adding a sender failed (FROM field).\t" + smtpResponse );
}
}
else {
throw new TransportException( "SMTP error: No FROM address specified, can't send email." );
}
}
// TO, CC, BCC (all are added to the recipient list)
// SMTP error checking is done after every recipient is added.
Address[] to = msg.getRecipients( RecipientType.TO );
if( to == null || to.length == 0 ) {
throw new TransportException( "SMTP error: no RCPT TO (a recipient) specified." );
}
else {
for( int i=0; i<to.length; i++ ) {
out.println( "RCPT TO: <"+ to[i].getAddress() +">" );
if( smtpErrorExists( in,"250" ) ) {
throw new TransportException( "SMTP error: adding a TO recipient failed. Error with this address: " + to[i].getAddress() + "\t" + smtpResponse );
}
}
}
Address[] cc = msg.getRecipients( RecipientType.CC );
if( cc != null ) {
for( int i=0; i<cc.length; i++ ) {
out.println( "RCPT TO: <"+ cc[i].getAddress() +">" );
if( smtpErrorExists( in,"250" ) ) {
throw new TransportException( "SMTP error: adding a CC recipient failed. Error with this address: " + cc[i].getAddress() + "\t" + smtpResponse );
}
}
}
Address[] bcc = msg.getRecipients( RecipientType.BCC );
if( bcc != null ) {
for( int i=0; i<bcc.length; i++ ) {
out.println( "RCPT TO: <"+ bcc[i].getAddress() +">" );
if( smtpErrorExists( in,"250" ) ) {
throw new TransportException( "SMTP error: adding a BCC recipient failed. Error with this address: " + bcc[i].getAddress() + "\t" + smtpResponse );
}
}
}
// Start of data section
out.println( "DATA" );
if( smtpErrorExists( in,"354" ) ) {
throw new TransportException( "SMTP error: Writing DATA field of message failed.\t" + smtpResponse );
}
else {
// From:
if( from != null ) {
out.println( "From: "+ ( (from[0].getPersonal() != null) ? from[0].getPersonal()+" " : "" ) + "<"+ from[0].getAddress() +">" );
}
// To:
if( to != null && to.length > 0 ) {
StringBuffer buf = new StringBuffer();
buf.append( "To: " );
for( int i=0; i<to.length; i++ ) {
buf.append( (to[i].getPersonal()!=null)
? ( to[i].getPersonal() + " <" + to[i].getAddress() + ">" )
: ( to[i].getAddress() ) );
if( i < to.length-1 ) { // add commas between emails
buf.append( ", " );
}
}
out.println( buf.toString() );
}
// CC:
if( cc != null && cc.length > 0 ) {
StringBuffer buf = new StringBuffer();
buf.append( "CC: " );
for( int i=0; i<cc.length; i++ ) {
buf.append( (cc[i].getPersonal()!=null)
? ( cc[i].getPersonal() + " <" + cc[i].getAddress() + ">" )
: ( cc[i].getAddress() ) );
if( i < cc.length-1 ) // add commas between emails
buf.append( ", " );
}
out.println( buf.toString() );
}
// Reply-To: (there should only be one reply-to address)
Address replyTo = msg.getReplyTo();
if( replyTo != null ) {
String rt = replyTo.getAddress();
if( rt != null && rt.length() > 0 ) {
StringBuffer buf = new StringBuffer();
buf.append( "Reply-To: " );
buf.append( (replyTo.getPersonal()!=null)
? ( replyTo.getPersonal() + " <" + replyTo.getAddress() + ">" )
: ( replyTo.getAddress() ) );
out.println( buf.toString() );
}
}
// Subject:
if( msg.getSubject() != null ) {
out.println( "Subject: "+ msg.getSubject() );
}
// Email body:
if( msg.getText() != null ) {
out.println( msg.getText() );
}
// End:
// Signal that we're done with the email by printing the DATA section with
// a dot on a line by itself.
out.println( "." );
// Check to see if the message was successfully queued for delievery:
if( smtpErrorExists( in,"250" ) ) {
throw new TransportException( "Error: Message failed to be sent.\t" + smtpResponse );
}
// Exit the SMTP port
out.println( "QUIT" );
} // else
out.close();
} // end "send" method
/**
* smtpErrorExists( BufferedReader in, String errorCode )
* Checks for errors in the SMTP response.
*/
private boolean smtpErrorExists( BufferedReader in, String errorCode ) {
try {
smtpResponse = in.readLine();
if( !smtpResponse.startsWith( errorCode ) ) {
return true;
}
return false;
}
catch( IOException ioe ) {
return true;
}
}
}
|
| ... 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.