import java.net.*;
import java.io.*;
import java.util.Vector;
/**
* Commands for the POP3 protocol are specified in <a href="
http://sunsite.auc.dk/RFC/rfc/rfc1939.html">RFC 1939</a>.
* Some of the basic commands used include:
* USER: user name
* PASS: password
* STAT: statistics
* LIST: list a Mail
* RETR: retrieve a Mail
* DELE: delete a mail
* QUIT: close Connection with Server
* @author joch
*/
public class POP {
private Socket socket;
private PrintStream writer;
private BufferedReader reader;
private String response;
private boolean deleteFromServer;
public POP(){
deleteFromServer = false;
}
public Vector getMail(String popServer, String user, String pass){
Vector messages = new Vector();
try{
createSocket(popServer, 110);
login(user, pass);
messages = getMessages();
exit();
}
catch(Exception e){
e.printStackTrace();
}
return messages;
}
private void createSocket(String server, int port) throws java.net.UnknownHostException, java.io.IOException{
System.out.println("create socket");
socket = new Socket(server,port);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintStream(new BufferedOutputStream(socket.getOutputStream(),2500),true);
response = read();
}
private void login(String user, String pass) throws java.io.IOException{
send("USER " + user);
if (!read().startsWith("+OK")) {
System.out.println("Wrong user name!!");
}
send("PASS " + pass);
if (!read().startsWith("+OK")) {
System.out.println("Wrong password!!");
}
}
private Vector getMessages() throws java.io.IOException, java.lang.NumberFormatException{
Vector v = new Vector();
send("STAT");
response = read();
if (!response.startsWith("+OK")) {
System.out.println("Error:" + response);
}
int i = response.lastIndexOf(' ');
String numberMessages = response.substring(4,i);
int n = Integer.parseInt(numberMessages);
System.out.println("You have " + n + " message(s) in your mailbox");
int numberBytes;
for (int msg=1; msg <= n; msg++) {
System.out.println("Retreaving message " + msg);
send("RETR " + msg);
response = read();
if (!response.startsWith("+OK")) {
System.out.println("Error: " + response);
}
//the response is probably: +OK XXXX octets follow
String temp = response.substring(0, response.lastIndexOf(' '));
i = temp.lastIndexOf(' ');
numberBytes = Integer.parseInt(response.substring(4,i));
Email email = new Email();
StringBuffer text = new StringBuffer();
boolean write = false;
response = reader.readLine();
while (response.compareTo(".") != 0) {
System.out.println(response);
if (response.compareTo("..") == 0){
System.out.println(".");
}
else{
if (write){
String lowerCaseLine = response.toLowerCase().trim();
if (!lowerCaseLine.startsWith("content-transfer") &&
!lowerCaseLine.startsWith("message-id") &&
!lowerCaseLine.startsWith("charset=") &&
!lowerCaseLine.startsWith("x-") &&
!lowerCaseLine.startsWith("importance:")){
//System.out.println("response: " + response);
text.append(response + "\n");
}
}
if (response.startsWith("Return-Path: <")){
email.setSender(response.substring(14,response.length()-1));
}
else if (response.startsWith("Subject: ")){
email.setSubject(response.substring(9));
}
else if (response.toLowerCase().startsWith("content-type:"))
if (response.toLowerCase().startsWith("content-type: text/plain"))
write = true;
else
write = false;
}
response = reader.readLine();
}
//replace odd characters in the text (performance...)
String parsedText1 = parseText(text.toString(), "=E5", "å");
String parsedText2 = parseText(parsedText1, "=E6", "æ");
String parsedText3 = parseText(parsedText2, "=F8", "ø");
String parsedText4 = parseText(parsedText3, "=D8", "Ø");
String parsedText = parseText(parsedText4, "=20", "\n");
email.setContent(parsedText);
v.addElement(email);
if (deleteFromServer) {
send("DELE " + msg);
read();
}
}
return v;
}
private void exit() throws java.io.IOException{
send("QUIT");
read();
socket.close();
}
private void send(String s){
//System.out.println("client: " + s);
writer.println(s);
}
private String read() throws java.io.IOException{
String s = reader.readLine();
//System.out.println("server: " + s);
return s;
}
private String parseText(String haystack, String needle, String newNeedle){
StringBuffer tmp = new StringBuffer("");
int pos = 0;
while (pos < haystack.length()) {
int needleIndex = haystack.indexOf(needle, pos);
if (needleIndex >= 0) {
//if the needle is found, add the text until needle
tmp.append(haystack.substring(pos, needleIndex));
//add the new needle
tmp.append(newNeedle);
//skip past the needle and search for the next one
pos = pos + (needleIndex - pos) + needle.length();
}
else {
//if the needle is not found, just add the rest of the text
tmp.append(haystack.substring(pos));
//move the pointer to the end of the string to stop the while loop
pos = haystack.length();
}
}
//return the temporary string, which we've added text to
return tmp.toString();
}
}
Der mangler lidt i parsingen af den hentede tekst... Altså det, der udføres af parseText() metoden. Men funktionaliteten er der.