pop3client.java

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

JAVA
550
字号
/* * 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.pop3;import java.io.IOException;import java.io.Reader;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Enumeration;import java.util.StringTokenizer;import org.apache.commons.net.io.DotTerminatedMessageReader;/*** * The POP3Client class implements the client side of the Internet POP3 * Protocol defined in RFC 1939.  All commands are supported, including * the APOP command which requires MD5 encryption.  See RFC 1939 for * more details on the POP3 protocol. * <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 POP3MessageInfo * @see org.apache.commons.net.io.DotTerminatedMessageReader * @see org.apache.commons.net.MalformedServerReplyException ***/public class POP3Client extends POP3{    private static POP3MessageInfo __parseStatus(String line)    {        int num, size;        StringTokenizer tokenizer;        tokenizer = new StringTokenizer(line);        if (!tokenizer.hasMoreElements())            return null;        num = size = 0;        try        {            num = Integer.parseInt(tokenizer.nextToken());            if (!tokenizer.hasMoreElements())                return null;            size = Integer.parseInt(tokenizer.nextToken());        }        catch (NumberFormatException e)        {            return null;        }        return new POP3MessageInfo(num, size);    }    private static POP3MessageInfo __parseUID(String line)    {        int num;        StringTokenizer tokenizer;        tokenizer = new StringTokenizer(line);        if (!tokenizer.hasMoreElements())            return null;        num = 0;        try        {            num = Integer.parseInt(tokenizer.nextToken());            if (!tokenizer.hasMoreElements())                return null;            line = tokenizer.nextToken();        }        catch (NumberFormatException e)        {            return null;        }        return new POP3MessageInfo(num, line);    }    /***     * Login to the POP3 server with the given username and password.  You     * must first connect to the server with     * {@link org.apache.commons.net.SocketClient#connect  connect }     * before attempting to login.  A login attempt is only valid if     * the client is in the     * {@link org.apache.commons.net.pop3.POP3#AUTHORIZATION_STATE AUTHORIZATION_STATE }     * .  After logging in, the client enters the     * {@link org.apache.commons.net.pop3.POP3#TRANSACTION_STATE TRANSACTION_STATE }     * .     * <p>     * @param username  The account name being logged in to.     * @param password  The plain text password of the account.     * @return True if the login attempt was successful, false if not.     * @exception IOException If a network I/O error occurs in the process of     *            logging in.     ***/    public boolean login(String username, String password) throws IOException    {        if (getState() != AUTHORIZATION_STATE)            return false;        if (sendCommand(POP3Command.USER, username) != POP3Reply.OK)            return false;        if (sendCommand(POP3Command.PASS, password) != POP3Reply.OK)            return false;        setState(TRANSACTION_STATE);        return true;    }    /***     * Login to the POP3 server with the given username and authentication     * information.  Use this method when connecting to a server requiring     * authentication using the APOP command.  Because the timestamp     * produced in the greeting banner varies from server to server, it is     * not possible to consistently extract the information.  Therefore,     * after connecting to the server, you must call     * {@link org.apache.commons.net.pop3.POP3#getReplyString getReplyString }     *  and parse out the timestamp information yourself.     * <p>     * You must first connect to the server with     * {@link org.apache.commons.net.SocketClient#connect  connect }     * before attempting to login.  A login attempt is only valid if     * the client is in the     * {@link org.apache.commons.net.pop3.POP3#AUTHORIZATION_STATE AUTHORIZATION_STATE }     * .  After logging in, the client enters the     * {@link org.apache.commons.net.pop3.POP3#TRANSACTION_STATE TRANSACTION_STATE }     * .  After connecting, you must parse out the     * server specific information to use as a timestamp, and pass that     * information to this method.  The secret is a shared secret known     * to you and the server.  See RFC 1939 for more details regarding     * the APOP command.     * <p>     * @param username  The account name being logged in to.     * @param timestamp  The timestamp string to combine with the secret.     * @param secret  The shared secret which produces the MD5 digest when     *        combined with the timestamp.     * @return True if the login attempt was successful, false if not.     * @exception IOException If a network I/O error occurs in the process of     *            logging in.     * @exception NoSuchAlgorithmException If the MD5 encryption algorithm     *      cannot be instantiated by the Java runtime system.     ***/    public boolean login(String username, String timestamp, String secret)    throws IOException, NoSuchAlgorithmException    {        int i;        byte[] digest;        StringBuffer buffer, digestBuffer;        MessageDigest md5;        if (getState() != AUTHORIZATION_STATE)            return false;        md5 = MessageDigest.getInstance("MD5");        timestamp += secret;        digest = md5.digest(timestamp.getBytes());        digestBuffer = new StringBuffer(128);        for (i = 0; i < digest.length; i++)            digestBuffer.append(Integer.toHexString(digest[i] & 0xff));        buffer = new StringBuffer(256);        buffer.append(username);        buffer.append(' ');        buffer.append(digestBuffer.toString());        if (sendCommand(POP3Command.APOP, buffer.toString()) != POP3Reply.OK)            return false;        setState(TRANSACTION_STATE);        return true;    }    /***     * Logout of the POP3 server.  To fully disconnect from the server     * you must call     * {@link org.apache.commons.net.pop3.POP3#disconnect  disconnect }.     * A logout attempt is valid in any state.  If     * the client is in the     * {@link org.apache.commons.net.pop3.POP3#TRANSACTION_STATE TRANSACTION_STATE }     * , it enters the     * {@link org.apache.commons.net.pop3.POP3#UPDATE_STATE UPDATE_STATE }     *  on a successful logout.     * <p>     * @return True if the logout attempt was successful, false if not.     * @exception IOException If a network I/O error occurs in the process     *           of logging out.     ***/    public boolean logout() throws IOException    {        if (getState() == TRANSACTION_STATE)            setState(UPDATE_STATE);        sendCommand(POP3Command.QUIT);        return (_replyCode == POP3Reply.OK);    }    /***     * Send a NOOP command to the POP3 server.  This is useful for keeping     * a connection alive since most POP3 servers will timeout after 10     * minutes of inactivity.  A noop attempt will only succeed if     * the client is in the     * {@link org.apache.commons.net.pop3.POP3#TRANSACTION_STATE TRANSACTION_STATE }     * .     * <p>     * @return True if the noop attempt was successful, false if not.     * @exception IOException If a network I/O error occurs in the process of     *        sending the NOOP command.     ***/    public boolean noop() throws IOException    {        if (getState() == TRANSACTION_STATE)            return (sendCommand(POP3Command.NOOP) == POP3Reply.OK);        return false;    }    /***     * Delete a message from the POP3 server.  The message is only marked     * for deletion by the server.  If you decide to unmark the message, you     * must issuse a {@link #reset  reset } command.  Messages marked     * for deletion are only deleted by the server on     * {@link #logout  logout }.     * A delete attempt can only succeed if the client is in the     * {@link org.apache.commons.net.pop3.POP3#TRANSACTION_STATE TRANSACTION_STATE }     * .     * <p>     * @param messageId  The message number to delete.     * @return True if the deletion attempt was successful, false if not.     * @exception IOException If a network I/O error occurs in the process of     *           sending the delete command.     ***/    public boolean deleteMessage(int messageId) throws IOException    {        if (getState() == TRANSACTION_STATE)            return (sendCommand(POP3Command.DELE, Integer.toString(messageId))                    == POP3Reply.OK);        return false;    }

⌨️ 快捷键说明

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