smtpclient.java

来自「apache推出的net包」· Java 代码 · 共 596 行 · 第 1/2 页

JAVA
596
字号
/* * Copyright 2001-2005 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.commons.net.smtp;import java.io.IOException;import java.io.Writer;import java.net.InetAddress;import org.apache.commons.net.io.DotTerminatedMessageWriter;/*** * SMTPClient encapsulates all the functionality necessary to send files * through an SMTP server.  This class takes care of all * low level details of interacting with an SMTP server and provides * a convenient higher level interface.  As with all classes derived * from {@link org.apache.commons.net.SocketClient}, * you must first connect to the server with * {@link org.apache.commons.net.SocketClient#connect  connect } * before doing anything, and finally * {@link org.apache.commons.net.SocketClient#disconnect  disconnect } * after you're completely finished interacting with the server. * Then you need to check the SMTP reply code to see if the connection * was successful.  For example: * <pre> *    try { *      int reply; *      client.connect("mail.foobar.com"); *      System.out.print(client.getReplyString()); * *      // After connection attempt, you should check the reply code to verify *      // success. *      reply = client.getReplyCode(); * *      if(!SMTPReply.isPositiveCompletion(reply)) { *        client.disconnect(); *        System.err.println("SMTP server refused connection."); *        System.exit(1); *      } * *      // Do useful stuff here. *      ... *    } catch(IOException e) { *      if(client.isConnected()) { *        try { *          client.disconnect(); *        } catch(IOException f) { *          // do nothing *        } *      } *      System.err.println("Could not connect to server."); *      e.printStackTrace(); *      System.exit(1); *    } * </pre> * <p> * Immediately after connecting is the only real time you need to check the * reply code (because connect is of type void).  The convention for all the * SMTP command methods in SMTPClient is such that they either return a * boolean value or some other value. * The boolean methods return true on a successful completion reply from * the SMTP server and false on a reply resulting in an error condition or * failure.  The methods returning a value other than boolean return a value * containing the higher level data produced by the SMTP command, or null if a * reply resulted in an error condition or failure.  If you want to access * the exact SMTP reply code causing a success or failure, you must call * {@link org.apache.commons.net.smtp.SMTP#getReplyCode  getReplyCode } after * a success or failure. * <p> * You should keep in mind that the SMTP server may choose to prematurely * close a connection for various reasons.  The SMTPClient class will detect a * premature SMTP server connection closing when it receives a * {@link org.apache.commons.net.smtp.SMTPReply#SERVICE_NOT_AVAILABLE SMTPReply.SERVICE_NOT_AVAILABLE } *  response to a command. * When that occurs, the method encountering that reply will throw * an {@link org.apache.commons.net.smtp.SMTPConnectionClosedException} * . * <code>SMTPConectionClosedException</code> * is a subclass of <code> IOException </code> and therefore need not be * caught separately, but if you are going to catch it separately, its * catch block must appear before the more general <code> IOException </code> * catch block.  When you encounter an * {@link org.apache.commons.net.smtp.SMTPConnectionClosedException} * , you must disconnect the connection with * {@link #disconnect  disconnect() } to properly clean up the * system resources used by SMTPClient.  Before disconnecting, you may check * the last reply code and text with * {@link org.apache.commons.net.smtp.SMTP#getReplyCode  getReplyCode }, * {@link org.apache.commons.net.smtp.SMTP#getReplyString  getReplyString }, * and * {@link org.apache.commons.net.smtp.SMTP#getReplyStrings getReplyStrings}. * <p> * Rather than list it separately for each method, we mention here that * every method communicating with the server and throwing an IOException * can also throw a * {@link org.apache.commons.net.MalformedServerReplyException} * , which is a subclass * of IOException.  A MalformedServerReplyException will be thrown when * the reply received from the server deviates enough from the protocol * specification that it cannot be interpreted in a useful manner despite * attempts to be as lenient as possible. * <p> * <p> * @author Daniel F. Savarese * @see SMTP * @see SimpleSMTPHeader * @see RelayPath * @see SMTPConnectionClosedException * @see org.apache.commons.net.MalformedServerReplyException ***/public class SMTPClient extends SMTP{    /*     * Default SMTPClient constructor.  Creates a new SMTPClient instance.     */    //public SMTPClient() {  }    /***     * At least one SMTPClient method ({@link #sendMessageData  sendMessageData })     * does not complete the entire sequence of SMTP commands to complete a     * transaction.  These types of commands require some action by the     * programmer after the reception of a positive intermediate command.     * After the programmer's code completes its actions, it must call this     * method to receive the completion reply from the server and verify the     * success of the entire transaction.     * <p>     * For example,     * <pre>     * writer = client.sendMessage();     * if(writer == null) // failure     *   return false;     * header =     *  new SimpleSMTPHeader("foobar@foo.com", "foo@foobar.com", "Re: Foo");     * writer.write(header.toString());     * writer.write("This is just a test");     * writer.close();     * if(!client.completePendingCommand()) // failure     *   return false;     * </pre>     * <p>     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.     * @exception IOException  If an I/O error occurs while either sending a     *      command to the server or receiving a reply from the server.     ***/    public boolean completePendingCommand() throws IOException    {        return SMTPReply.isPositiveCompletion(getReply());    }    /***     * Login to the SMTP server by sending the HELO command with the     * given hostname as an argument.  Before performing any mail commands,     * you must first login.     * <p>     * @param hostname  The hostname with which to greet the SMTP server.     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.     * @exception IOException  If an I/O error occurs while either sending a     *      command to the server or receiving a reply from the server.     ***/    public boolean login(String hostname) throws IOException    {        return SMTPReply.isPositiveCompletion(helo(hostname));    }    /***     * Login to the SMTP server by sending the HELO command with the     * client hostname as an argument.  Before performing any mail commands,     * you must first login.     * <p>     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.     * @exception IOException  If an I/O error occurs while either sending a     *      command to the server or receiving a reply from the server.     ***/    public boolean login() throws IOException    {        String name;        InetAddress host;        host = getLocalAddress();        name = host.getHostName();        if (name == null)            return false;        return SMTPReply.isPositiveCompletion(helo(name));    }    /***     * Set the sender of a message using the SMTP MAIL command, specifying     * a reverse relay path.  The sender must be set first before any     * recipients may be specified, otherwise the mail server will reject     * your commands.     * <p>     * @param path  The reverse relay path pointing back to the sender.     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.     * @exception IOException  If an I/O error occurs while either sending a     *      command to the server or receiving a reply from the server.     ***/    public boolean setSender(RelayPath path) throws IOException    {        return SMTPReply.isPositiveCompletion(mail(path.toString()));    }    /***     * Set the sender of a message using the SMTP MAIL command, specifying     * the sender's email address. The sender must be set first before any     * recipients may be specified, otherwise the mail server will reject     * your commands.     * <p>     * @param address  The sender's email address.     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.     * @exception IOException  If an I/O error occurs while either sending a     *      command to the server or receiving a reply from the server.     ***/    public boolean setSender(String address) throws IOException    {        return SMTPReply.isPositiveCompletion(mail("<" + address + ">"));    }    /***     * Add a recipient for a message using the SMTP RCPT command, specifying     * a forward relay path.  The sender must be set first before any     * recipients may be specified, otherwise the mail server will reject     * your commands.     * <p>     * @param path  The forward relay path pointing to the recipient.     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.     * @exception IOException  If an I/O error occurs while either sending a     *      command to the server or receiving a reply from the server.     ***/    public boolean addRecipient(RelayPath path) throws IOException    {        return SMTPReply.isPositiveCompletion(rcpt(path.toString()));    }    /***     * Add a recipient for a message using the SMTP RCPT command, the     * recipient's email address.  The sender must be set first before any     * recipients may be specified, otherwise the mail server will reject     * your commands.     * <p>     * @param address  The recipient's email address.     * @return True if successfully completed, false if not.     * @exception SMTPConnectionClosedException     *      If the SMTP server prematurely closes the connection as a result     *      of the client being idle or some other reason causing the server     *      to send SMTP reply code 421.  This exception may be caught either     *      as an IOException or independently as itself.

⌨️ 快捷键说明

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