⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transport.java

📁 java编写的email客户端软件
💻 JAVA
字号:

/**
 *  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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -