用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();
}
}
}
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();
}
}
}
相关文章推荐
- 关于通过SMTP服务器群发邮件的实现——我的Web开发心得
- Java调用阿里SMTP服务器实现邮件发送
- Java实现通过smtp服务器向指定邮箱发送邮件
- 使用qq邮箱SMTP服务器来为你的网站实现用户注册的邮件回复功能
- phpmailer实现简单的邮件发送(以网易邮箱smtp服务器为例)
- 利用SMTP虚拟服务器实现不同邮件系统之间的通讯
- 再谈用java实现Smtp发送邮件之Socket编程
- 基于james3.0 的邮件系统(struts2.3.2 +spring3.0.1+jpa(hibernate3.6.5)实现)b/s模式--java邮件系统
- java实现smtp邮件功能
- Javax.mail实现单发和群发邮件
- JavaMail SMTP服务器发送邮件程序示例 java通过dns服务器解析ip地址
- java实现对服务器的自动巡检邮件通知
- php mailer类调用远程SMTP服务器发送邮件实现方法
- javaMail Java实现邮件发送,群发功能,java发送邮件
- 用java实现的邮件系统八(总结)
- thinkphp5+swoole实现异步邮件群发(SMTP方式)
- java实现发送邮件服务器,SMTP协议发送邮件
- Java实现基于SMTP发送邮件的工具类
- 基于james3.0 的邮件系统(struts2.3.2 +spring3.0.1+jpa(hibernate3.6.5)实现)b/s模式--java邮件系统
- 使用java在本地服务器实现简单的邮件的发送与接受