1 package org.jent.checksmtp;
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.io.OutputStream;
10 * Socket accept proceed
12 import java.io.OutputStreamWriter;
13 import java.io.PrintWriter;
15 import java.net.Socket;
17 import java.util.ArrayList;
18 import java.util.ListIterator;
19 import java.util.regex.Pattern;
22 public class Processer implements Runnable {
23 private Socket client;
26 private final int RESULT_UNKNOWN = 0;
27 private final int RESULT_OK = 1;
28 private final int RESULT_NG = 2;
29 private int result = RESULT_UNKNOWN;
32 private final int R354StartInput = 354;
33 private final int R221ServiceClosing = 221;
34 private final int R451RequestedActionAbort = 451;
35 private final int R502CommandNotImplemented = 502;
38 private final String COMMAND_RCPT_TO = "RCPT TO:";
39 private final String COMMAND_DATA = "DATA";
40 private final String COMMAND_RESET = "RSET";
41 private final String COMMAND_TURN = "TURN";
43 //private final String COMMAND_NOOP = "NOOP";
44 //private final String COMAMND_QUIT = "QUIT";
45 public Processer(Socket client) {
50 InputStream serverInput;
51 OutputStream serverOutput;
52 InputStream clientInput;
53 OutputStream clientOutput;
55 BufferedReader serverReader;
56 PrintWriter serverWriter;
57 BufferedReader clientReader;
58 PrintWriter clientWriter;
61 //Connect to SMTP Server host
62 String servername = ApplicationProperties.getSmtpServerHost();
65 int serverport = ApplicationProperties.getSmtpServerPort();
67 //Connection to true SMTP server.
68 Socket server = new Socket(servername, serverport);
69 serverInput = server.getInputStream();
70 serverOutput = server.getOutputStream();
71 clientInput = client.getInputStream();
72 clientOutput = client.getOutputStream();
74 serverReader = new BufferedReader(new InputStreamReader(
75 server.getInputStream()));
76 serverWriter = new PrintWriter(new SmtpBufferedWriter(
77 new OutputStreamWriter(server.getOutputStream(),
78 "ISO-8859-1")), true);
79 clientReader = new BufferedReader(new InputStreamReader(
80 client.getInputStream()));
81 clientWriter = new PrintWriter(new SmtpBufferedWriter(
82 new OutputStreamWriter(client.getOutputStream(),
83 "ISO-8859-1")), true);
85 smtpStart(serverReader, clientWriter, clientReader, serverWriter);
87 //for SMTP Server connection test
88 //SocketProxy forServer = new SocketProxy(clientInput, serverOutput, 0);
89 //SocketProxy forClient = new SocketProxy(serverInput, clientOutput, 1);
90 //Thread forServerThread = new Thread(forServer);
91 //Thread forClientThread = new Thread(forClient);
92 //forServerThread.start();
93 ////Use this ThreadforClientThread.run();
96 } catch (IOException e) {
97 System.err.println("Execption occurred in Processer.");
102 private int getCode(String s) {
103 return Integer.parseInt(s.substring(0, 3));
106 private boolean isContinue(String s) {
107 if ('-' == s.charAt(3)) {
114 private boolean isRcptTo(String s) {
115 if (s.startsWith(COMMAND_RCPT_TO)) {
122 private boolean isData(String s) {
123 if (s.startsWith(COMMAND_DATA)) {
130 private boolean isTurn(String s) {
131 if (s.startsWith(COMMAND_TURN)) {
138 public void sayOK() {
143 public void sayNG() {
148 private synchronized void notifyResult() {
152 private void smtpStart(BufferedReader serverReader,
153 PrintWriter clientWriter, BufferedReader clientReader,
154 PrintWriter serverWriter) {
158 ArrayList toList = new ArrayList();
162 line = serverReader.readLine();
163 clientWriter.println(line);
164 System.out.println(line);
166 if (isContinue(line)) {
167 continue; //Server responce continue
171 if (R221ServiceClosing == getCode(line)) {
172 break; //end of session.
173 } else if (R354StartInput == getCode(line)) {
174 System.out.println("Send mail data.");
177 line = clientReader.readLine();
178 serverWriter.println(line);
180 if (line.equals(".")) {
181 break; //end of mail dara.
186 line = clientReader.readLine();
188 if (isRcptTo(line)) {
189 //stored To: address.
190 toList.add(formatToAddress(line));
191 } else if (isTurn(line)) {
192 System.err.println("'TURN' is unsupported command.");
193 clientWriter.println(R502CommandNotImplemented);
195 continue; //read next client request.
196 } else if (isData(line)) {
197 //Client want to send data. Check out toList.
198 ListIterator iterater = toList.listIterator();
200 while (iterater.hasNext()) {
201 System.out.println("ADDRESS CHECK:" + iterater.next());
205 new ToListDialog(this, toList);
207 while (result == RESULT_UNKNOWN) {
209 synchronized (this) {
212 } catch (InterruptedException e) {
213 System.err.println("Dialg wait interrupted");
218 if (result == RESULT_NG) {
219 System.out.println("CANCEL sending mail.");
220 serverWriter.println(COMMAND_RESET);
221 line = serverReader.readLine(); //Server MUST retrun "250 OK"
222 System.out.println(COMMAND_RESET + ":ANSER is " + line);
223 clientWriter.println(R451RequestedActionAbort);
225 continue; //I think Client QUIT or Retry.
229 break; // client read while(true);
232 serverWriter.println(line);
233 System.out.println(line);
236 } catch (IOException e) {
240 System.out.println("End of Session.");
243 private String formatToAddress(String line) {
244 System.out.println("FIND To: " + line);
246 //Splitting Mail address.
247 String str = line.substring(COMMAND_RCPT_TO.length() + 1);
248 Pattern pattern = Pattern.compile("[< >]+");
249 String[] address = pattern.split(str); // 0<1>2 3
252 for (i = 0; i < address.length; i++) {
253 if (!address[i].equals("")) {
259 str = address[i] + " " + LDAPSearch.search(address[i]);