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, ResultNotify {
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;
63 //Connect to SMTP Server host
64 String servername = ApplicationProperties.getSmtpServerHost();
67 int serverport = ApplicationProperties.getSmtpServerPort();
69 //Connection to true SMTP server.
70 server = new Socket(servername, serverport);
71 serverInput = server.getInputStream();
72 serverOutput = server.getOutputStream();
73 clientInput = client.getInputStream();
74 clientOutput = client.getOutputStream();
76 serverReader = new BufferedReader(new InputStreamReader(
77 server.getInputStream()));
78 serverWriter = new PrintWriter(new SmtpBufferedWriter(
79 new OutputStreamWriter(server.getOutputStream(),
80 "ISO-8859-1")), true);
81 clientReader = new BufferedReader(new InputStreamReader(
82 client.getInputStream()));
83 clientWriter = new PrintWriter(new SmtpBufferedWriter(
84 new OutputStreamWriter(client.getOutputStream(),
85 "ISO-8859-1")), true);
87 smtpStart(serverReader, clientWriter, clientReader, serverWriter);
89 //for SMTP Server connection test
90 //SocketProxy forServer = new SocketProxy(clientInput, serverOutput, 0);
91 //SocketProxy forClient = new SocketProxy(serverInput, clientOutput, 1);
92 //Thread forServerThread = new Thread(forServer);
93 //Thread forClientThread = new Thread(forClient);
94 //forServerThread.start();
95 ////Use this ThreadforClientThread.run();
100 } catch (IOException e) {
101 System.err.println("Execption occurred in Processer.");
102 //TODO: Display error Dialog.
105 //for failsafe Socket close.
106 if (server != null) {
109 } catch (IOException ioEx ) {
110 //IGNORE close Exception
113 if (client != null) {
116 } catch (IOException ioEx ) {
117 //IGNORE close Exception
120 //LDAP Connection close.
125 private int getCode(String s) {
126 return Integer.parseInt(s.substring(0, 3));
129 private boolean isContinue(String s) {
130 if ('-' == s.charAt(3)) {
137 private boolean isRcptTo(String s) {
138 if (s.startsWith(COMMAND_RCPT_TO)) {
145 private boolean isData(String s) {
146 if (s.startsWith(COMMAND_DATA)) {
153 private boolean isTurn(String s) {
154 if (s.startsWith(COMMAND_TURN)) {
161 public void sayOK() {
166 public void sayNG() {
171 private synchronized void notifyResult() {
175 private void smtpStart(BufferedReader serverReader,
176 PrintWriter clientWriter, BufferedReader clientReader,
177 PrintWriter serverWriter) {
181 ArrayList toList = new ArrayList();
185 line = serverReader.readLine();
186 clientWriter.println(line);
187 System.out.println(line);
189 if (isContinue(line)) {
190 continue; //Server responce continue
194 if (R221ServiceClosing == getCode(line)) {
195 break; //end of session.
196 } else if (R354StartInput == getCode(line)) {
197 System.out.println("Send mail data.");
200 line = clientReader.readLine();
201 serverWriter.println(line);
203 if (line.equals(".")) {
204 break; //end of mail dara.
209 line = clientReader.readLine();
212 //Finish client stream.
213 System.err.println("Client disconnected.");
214 break; //force disconnect.
217 if (isRcptTo(line)) {
218 //stored To: address.
219 toList.add(formatToAddress(line));
220 } else if (isTurn(line)) {
221 System.err.println("'TURN' is unsupported command.");
222 clientWriter.println(R502CommandNotImplemented);
224 continue; //read next client request.
225 } else if (isData(line)) {
226 //Client want to send data. Check out toList.
227 ListIterator iterater = toList.listIterator();
229 while (iterater.hasNext()) {
230 System.out.println("ADDRESS CHECK:" + iterater.next());
234 new ToListUI(this, toList);
236 while (result == RESULT_UNKNOWN) {
238 synchronized (this) {
241 } catch (InterruptedException e) {
242 System.err.println("Dialg wait interrupted");
247 if (result != RESULT_OK ) {
248 System.out.println("CANCEL sending mail.");
249 serverWriter.println(COMMAND_RESET);
250 line = serverReader.readLine(); //Server MUST retrun "250 OK"
251 System.out.println(COMMAND_RESET + ":ANSER is " + line);
252 clientWriter.println(R451RequestedActionAbort);
254 continue; //I think Client QUIT or Retry.
258 break; // client read while(true);
264 serverWriter.println(line);
265 System.out.println(line);
268 } catch (IOException e) {
272 System.out.println("End of Session.");
275 private String formatToAddress(String line) {
276 System.out.println("FIND To: " + line);
278 //Splitting Mail address.
279 String str = line.substring(COMMAND_RCPT_TO.length() + 1);
280 Pattern pattern = Pattern.compile("[< >]+");
281 String[] address = pattern.split(str); // 0<1>2 3
284 for (i = 0; i < address.length; i++) {
285 if (!address[i].equals("")) {
291 str = address[i] + " " + LDAPSearch.search(address[i]);