📄 smtpserverthread.java
字号:
package com.cwq.batchmail.mail;
/*
* Copyright (c) 1998 Computer Mutter All Rights Reserved.
*/
import java.io.*;
import java.net.*;
import java.util.*;
import com.cwq.batchmail.DetailPacket;
import com.cwq.batchmail.log.Logger;
import com.cwq.batchmail.util.NSLookup;
/**
* Smtp3Connection Every connection to the smtp server is hidden by an
* SmtpConnection. The server create for every request an Thread and starts an
* Smtp3Connection class.
*
* (c) 1998 Computer Mutter computer@mutter.com
*/
public class SmtpServerThread extends Thread {
private Socket pClient;
private BufferedReader pIn;
private PrintWriter pOut;
private String pDomain;
private String pFrom;
private Vector pVector;
private NSLookup nsLookup;
private Logger logger = null;
public Logger getLogger() {
return logger;
}
public void setLogger(Logger logger) {
this.logger = logger;
}
/**
* MailConnection constructor comment.
*/
public SmtpServerThread(String domain, Socket s, NSLookup nsLookup) {
super();
setVector(new Vector());
setDomain(domain);
this.nsLookup = nsLookup;
setSocket(s);
try {
setInputStream(new BufferedReader(new InputStreamReader(getSocket()
.getInputStream())));
setOutputStream(new PrintWriter(new OutputStreamWriter(getSocket()
.getOutputStream())));
} catch (Exception exp) {
handleException(exp);
try {
getSocket().close();
} catch (Exception exp2) {
return;
}
}
// System.out.println("make connection to " + getSocket());
}
/**
* This method was created by a SmartGuide.
*
* @return boolean
* @param adr
* java.lang.String
*/
public void cmdDATA() {
println("354 send the mail data, end with .");
String input;
StringBuffer msg = new StringBuffer();
// msg.setLength(1024*1000);
try {
for (;;) {
input = getInputStream().readLine();
if (input.equals(".") == true) {
writeMsg(msg.toString());
println("250 OK");
return;
}
msg.append(input + "\n");
// System.out.println("readLine: "+input);
}
} catch (Exception exp) {
handleException(exp);
}
return;
}
public void run() {
println("220 Java SMTP Server MailSrv ready.");
//System.out.println("-------segseg---ffffffffffffffffffffff");
for (;;) {
String input, command;
StringTokenizer tokens;
// System.out.println("read cmd from " + getSocket() );
try {
input = getInputStream().readLine();
if (input == null) {
break;
}
tokens = new StringTokenizer(input, " ;");
try {
command = tokens.nextToken();
command = command.toUpperCase();
} catch (Exception exp) {
continue;
}
if (command.compareTo("DATA") == 0) {
cmdDATA();
continue;
}
if (command.compareTo("RCPT") == 0) {
int idx = input.lastIndexOf('<');
String rcpt = input.substring(idx).replaceAll("<", "").replaceAll(">", "");
getVector().addElement(rcpt);
println("250 OK " + rcpt);
continue;
}
if (command.compareTo("MAIL") == 0) {
int idx = input.lastIndexOf('<');
String from = input.substring(idx).replaceAll("<", "").replaceAll(">", "");
setFrom(from);
println("250 OK " + getFrom());
continue;
}
if (command.compareTo("HELO") == 0) {
getVector().removeAllElements();
println("250 MailSrv");
continue;
}
if (command.compareTo("EHLO") == 0) {
getVector().removeAllElements();
println("250 MailSrv");
continue;
}
if (command.compareTo("RSET") == 0) {
getVector().removeAllElements();
println("250 MailSrv");
continue;
}
if (command.compareTo("AUTH") == 0) {
getVector().removeAllElements();
println("250 MailSrv");
continue;
}
if (command.compareTo("QUIT") == 0) {
println("221 Service closing transmission channel");
break;
}
println("-Err unknown command.");
//System.out.println("Unknown command: " + command);
} catch (Exception exp) {
//System.out.println(getSocket() + ": " + exp.toString());
println(exp.toString());
break;
}
}
try {
//System.out.println("ending serverThread: " + getSocket().hashCode());
getSocket().close();
} catch (Exception exp) {
handleException(exp);
}
}
// 这里收到信后,链接到每个接收者的邮件服务器,并发送邮件
// nslookup -qt=mx 163.com
public void writeMsg(String msg) {
try {
Iterator<String> rcpts = (Iterator<String>) getVector().iterator();
SmtpConnection smtpConn = null;
String smtpMXRecord = null;
for ( ; rcpts.hasNext(); ) {
String rcpt = rcpts.next();
//System.out.println(rcpt);
StringTokenizer tok = new StringTokenizer(rcpt, "<@>");
String email_f = tok.nextToken(); // email前部分
String email_e = tok.nextToken(); // email后部分
///*
try {
smtpMXRecord = this.nsLookup.getMXRecord(email_e);
smtpConn = new SmtpConnection(smtpMXRecord, 25);
smtpConn.debugname = "s2";
//if(logger != null) logger.info("MXRecord: " + smtpMXRecord);
//System.out.println("MXRecord: " + smtpMXRecord);
int state = smtpConn.open(email_f + "@" + email_e, "", false);
if( state == SmtpConnection.STATE_AUTH_SUCC) {
state = smtpConn.sendMessage(new Message(
getFrom(),
email_f + "@" + email_e,
DetailPacket.mailContentType,
DetailPacket.mailSubject,
DetailPacket.mailBody,
null
));
if( state != SmtpConnection.STATE_SEND_OK) {
throw new IOException("Send email fail .");
}
}
else {
throw new IOException("Connection to " + smtpMXRecord + " fail .");
}
smtpConn.finalize();
smtpConn = null;
//System.out.println("send end.");
} catch (IOException ex) {
println(ex.toString());
if(logger != null) logger.info(ex.getMessage());
}
//*/
}
} catch (Exception exp) {
if(logger != null) logger.info(exp.getMessage());
}
}
public void setDomain(String domain) {
pDomain = domain;
}
public void setFrom(String from) {
pFrom = from;
}
public void setInputStream(BufferedReader in) {
pIn = in;
}
public void setOutputStream(PrintWriter out) {
pOut = out;
}
public void setSocket(Socket s) {
pClient = s;
}
public void setVector(Vector v) {
pVector = v;
}
public String getDomain() {
return pDomain.toLowerCase();
}
public String getFrom() {
return pFrom;
}
public BufferedReader getInputStream() {
return pIn;
}
public PrintWriter getOutputStream() {
return pOut;
}
public Socket getSocket() {
return pClient;
}
public Vector getVector() {
return pVector;
}
private void handleException(Throwable exp) {
exp.printStackTrace();
}
/**
* This method was created in VisualAge.
*
* @param str
* java.lang.String
*/
private void println(String str) {
PrintWriter p = getOutputStream();
p.println(str); // include '\r'
p.flush();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -