⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pop3service.java

📁 Java 邮件服务器 解析SMTP和POP3传输协议
💻 JAVA
字号:
package com.softeem.myMail.pop3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date;
import java.util.Properties;

public class POP3Service implements Runnable {

	/**
	 * @param args
	 */
	private String user;

	private Socket socket;

	private BufferedReader br;

	private BufferedWriter bw;

	private Properties prop = new Properties();

	private File[] userMailbox;

	private InputStream in;

	private BufferedReader inFile;

	private File f;

	private int[] delNum;

	private int allNub;

	public POP3Service(Socket socket) {
		super();
		this.socket = socket;
	}

	public void init() {
		// 解析属性文件得到对应的值
		try {
			in = new FileInputStream(new File("config.properties"));
			prop.load(in);
			in.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void run() {
		try {
			init();
			br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			bw = new BufferedWriter(new OutputStreamWriter(socket
					.getOutputStream()));
			sendWelcomeMessage();
			while (prastCommand(br.readLine())) {

			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				inFile.close();
				in.close();
				bw.close();
				br.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	// USER 用户名
	// PASS 密码
	// STAT 状态
	// LIST 列表
	// RETR
	// DELE 删除
	// QUIT 退出
	private boolean prastCommand(String command) {
		boolean flag = true;
		String argument = null;
		int spaceIndex = command.indexOf(" ");
		if (spaceIndex > 0) {
			argument = command.substring(spaceIndex + 1);
			command = command.substring(0, spaceIndex);
		}
		if (command.equalsIgnoreCase("USER")) {
			doUSER(argument);
		} else if (command.equalsIgnoreCase("PASS")) {
			doPASS(argument);
		} else if (command.equalsIgnoreCase("STAT")) {
			doSTAT(argument);
		} else if (command.equalsIgnoreCase("LIST")) {
			doLIST(argument);
		} else if (command.equalsIgnoreCase("RETR")) {
			doRETR(argument);
		} else if (command.equalsIgnoreCase("DELE")) {
			doDELE(argument);
		} else if (command.equalsIgnoreCase("QUIT")) {
			doQUIT(argument);
			return flag = false;
		} else {
			writerMessage("-ERR Syntax error in MAIL command");
		}
		return flag;
	}

	private void doUSER(String argument) {

		String responseString = null;
		if ((argument != null) && (prop.getProperty(argument) != null)) {
			user = argument;
			responseString = "+OK RIGHT_USER";
		} else {
			responseString = "-ERR ERR_USER";
		}
		writerMessage(responseString);
	}

	private void doPASS(String argument) {
		if ((argument != null)
				&& (prop.getProperty(user).equalsIgnoreCase(argument))) {
			// responseString.append("+OK Welcome ").append(user);
			writerMessage("+OK Welcome " + user);
		} else {
			// responseString.append("-ERR ERR_PASS");}
			// writerMessage(responseString.toString());
			writerMessage("-ERR ERR_PASS");
		}
	}

	private void doSTAT(String argument) {
		f = new File("E:\\mail\\" + user + "\\receivebox");
		userMailbox = f.listFiles();
		long size = 0;
		int count = 0;
		for (int i = 0; i < userMailbox.length; i++) {
			if (userMailbox[i].isFile())
				count++;
			size = size + userMailbox[i].length();
		}
		StringBuffer responseBuffer = new StringBuffer(32).append("+OK")
				.append(" ").append(count).append(" ").append(size);
		writerMessage(responseBuffer.toString());
		delNum = new int[count];
	}

	private void doLIST(String argument) {
		long size = 0;
		for (int i = 0; i < userMailbox.length; i++) {
			if (i == 0) {
				writerMessage("+OK");
			}
			if (userMailbox[i].isFile()) {
				size = userMailbox[i].length();
				writerMessage(i + 1 + " " + size);
			}
			if (i == userMailbox.length - 1) {
				writerMessage(".");
			}
		}
	}

	private void doRETR(String argument) {
		int num = new Integer(argument);
		if (argument == null) {
			writerMessage("-ERR COMMAND ERR");
		} else {
			if (num > userMailbox.length) {
				writerMessage("-ERR COMMAND ERR");
			} else {
				for (int i = 0; i < userMailbox.length; i++) {
					if (i == 0) {
						writerMessage("+OK");
					}
					if (num == (i + 1)) {
						doFile(userMailbox[i]);
					}
					if (i == userMailbox.length - 1) {
						writerMessage(".");
					}
				}

			}
		}

	}

	private void doDELE(String argument) {
		int num = new Integer(argument);
		if (argument == null) {
			writerMessage("-ERR COMMAND ERR");
		} else {
			if (num > userMailbox.length) {
				writerMessage("-ERR COMMAND ERR");
			} else {
				for (int i = 0; i < userMailbox.length; i++) {
					if (i == 0) {
						writerMessage("+OK");
					}
					if (num == (i + 1)) {
						delNum[allNub] = i;
						allNub++;
					}
				}

			}
		}

	}

	private void doQUIT(String argument) {
		for (int i = 0; i < delNum.length; i++) {
			userMailbox[delNum[i]].delete();
		}
		StringBuffer responseBuff = new StringBuffer();
		responseBuff.append("+OK java23 coremail");
		writerMessage(responseBuff.toString());
	}

	private void writerMessage(String message) {
		try {
			bw.write(message);
			bw.newLine();
			bw.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void sendWelcomeMessage() {
		StringBuffer WelcomeMessage = new StringBuffer();
		WelcomeMessage.append("+OK Welcome to java23 Mail Pop3 Server ")
				.append(" <").append(new Date()).append(" > ");
		writerMessage(WelcomeMessage.toString());
	}

	private void doFile(File file) {
		try {
			String buff = null;
			inFile = new BufferedReader(new InputStreamReader(
					new FileInputStream(file)));
			while ((buff = inFile.readLine()) != null) {
				writerMessage(buff);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

⌨️ 快捷键说明

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