您的位置:首页 > 编程语言 > Java开发

用java实现的邮件系统一(SMTP 服务器,单发,和群发)

2010-08-31 22:09 591 查看
package com.wepull.smtp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
* @author liugang
*
*/
public class SmtpSesssion extends Thread {

/**
* 单个会话
*/
private Socket s;

/**
*读取客戸端信息
*/
private BufferedReader br;

/**
* 服务器输出信息到客服端
*/
private PrintStream ps;

/**
*服务端接收邮件内容临时存储路径
*/
private String fileServerPath="D://server//mail//temp" ;
private String fileServerPaths ="D://server//mail";

private Timer t =new Timer();

/**
* 用于存储收件人地址的集合
*/
private List<String> tolistaddress =new ArrayList<String>();

/**
* @param s初始化一个会话socket
*/
public SmtpSesssion(Socket s) {
this.s = s;

try {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File file=new File(fileServerPath);
if(!file.exists()){
file.mkdirs();
}
}

/*
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*
* 处理与客服端的信息,客户端发送不同的命令,服务器就做相应的处理
*/

public void run() {
t.schedule(new TimerTask(){

public void run() {
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}, 300000);
ps.println("220 Smtp.chunhua.com server start");
String line = "";

try {
while(!s.isClosed()&&(line = br.readLine())!=null){
System.out.println(s.isClosed());

System.out.println("客服端发送过来的信息" + line);
/**
* 处理客服端发送命令的操作
* */
if(line!=null){
doaction(line);
}

}

} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("socket 关闭");
}finally{

try {
if(!s.isClosed()){
s.close();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

/**
* @param line
* 处理客服端发送命令的操作
*/
private void doaction(String line) {

String msg = line.substring(0, 4);

if ("helo".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送helo命令的操作
* */
dohelo();
} else if ("ehlo".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送ehlo命令的操作
* */
doehlo();

} else if("auth".equalsIgnoreCase(msg)){

ps.println("334 VXNlcm5hbWU6");
doauth();

}else if ("mail".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送mail命令的操作
* */
domail();
} else if ("rcpt".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送rcpt命令的操作
* */
dorcpt(line);
} else if ("data".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送data命令的操作
* */
dodata();
} else if ("rest".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送rest命令的操作
* */
dorest();
} else if ("quit".equalsIgnoreCase(msg)) {
/**
* 处理客服端发送quit命令的操作
* */
doquit();
}

}

/**
* 处理客服端发送helo(不需要验证)命令的操作的方法
*/
private void dohelo() {
System.out.println("250");
ps.println("250");
}

/**
* 处理客服端发送ehlo(要求用户名验证,使用base64编码)命令的操作的方法
*/
private void doehlo() {
ps.println("250-Winmail Mail Server");
ps.println("250-PIPELINING");
ps.println("250-AUTH=LOGIN PLAIN");
ps.println("250-AUTH LOGIN PLAIN");
ps.println("250-SIZE 20480000");
ps.println("250 8BITMIME");

}

private void doauth(){

String str="";
String msgs="";
try {
while(true){
str = br.readLine();
System.out.println("客服端发送过来的信息" + str);
msgs=str.substring(0,4);
if("bGc=".equalsIgnoreCase(str)){

ps.println("334 UGFzc3dvcmQ6");

}else if("MTIz".equalsIgnoreCase(str)){

ps.println("235 auth successfully");
break;
}
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* 处理客服端发送mail(获得发件人地址信息)命令的操作的方法
*/
private void domail() {

ps.println("250 ok");

}

/**
* 处理客服端发送rcpt(获得收件人地址信息)命令的操作的方法
*/
private void dorcpt(String line) {
String toaddress=line.split("<")[1].split(">")[0];
tolistaddress.add(toaddress);
ps.println("250 ok");
}

/**
* 处理客服端发送data(邮件内容)命令的操作的方法
*/
private void dodata() {
ps.println("354 go ahead");
dowritefile();
}

/**
* 将邮件内容写到服务器的临时文件中
*/
private void dowritefile() {
PrintStream Fileps=null;
File temp = new File(fileServerPath+"//"+"temp.txt");
System.out.println(temp.getAbsolutePath());
try {
Fileps = new PrintStream(new FileOutputStream(temp));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String mailcontent="";

try {
while(true){
if(!s.isClosed()){
mailcontent= br.readLine();
}
Fileps.println(mailcontent);

if(".".equalsIgnoreCase(mailcontent)){
ps.println("250 ok message accepted for delivery");

break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
Fileps.close();
}

for(String str:tolistaddress){

if("chunhua.com".equalsIgnoreCase(str.split("@")[1])){
System.out.println("come");
str=fileServerPaths+"+"//revd]//"+str.split("@")[0]+"//revd";
System.out.println(str);
CopeDeleteFile.copy1(new File(fileServerPath), new File(str));
}else{

doWork(str);

}

}
}

private void doWork(String str) {
try {
String ip="smtp."+str.split("@")[1];
System.out.println(ip);
Socket s = new Socket("192.168.1.161",25);
new Transmit(s,str).start();

} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* 处理客服端发送rest(重置)命令的操作的方法
*/
private void dorest() {
ps.println("250 ");
}

/**
* 处理客服端发送quit(关闭)命令的操作的方法
*/
private void doquit() {
ps.println("221 Winmail Mail Server");
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: