home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / smtp / smtpclient.java next >
Text File  |  1995-08-11  |  5KB  |  204 lines

  1. /*
  2.  * @(#)SmtpClient.java    1.6 95/05/21 James Gosling
  3.  * 
  4.  * Copyright (c) 1995 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for NON-COMMERCIAL purposes and without fee is hereby
  8.  * granted provided that this copyright notice appears in all copies. Please
  9.  * refer to the file "copyright.html" for further important copyright and
  10.  * licensing information.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  15.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  16.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  17.  * ITS DERIVATIVES.
  18.  */
  19.  
  20. package net.smtp;
  21.  
  22. import java.util.StringTokenizer;
  23. import java.io.*;
  24. import net.*;
  25.  
  26. /**
  27.  * This class implements the SMTP client.
  28.  * You can send a piece of mail by creating a new SmtpClient, calling
  29.  * the "to" method to add destinations, calling "from" to name the
  30.  * sender, calling startMessage to return a stream to which you write
  31.  * the message (with RFC733 headers) and then you finally close the Smtp
  32.  * Client.
  33.  *
  34.  * @version    1.17, 12 Dec 1994
  35.  * @author    James Gosling
  36.  */
  37.  
  38. public class SmtpClient extends TransferProtocolClient {
  39.     SmtpPrintStream message;
  40.  
  41.     /**
  42.      * issue the QUIT command to the SMTP server and close the connection.
  43.      */
  44.     public void closeServer() {
  45.     if (serverIsOpen()) {
  46.         closeMessage();
  47.         issueCommand("QUIT\r\n", 221);
  48.         super.closeServer();
  49.     }
  50.     }
  51.  
  52.     void issueCommand(String cmd, int expect) {
  53.     sendServer(cmd);
  54.     int reply;
  55.     while ((reply = readServerResponse()) != expect)
  56.         if (reply != 220) {
  57.         throw new SmtpProtocolException(getResponseString());
  58.         }
  59.     }
  60.  
  61.     private void toCanonical(String s) {
  62.     issueCommand("rcpt to: " + s + "\r\n", 250);
  63.     }
  64.  
  65.     public void to(String s) {
  66.     int st = 0;
  67.     int limit = s.length();
  68.     int pos = 0;
  69.     int lastnonsp = 0;
  70.     int parendepth = 0;
  71.     boolean ignore = false;
  72.     while (pos < limit) {
  73.         int c = s.charAt(pos);
  74.         if (parendepth > 0) {
  75.         if (c == '(')
  76.             parendepth++;
  77.         else if (c == ')')
  78.             parendepth--;
  79.         if (parendepth == 0)
  80.             if (lastnonsp > st)
  81.             ignore = true;
  82.             else
  83.             st = pos + 1;
  84.         } else if (c == '(')
  85.         parendepth++;
  86.         else if (c == '<')
  87.         st = lastnonsp = pos + 1;
  88.         else if (c == '>')
  89.         ignore = true;
  90.         else if (c == ',') {
  91.         if (lastnonsp > st)
  92.             toCanonical(s.substring(st, lastnonsp));
  93.         st = pos + 1;
  94.         ignore = false;
  95.         } else {
  96.         if (c > ' ' && !ignore)
  97.             lastnonsp = pos + 1;
  98.         else if (st == pos)
  99.             st++;
  100.         }
  101.         pos++;
  102.     }
  103.     if (lastnonsp > st)
  104.         toCanonical(s.substring(st, lastnonsp));
  105.     }
  106.  
  107.     public void from(String s) {
  108.     issueCommand("mail from: " + s + "\r\n", 250);
  109.     }
  110.  
  111.     /** open a SMTP connection to host <i>host</i>. */
  112.     private void openServer(String host) {
  113.     openServer(host, 25);
  114.     issueCommand("helo "+InetAddress.localHostName+"\r\n", 250);
  115.     }
  116.  
  117.     public PrintStream startMessage() {
  118.     issueCommand("data\r\n", 354);
  119.     return message = new SmtpPrintStream(serverOutput, this);
  120.     }
  121.  
  122.     void closeMessage() {
  123.     if (message != null)
  124.         message.close();
  125.     }
  126.  
  127.     /** New SMTP client connected to host <i>host</i>. */
  128.     public SmtpClient (String host) {
  129.     super();
  130.     if (host != null) {
  131.         try {
  132.         openServer(host);
  133.         return;
  134.         } catch(Exception e) {
  135.         }
  136.     }
  137.     try {
  138.         String s = System.getenv("MAILHOST");
  139.         if (s != null) {
  140.         openServer(s);
  141.         return;
  142.         }
  143.     } catch(Exception e) {
  144.     }
  145.     try {
  146.         openServer("localhost");
  147.     } catch(Exception e) {
  148.         openServer("mailhost");
  149.     }
  150.     }
  151.  
  152.     /** Create an uninitialized SMTP client. */
  153.     public SmtpClient () {
  154.     this(null);
  155.     }
  156. }
  157.  
  158. class SmtpPrintStream extends java.io.PrintStream {
  159.     private SmtpClient target;
  160.     private int lastc = '\n';
  161.  
  162.     SmtpPrintStream (OutputStream fos, SmtpClient cl) {
  163.     super(fos);
  164.     target = cl;
  165.     }
  166.  
  167.     public void close() {
  168.     if (target == null)
  169.         return;
  170.     if (lastc != '\n') {
  171.         write('\r');
  172.         write('\n');
  173.     }
  174.     target.issueCommand(".\r\n", 250);
  175.     target.message = null;
  176.     out = null;
  177.     target = null;
  178.     }
  179.  
  180.     public void write(int b) {
  181.     if (lastc == '\n' && b == '.')
  182.         out.write('.');
  183.     out.write(b);
  184.     lastc = b;
  185.     }
  186.  
  187.     public void write(byte b[], int off, int len) {
  188.     int lc = lastc;
  189.     while (--len >= 0) {
  190.         int c = b[off++];
  191.         if (lc == '\n' && c == '.')
  192.         out.write('.');
  193.         out.write(c);
  194.         lc = c;
  195.     }
  196.     lastc = lc;
  197.     }
  198.     public void print(String s) {
  199.     int len = s.length();
  200.     for (int i = 0; i < len; i++)
  201.         write(s.charAt(i));
  202.     }
  203. }
  204.