📄 pop3client.java
字号:
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ true.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized boolean stat() throws POP3Exception, IOException {
return sendCommand(COMMAND_STAT);
}
/**
* ꆼꆼꆼꆼ NOOP ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ true.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized boolean noop() throws POP3Exception, IOException {
return sendCommand(COMMAND_NOOP);
}
/**
* ꆼꆼꆼꆼ RSET ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ true.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized boolean rset() throws POP3Exception, IOException {
return sendCommand(COMMAND_RSET);
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* STAT ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼLIST ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼ.
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized int getMessageCount() throws POP3Exception, IOException {
if (messageList == null) {
initList();
}
return messageList.length;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param pos ꆼꆼꆼꆼꆼꆼꆼ.ꆼꆼꆼꆼꆼꆼꆼꆼꆼ0.
* @return ꆼꆼꆼꆼꆼꆼꆼꆼ.(ꆼꆼꆼꆼꆼꆼꆼꆼ.ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ-1ꆼꆼꆼ.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized int getMessageSize(int pos) throws POP3Exception, IOException {
String item = getListItem(pos);
StringTokenizer st = new StringTokenizer(item);
String num = st.nextToken();
if (st.countTokens() > 0) {
String size = st.nextToken();
return Integer.parseInt(size);
} else {
return -1;
}
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼPOPꆼꆼꆼꆼꆼRETRꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* <OL>
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ (CRLF.CRLF ꆼꆼꆼꆼꆼꆼꆼꆼ.CRLF ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ)ꆼ
* <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼ (CRLF.. -> CRLF. ꆼꆼꆼꆼꆼ)
* </OL>
*
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼclose() ꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param pos ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ 0.
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼ InputStream.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized InputStream retrieve(int pos) throws POP3Exception, IOException {
if (messageInput != null) {
messageInput.close(); // ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
messageInput = null;
}
if (messageList == null) {
initList();
}
StringTokenizer tokenizer = new StringTokenizer(getListItem(pos));
String num = tokenizer.nextToken();
if (sendCommand(COMMAND_RETR + " " + num)) {
messageInput = new POP3MessageInputStream(in);
return messageInput;
} else {
throw new POP3NegativeResponseException(getStatusString());
}
}
/**
* TOP ꆼꆼꆼꆼ. ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ InputStream ꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param pos ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ 0.
* @param number ꆼꆼꆼꆼꆼꆼ.
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼ InputStream.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized InputStream top(int pos, int number) throws POP3NegativeResponseException, IOException {
if (messageInput != null) {
messageInput.close(); // ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
messageInput = null;
}
if (messageList == null) {
initList();
}
StringTokenizer tokenizer = new StringTokenizer(getListItem(pos));
String num = tokenizer.nextToken();
if (sendCommand(COMMAND_TOP + ' ' + num + ' ' + number)) {
messageInput = new POP3MessageInputStream(in);
return messageInput;
} else {
throw new POP3NegativeResponseException(getStatusString());
}
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param pos ꆼꆼꆼꆼꆼꆼꆼ.ꆼꆼꆼꆼꆼꆼꆼꆼꆼ 0.
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ true.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized boolean delete(int pos) throws POP3NegativeResponseException, IOException {
if (messageList == null) {
initList();
}
StringTokenizer tokenizer = new StringTokenizer(getListItem(pos));
String num = tokenizer.nextToken();
return sendCommand(COMMAND_DELE + " " + num);
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼUID(unique-id)ꆼꆼꆼ.
*
* @param pos ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @return UID.
* @exception jp.gr.java_conf.roadster.net.pop.POP3Exception POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized String getUID(int pos) throws POP3Exception, IOException {
if (uidList == null) {
initUIDList();
}
String item = uidList[pos];
StringTokenizer st = new StringTokenizer(item);
String num = st.nextToken();
String uid = st.nextToken();
return uid;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*
* @param timeout ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
public synchronized void setTimeout(int timeout) {
this.timeout = timeout;
if (socket != null) {
try {
socket.setSoTimeout(timeout);
} catch (SocketException se) {
se.printStackTrace();
}
}
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
public synchronized int getTimeout() {
return timeout;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*
* @param command ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
public synchronized void setPreConnectCommand(String command) {
this.preConnectCommand = command;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼnullꆼ
*/
public String getPreConnectCommand() {
return preConnectCommand;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* CRLF.CRLFꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* CRLF..CRLF ꆼ CRLF.CRLFꆼꆼꆼꆼꆼ.
*/
protected class POP3MessageInputStream extends InputStream {
/**
* ꆼꆼꆼꆼꆼꆼꆼ.
*/
private final int PRE_READ_LENGTH = 4;
private byte tmpbuff[] = new byte[PRE_READ_LENGTH];
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼPushbackInputStream ꆼꆼꆼꆼꆼ.
*/
protected PushbackInputStream pin;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
protected boolean finalByte = false;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
*/
protected boolean eof = false;
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼInputStreamꆼꆼꆼꆼꆼ.
* @param in ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public POP3MessageInputStream(InputStream in) {
this.pin = new PushbackInputStream(in, PRE_READ_LENGTH * 2);
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* RFC1939ꆼꆼꆼꆼꆼCRLF.CRLF ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
* ꆼꆼꆼCRLF.. ꆼꆼ CRLF. ꆼꆼꆼꆼꆼꆼ.
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ .CRLF ꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ -1.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized int read() throws IOException {
int ret;
if (eof == true) {
return -1; // ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ -1 ꆼꆼꆼ.
} else {
ret = pin.read();
if (ret == -1 || finalByte == true) {
eof = true;
return ret;
}
}
byte b = (byte) ret;
if (b == CR) {
// CR ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
//
// ꆼꆼꆼꆼꆼꆼꆼꆼ
// LF.CRLF
// ꆼꆼꆼꆼꆼꆼꆼfinalByte ꆼ true ꆼꆼꆼꆼꆼꆼLFꆼ unread() ꆼꆼ.
// (PushbackInputStream#unread(-1) ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
// -1 ꆼ unread() ꆼꆼꆼꆼ.)
//
// ꆼꆼꆼꆼꆼꆼꆼꆼ
// LF..
// ꆼꆼꆼꆼꆼꆼꆼꆼCRLF.. -> CRLF. ꆼꆼꆼꆼꆼꆼꆼꆼ
// LF ꆼ . ꆼ unread() ꆼꆼ.
//
// ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
// ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ unread() ꆼꆼ.
for (int i = 0; i < tmpbuff.length; ++i) {
int c = pin.read();
if (c == -1) {
throw new EOFException();
}
tmpbuff[i] = (byte) c;
}
boolean needsUnread = true;
if (tmpbuff[0] == LF && tmpbuff[1] == 46) {
if (tmpbuff[2] == CR && tmpbuff[3] == LF) { // LF.CRLF
finalByte = true;
pin.unread(LF);
needsUnread = false;
// ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
// { LF, -1 }
// ꆼꆼꆼ.
} else if (tmpbuff[2] == 46) { // LF ..
pin.unread(tmpbuff[3]); // ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ unread() .
pin.unread(46);
pin.unread(LF);
needsUnread = false;
// ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
// { LF, '.', tmpbuff[3], ... }
// ꆼꆼꆼ.
}
}
if (needsUnread == true) {
pin.unread(tmpbuff, 0, tmpbuff.length); // ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
}
}
return ret;
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼ close() ꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public /* synchronized */ void close() throws IOException {
int i;
while ((i = read()) != -1) {
// ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
}
messageInput = null; // ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @return ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.io.IOException IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public synchronized int available() throws IOException {
return pin.available();
}
}
/**
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼPOPꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*
* @param args ꆼꆼꆼꆼꆼPOPꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
* @exception java.lang.Exception ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
*/
public static void main(String args[]) throws Exception {
POP3Client pop = new POP3Client();
pop.setDebug(true);
pop.setHost(args[0]);
pop.setUser(args[1]);
pop.setPassword(args[2]);
if (args.length >= 4 && "APOP".equals(args[3])) {
pop.setAuthorizationMode(POP3Client.APOP_AUTHORIZATION);
}
// pop.setPreConnectCommand("ssh -C -f msingh@popserver -L 11110:popserver:110 sleep 5");
// pop.setPreConnectCommand("rundll32 rnaui.dll,RnaDial ꆼꆼꆼꆼꆼ");
pop.connect();
int count = pop.getMessageCount();
System.out.println("Message count = " + count);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < count; ++i) {
int messageSize = pop.getMessageSize(i);
System.out.println("Message size = " + messageSize + " octet.");
System.out.println("Message UID = " + pop.getUID(i) + ".");
InputStream in = pop.retrieve(i);
int c;
int bytesRead = 0;
while ((c = in.read()) != -1) {
System.out.print((char) c);
bytesRead++;
}
if (bytesRead == messageSize) {
System.out.println("bytesRead == messageSize");
} else {
System.out.println("bytesRead != messageSize");
System.out.println("\tbytesRead = " + bytesRead);
System.out.println("\tmessageSize = " + messageSize);
}
System.out.flush();
System.err.print("Enter TOP command line number > ");
String line = br.readLine();
in = pop.top(i, Integer.parseInt(line));
while ((c = in.read()) != -1) {
System.out.print((char) c);
}
System.err.print("Delete this message ? (y/N) >");
System.err.flush();
line = br.readLine();
if ("y".equals(line)) {
pop.delete(i);
}
}
pop.disconnect();
}
public boolean isSsl() {
return ssl;
}
public void setSsl(boolean ssl) {
this.ssl = ssl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -