📄 pop3_outlooklogin.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 + -