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

📄 pop3_outlooklogin.java

📁 用java实现的邮件服务器(Server 文件夹 用户名 文件夹 Send receive 文件夹 文件 时间.txt. 日志文件
💻 JAVA
字号:
package Server.POP3;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import Server.Server;
import Server.SMTP.SMTP_Final;


public class POP3_OutLookLogIn extends Server {
	private Socket socket;
	// private String username = null;
	private Map<String, String> map = new HashMap<String, String>();
	private String[] userRecivePath = new String[1024];
	private Map<String, String> mailMap = new HashMap<String, String>();
	private int numberOfMail = 0;
	private long fileLength = 0;

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

	{
		setHashMap();
	}

	// 初始化Map(用来用户信息表),并让其在随普通初始化块一起初始化,以方便后面的读取
	public void setHashMap() {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(SMTP_Final.userInfo);
			Properties prop = new Properties();
			prop.load(fis);
			Enumeration enumer = prop.propertyNames();
			while (enumer.hasMoreElements()) {
				String username = (String) enumer.nextElement();
				String password = prop.getProperty(username);
				map.put(username, password);
			}
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}
	}

	// 检查用户名是否有效
	public boolean checkUsernameOfvalid(String username) {
		boolean flag = false;
		if (map.containsKey(username)) {
			flag = true;
		}
		return flag;
	}

	// 检查用户名和密码是否合法有效
	public boolean checkUsernameAndPasswordOfvalid(String username,
			String password) {
		boolean flag = false;
		if (map.containsKey(username)) {
			if (map.get(username).equals(password)) {
				flag = true;
			}
		}
		return flag;
	}

	// 遍历收件箱里面的文件,并将其里面信息的条数发出去
	public void numberOfFindMail(PrintWriter pw, String username) {
		String dirUser = POP3_Final.allUserPath + "/" + username + "/"
				+ "ReceiveBox";
		File[] files = new File(dirUser).listFiles();

		for (File f : files) {
			fileLength += f.length();
			userRecivePath[numberOfMail++] = f.getAbsolutePath();
		}
		pw.println("+OK " + numberOfMail + " messages" + "[" + fileLength
				+ "]bytes");

	}

	// 遍历收件箱里面的文件,并将其大小等属性发送出去
	public void howMuchOfFindMail(PrintWriter pw, String username) {
		String dirUser = POP3_Final.allUserPath + "/" + username + "/"
				+ "ReceiveBox";
		File[] files = new File(dirUser).listFiles();
		numberOfMail = 0;
		fileLength = 0;
		for (File f : files) {
			fileLength += f.length();
			userRecivePath[numberOfMail++] = f.getAbsolutePath();
		}
		pw.println("+OK " + numberOfMail + " " + fileLength);
		System.out.println("+OK " + numberOfMail + " " + fileLength);
		pw.flush();
	}

	// 构建List表
	public void ListOfFindMail(PrintWriter pw, String username) {
		String dirUser = POP3_Final.allUserPath + "/" + username + "/"
				+ "ReceiveBox";
		File[] files = new File(dirUser).listFiles();
		pw.println("+OK " + numberOfMail + " " + fileLength);
		long fileLength = 0;
		numberOfMail = 0;
		for (File f : files) {
			fileLength = f.length();
			userRecivePath[numberOfMail++] = f.getAbsolutePath();
			pw.println(numberOfMail + " " + fileLength);
			mailMap.put(String.valueOf(numberOfMail), String
					.valueOf(fileLength));
			System.out.println(numberOfMail + " " + fileLength);
		}
		pw.println(".");
		pw.flush();
	}

	// 用户对文件的操作
	public void userMailBox(PrintWriter pw, String username) {
		String dirUser = POP3_Final.allUserPath + "/" + username + "/"
				+ "ReceiveBox";
		File[] files = new File(dirUser).listFiles();

		for (File f : files) {
			fileLength = f.length();
			userRecivePath[numberOfMail++] = f.getAbsolutePath();
			pw.println("+ok");
		}
	}

	public void sendMailToOutLook(PrintWriter pw) {
		FileInputStream fis = null;
		String str = null;
		BufferedReader brfile = new BufferedReader(new InputStreamReader(fis));
		try {
			for (String s : userRecivePath) {
				fis = new FileInputStream(s);
				while ((str = brfile.readLine()) != null) {
					pw.println(str);
					pw.flush();
				}
				pw.println(".");
				pw.flush();
			}
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}
	}

	// 发送邮件给outlooksendOutlook
	public void sendOutLook(PrintWriter pw, String numberOfMails) {
		BufferedReader br = null;
		pw.println("+OK " + mailMap.get(numberOfMails) + " octets");
		String str = null;
		int i = Integer.parseInt(numberOfMails);
		System.out.println(i);
		try {
			System.out.println(userRecivePath[i - 1]);
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					userRecivePath[i - 1])));
			while ((str = br.readLine()) != null) {
				pw.println(str);
			}
			pw.println(".");
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		} finally {
			try {
				if (br != null) {
					br.close();
				}
			} catch (IOException e) {

				e.printStackTrace();
			}
		}

	}

	// 删除已发送的邮件
	public void deletMailOfOutLookReceive(String username) {
		String dirUser = POP3_Final.allUserPath + "/" + username + "/"
				+ "ReceiveBox";
		File[] files = new File(dirUser).listFiles();

		for (File f : files) {
			f.delete();
		}
	}

	public void outLookLogin() {
		BufferedReader br=null;
		PrintWriter pw=null;
		try {
			br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			pw = new PrintWriter(new OutputStreamWriter(socket
					.getOutputStream()), true);
			String str = null;
			String username = null;
			String password = null;
			// 发送一条消息给OutLook告述它POP3服务器已经准备好了
			pw.println(POP3_Final.welcome);
			pw.println(POP3_Final.ok);
			// 服务器从OutLook读一条返回的信息
			while ((str = br.readLine().trim()) != null) {
				// 如果是输入的用户名和密码则判断用户名和密码是否存在有效
				System.out.println(str);
				if (str.startsWith(POP3_Final.username)) {

					username = str.split(" ")[1].trim();
					if (checkUsernameOfvalid(username)) {
						
						pw.println(POP3_Final.ok);
					} else {
						pw.println(POP3_Final.err);
					}

				} else if (str.startsWith(POP3_Final.password)) {
					password = str.split(" ")[1];
					if (checkUsernameAndPasswordOfvalid(username, password)) {
						// 打印含有邮件的个数及这些邮件总的大小
						numberOfFindMail(pw, username);
					} else {
						pw.println(POP3_Final.err);
					}

					// 确认有效后继续
				} else if (str.startsWith(POP3_Final.start)) {
					// 打印含有邮件的个数及这些邮件总的大小
					howMuchOfFindMail(pw, username);
				} else if (str.startsWith(POP3_Final.list)) {
					// 打印文件列表
					ListOfFindMail(pw, username);
				} else if (str.startsWith(POP3_Final.retr)) {
					// 将每一封邮件发送文件给OutLook
					String numberOfMail = str.split(" ")[1];
					sendOutLook(pw, numberOfMail);
				} else if (str.startsWith(POP3_Final.delet)) {
					// 标记文件删除的(现在是直接删除,还要改进一下,最好放到已删除,并且写一下日志文件)
					pw.println(POP3_Final.deletSucess);
				} else if (str.startsWith(POP3_Final.quit)) {
					deletMailOfOutLookReceive(username);
					pw.println(POP3_Final.receiveOver);
					break;
				} else {
					pw.println(POP3_Final.ok);
				}
			}
		} catch (IOException e) {

			e.printStackTrace();
		} finally {
			try {
				if (socket != null) {
					socket.close();
				}
			} catch (IOException e) {

				e.printStackTrace();
			}
		}
	}

	public void run() {
		outLookLogin();
	}

}

⌨️ 快捷键说明

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