📄 response.java
字号:
package SmtpServer;import java.net.Socket;import java.io.OutputStream;import java.io.InputStream;import java.io.IOException;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.File;import java.sql.*;import java.util.ArrayList; public class Response { OutputStream output; InputStream input; Request request; public static final int WELCOME = 101; //send welcome message public static final int ERROR = -1; private String curUser = new String(); public Response(OutputStream output, InputStream input) { this.output = output; this.input = input; } public void setRequest(Request rq) { request = rq; } public boolean sendEventMsg(int evt) throws IOException { try { switch(evt) { case WELCOME : sendMsg("220 My Simple Mail Transfer Service Ready"); break; case Request.HELO : sendMsg("250 MySMTP"); break; case Request.SEND_AND_MAIL: case Request.SEND: sendMsg("450 "); case Request.SEND_OR_MAIL: case Request.MAIL: sendMsg("250 OK "); break; case Request.RECIPIENT: if (getDomain(request.getForwardPath()).equals(SmtpServer.domain)) if (verify(request.getUser())) { curUser = request.getUser(); sendMsg("250 OK "); break; } sendMsg("550 No such user here."); break; case Request.VERIFY: if (verify(request.getString())) sendMsg("250 " + request.getString() + " <" + request.getString() + "@MySMTP>"); else sendMsg("550 String does not match anything."); break; case Request.DATA: if (!curUser.equals("")){ sendMsg("354 ok, send it; end with <CRLF>.<CRLF>"); getMail(); sendMsg("250 OK"); } else sendMsg("550 send to nobody"); break; case Request.RESET: sendMsg("250 OK"); break; case Request.EXPAND : sendMsg("550 Access Denied to You."); break; case Request.TURN : sendMsg("502 TURN command refused."); break; case Request.HELP : sendMsg("550 'HELP' command not supported."); break; case Request.NOOP: sendMsg("200 NOOP command successful."); break; case Request.QUIT: request.clear(); curUser = ""; sendMsg("221 MySTMP Service closing transmission channel"); break; default : sendMsg("500 '" + request.getRequestCmd() + "': command not understood."); break; } return true; } catch (Exception e) { System.out.println(e.toString() ); return false; } } //send response message public void sendMsg(String sendMsg) throws IOException { sendMsg += "\r\n"; try { output.write(sendMsg.getBytes(), 0, sendMsg.length()); System.out.println(sendMsg); } catch (Exception e) { System.out.println(e.toString() ); } } private String getDomain(String forwardPath) { //取得域 String domain = new String(); int index = forwardPath.indexOf('@'); if (index < 0) domain = ""; else domain = forwardPath.substring(index+1,forwardPath.length()); return domain; } private boolean verify(String user) { //检查是否存在这个用户 boolean userExist; Connection sqlCon; PreparedStatement sqlStmt; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); sqlCon = DriverManager.getConnection("jdbc:odbc:mailServer"); sqlStmt = sqlCon.prepareStatement("select * from userinfo where name=?"); sqlStmt.setString(1,user); ResultSet rs = sqlStmt.executeQuery(); if(rs.next()) userExist = true; else userExist = false; } catch (Exception e) { e.printStackTrace(); userExist = false; } return userExist; } private void getMail() { //读取mail内容并存入文件(mail内容以"\r\n.\r\n"结束) int BUFFER_SIZE = 1024; try { byte[] bytes = new byte[BUFFER_SIZE]; FileOutputStream fos = null; try { File file = new File(SmtpServer.rootDir + File.separator + request.getUser(), request.getReversePath()); for(int i=0;file.exists() ;i++) file = new File(SmtpServer.rootDir + File.separator + request.getUser(), request.getReversePath() + String.valueOf(i)); file.createNewFile(); fos = new FileOutputStream(file); int ch = input.read(bytes, 0, BUFFER_SIZE); while (ch!=-1) { if (isEnd(bytes,ch)) { if (ch >=5 ) fos.write(bytes, 0, ch-5); break; } fos.write(bytes, 0, ch); ch = input.read(bytes, 0, BUFFER_SIZE); } } catch (Exception e) { // thrown if cannot instantiate a File object System.out.println(e.toString() ); } finally { if (fos!=null) fos.close(); } }catch(Exception e) { System.out.println(e.toString() ); } } private boolean isEnd(byte[] bytes,int size) { //判断末尾是否为"\r\n.\r\n" if (size == 3) if (bytes[0] == ',' && bytes[1] == 13 && bytes[2] == 10) { System.out.println("end"); return true; } if (size>=5) if (bytes[size-5] == 13 && bytes[size-4] == 10 && bytes[size-3] == '.' && bytes[size-2] == 13 && bytes[size-1] == 10) { System.out.println("end"); return true; } return false; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -