📄 pop3client.java
字号:
/**
* POP3Client.java
*
* Copyright (C) 1998-2000 FreeBeans <freebeans@mub.biglobe.ne.jp>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU 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.
*
* Copyright (C) 1998-2000ꆼ FreeBeans <freebeans@mub.biglobe.ne.jp>
*
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼFree Software Foundation
* ꆼꆼꆼꆼꆼGNU ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* GNU ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼGNU ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼFree Software Foundation, Inc., 675 Mass Ave,
* Cambridge, MA 02139, USA ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
package jp.gr.java_conf.roadster.net.pop;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.SocketException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.net.ssl.SSLSocketFactory;
/**
* POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼꆼꆼꆼꆼjavax.mail.* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* <BR>
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <OL>
* <LI>POP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼ.<BR>
* <UL><CODE>
* POP3Client pc = new POP3Client();<BR>
* pc.setHost("pop3.host.ne.jp");<BR>
* pc.setUser("user");<BR>
* pc.setPassword("password");<BR>
* pc.setAuthorizationMode(POP3Client.APOP_AUTHORIZATION);<BR>
* </CODE></UL>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <UL><CODE>
* pc.connect();<BR>
* </CODE></UL>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <UL><CODE>
* int count = pc.getMessageCount();<BR>
* </CODE></UL>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <UL><CODE>
* InputStream ins = pc.retrieve(i); // i ꆼꆼꆼꆼꆼꆼꆼ.<BR>
* while ((c = ins.read()) != -1) {
* <UL>
* // ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* </UL>
* }<BR>
* ins.close();<BR>
* </CODE></UL>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* <UL><CODE>
* pc.delete(i); // i ꆼꆼꆼꆼꆼꆼꆼ.<BR>
* </CODE></UL>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <UL><CODE>
* pc.disconnect();<BR>
* </CODE></UL>
* </OL>
*
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <OL>
* <LI>TCP/IPꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ(greeting)ꆼꆼꆼꆼꆼꆼꆼꆼ.
* <LI>USERꆼꆼꆼꆼꆼPASSꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼꆼAPOPꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* <LI>LIST ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* +OK ...<BR>
* 1 203[CRLF]<BR>
* 2 345[CRLF]<BR>
* (ꆼꆼ)<BR>
* .[CRLF]<BR>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ512 ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼꆼRETR ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* </OL>
*
*/
public class POP3Client implements Serializable {
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
static final long serialVersionUID = -3928372169782263062L;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ( = 512ꆼꆼꆼ).
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
private static final int MAX_LINE_LENGTH = 512;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
private static final String ENCODE = "8859_1";
/**
* ꆼꆼꆼꆼꆼꆼPOPꆼꆼꆼ(=110)
*/
protected static final int DEFAULT_POP3_PORT = 110;
/**
* CRꆼꆼꆼ.
*/
protected static final byte CR = 0x0d;
/**
* LFꆼꆼꆼ.
*/
protected static final byte LF = 0x0a;
/**
* USER ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_USER = "USER";
/**
* PASS ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_PASS = "PASS";
/**
* QUIT ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_QUIT = "QUIT";
/**
* STAT ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_STAT = "STAT";
/**
* LIST ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_LIST = "LIST";
/**
* RETR ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_RETR = "RETR";
/**
* DELE ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_DELE = "DELE";
/**
* NOOP ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_NOOP = "NOOP";
/**
* RSET ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_RSET = "RSET";
/**
* APOP ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_APOP = "APOP";
/**
* TOP ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_TOP = "TOP";
/**
* UIDL ꆼꆼꆼꆼ.
*/
protected static final String COMMAND_UIDL = "UIDL";
/**
* ꆼꆼꆼꆼ.
*/
protected static final String RESPONSE_OK = "+OK";
/**
* ꆼꆼꆼꆼꆼ.
*/
protected static final String RESPONSE_ERR = "-ERR";
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼ(USER/PASS ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*
* @see #setAuthorizationMode(int)
*/
public static final int NORMAL_AUTHORIZATION = 1;
/**
* APOPꆼꆼꆼꆼꆼ.
*
* @see #setAuthorizationMode(int)
*/
public static final int APOP_AUTHORIZATION = 2;
/**
* @serial POPꆼꆼꆼꆼ. ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
private String user;
/**
* ꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ transient ꆼꆼꆼ.
*/
private transient String password;
/**
* @serial POPꆼꆼꆼꆼꆼꆼꆼ.
*/
private String host;
/**
* @serial POPꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
private int port = -1;
/**
* @serial ꆼꆼꆼꆼꆼ. ꆼꆼꆼꆼꆼꆼ NORMAL_AUTHORIZATION
*/
private int authorizationMode = NORMAL_AUTHORIZATION;
/**
* ꆼꆼꆼꆼꆼꆼꆼ.
*/
protected transient Socket socket;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ Stream.
*/
protected transient InputStream in;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ Stream.
*/
protected transient OutputStream out;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
protected transient boolean connected = false;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
private transient byte responseBytes[];
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
private transient String status;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ(greeting).
*/
private transient String greeting;
/**
* LIST ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
protected transient String messageList[] = null;
/**
* UIDL ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
protected transient String uidList[] = null;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
protected transient POP3MessageInputStream messageInput = null;
/**
* @serial ꆼꆼꆼꆼꆼꆼꆼ.
*/
private boolean debug;
/**
* @serial ꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
protected int timeout;
/**
* @serial ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
private String preConnectCommand;
/**
* 是否使用ssl
*/
private boolean ssl;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼPOP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public POP3Client() {
// ꆼꆼꆼꆼꆼ.
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ POP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param host ꆼꆼꆼꆼ.
* @exception java.lang.IllegalArgumentException host ꆼ null ꆼꆼꆼ.
*/
public POP3Client(String host) {
this(host, DEFAULT_POP3_PORT);
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ POP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param host ꆼꆼꆼꆼ.
* @param port ꆼꆼꆼꆼꆼ.
* @exception java.lang.IllegalArgumentException host ꆼ null ꆼꆼꆼ.
*/
public POP3Client(String host, int port) {
setHost(host);
setPort(port);
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼSystem.err ꆼꆼꆼ.
*
* @param msg ꆼꆼꆼꆼꆼꆼꆼ.
*/
protected void debugOut(String msg) {
if (debug) {
StringBuffer buff = new StringBuffer("DEBUG:");
buff.append(msg);
System.err.println(buff.toString());
}
}
public void setDebug(boolean mode) {
this.debug = mode;
}
public boolean getDebug() {
return debug;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* CRLF ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼꆼꆼꆼꆼCRLFꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
protected synchronized String readResponseLine() throws IOException {
boolean cr = false;
int i;
for (i = 0; i < responseBytes.length; ++i) {
int c = in.read();
if (c == -1) {
break;
}
responseBytes[i] = (byte) c;
if (responseBytes[i] == CR) {
cr = true;
} else if (responseBytes[i] == LF && cr == true) {
break;
} else {
cr = false;
}
}
if( i== 0)
return "+OK";
return new String(responseBytes, 0, i - 1, ENCODE);
}
/**
* ꆼꆼꆼꆼꆼTCP/IPꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
*
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.lang.IllegalStateException ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
protected synchronized void openConnection() throws IOException {
if (isConnected()) {
throw new IllegalStateException("Already connected.");
}
String cmd = getPreConnectCommand();
if (cmd != null) {
debugOut("Execute preconnect command:" + cmd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -