📄 smtp_outlooklogin.java
字号:
package Server.SMTP;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
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;
public class SMTP_OutLookLogIn extends Server {
private Socket socket;
private Map<String, String> mapAddress = new HashMap<String, String>();
private int num=6;
public SMTP_OutLookLogIn(Socket socket) {
super();
this.socket = socket;
}
{
setHashMap();
}
// 初始化本服务器所支持的转发服务器的IP列表
public void setHashMap() {
FileInputStream fis = null;
try {
fis = new FileInputStream(SMTP_Final.transmitList);
Properties prop = new Properties();
prop.load(fis);
Enumeration enumer = prop.propertyNames();
while (enumer.hasMoreElements()) {
String num = (String) enumer.nextElement();
String address = prop.getProperty(num);
mapAddress.put(num, address);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 判断是否需要转发,返回true表示不需要转发
public boolean transmit(String address) {
boolean flag = false;
if (mapAddress.get("1").equals(address))
flag = true;
else if(mapAddress.get("4").equals(address))
flag=true;
else if(mapAddress.get("5").equals(address))
flag=true;
return flag;
}
//判断能转发的服务器是否存在,返回true表示存在
public boolean transmitAddressExist(String address) {
boolean flag = false;
if (mapAddress.containsValue(address))
flag = true;
return flag;
}
//将不存在地址信息加入到Map表中
public void addAddress(String address){
mapAddress.put(new Integer(num++).toString(),address);
}
public void readInfoFromOutLookClient() {
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, username = null, nameOfSendTo = null, sendMailFrom = null, sendMailTo = null;
// 设置下面两个String类型的变量是为了获取发件人和收件人是否在同一台服务器上,若不是则转入相应的处理过程(还未实现date:080128)
String sendFromDomainName = null, sendToDOmainName = null;
// System.out.println(socket.getRemoteSocketAddress());
pw.println("250");
// 实现邮件转发的功能
while ((str = br.readLine()) != null) {
// System.out.println(str);
if (str.startsWith(SMTP_Final.reset)) {
pw.println("250");
continue;
} else if (str.startsWith(SMTP_Final.mailFrom)) {
// 提取发邮件的人的地址和用户名
pw.println("250");
sendMailFrom = str.split("<")[1].split(">")[0];
sendFromDomainName = str.split("<")[1].split(SMTP_Final.at)[1]
.split(">")[0];
username = str.split("<")[1].split(">")[0]
.split(SMTP_Final.at)[0];
} else if (str.startsWith(SMTP_Final.mailTo)) {
// 提取收邮件的人的地址
sendMailTo = str.split("<")[1].split(">")[0];
sendToDOmainName = str.split("<")[1].split(SMTP_Final.at)[1]
.split(">")[0];
nameOfSendTo = str.split("<")[1].split(">")[0]
.split(SMTP_Final.at)[0];
System.out.println(sendToDOmainName);
System.out.println(transmit(sendToDOmainName));
if(transmit(sendToDOmainName)){
System.out.println("不需要转发");
pw.println("250");
}else{
if(transmitAddressExist(sendToDOmainName)){
pw.println("250");
new SMTP_TransmitMailToAnotherServer(socket,sendToDOmainName).startTransmit();
}else{
pw.println("250");
addAddress(sendToDOmainName);
new SMTP_TransmitMailToAnotherServer(socket,sendToDOmainName).startTransmit();
}
}
} else if (str.startsWith(SMTP_Final.data)) {
// 开始读取邮件的内容,读取并将其保存,遇到“.”停止文件的读取
pw.println("354");
SMTP_CreateUserDir outLookSend = new SMTP_CreateUserDir(
username);
outLookSend.createUserDir();
// 将读取文件的内容写到自己发件箱和发送到的邮箱
SMTP_CreateUserDir outLookTo = new SMTP_CreateUserDir(
nameOfSendTo);
outLookTo.createUserDir();
String filePathOfSend = outLookSend.getUserSendBox() + "/"
+ String.valueOf(System.currentTimeMillis())
+ username + ".txt";
String filePathOfReceive = outLookTo.getUserReceiveBox()
+ "/" + String.valueOf(System.currentTimeMillis())
+ nameOfSendTo + ".txt";
FileOutputStream fosSend = new FileOutputStream(
filePathOfSend);
PrintWriter pwFileSend = new PrintWriter(
new OutputStreamWriter(fosSend));
FileOutputStream fosReceive = new FileOutputStream(
filePathOfReceive);
PrintWriter pwFileReceive = new PrintWriter(
new OutputStreamWriter(fosReceive));
// 写入日志文件
SMTP_LogForMailBox log = new SMTP_LogForMailBox(username,
sendMailTo);
log.makeLogFile();
while (!(str = br.readLine())
.equalsIgnoreCase(SMTP_Final.endData)) {
pwFileSend.println(str);
pwFileSend.flush();
pwFileReceive.println(str);
pwFileReceive.flush();
}
pwFileReceive.close();
pwFileSend.close();
pw.println("250");
} else if (str.startsWith(SMTP_Final.quit)) {
// 整个OutLookClient对话结束
pw.println("221");
break;
} else {
// 对其他想不到的情况的处理
pw.println("554");
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void run() {
readInfoFromOutLookClient();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -