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;
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.");
104 //for failsafe Socket close.
105 if (server != null) {
108 } catch (IOException ioEx ) {
109 //IGNORE close Exception
112 if (client != null) {
115 } catch (IOException ioEx ) {
116 //IGNORE close Exception
122 private int getCode(String s) {
123 return Integer.parseInt(s.substring(0, 3));
126 private boolean isContinue(String s) {
127 if ('-' == s.charAt(3)) {
134 private boolean isRcptTo(String s) {
135 if (s.startsWith(COMMAND_RCPT_TO)) {
142 private boolean isData(String s) {
143 if (s.startsWith(COMMAND_DATA)) {
150 private boolean isTurn(String s) {
151 if (s.startsWith(COMMAND_TURN)) {
158 public void sayOK() {
163 public void sayNG() {
168 private synchronized void notifyResult() {
172 private void smtpStart(BufferedReader serverReader,
173 PrintWriter clientWriter, BufferedReader clientReader,
174 PrintWriter serverWriter) {
178 ArrayList toList = new ArrayList();
182 line = serverReader.readLine();
183 clientWriter.println(line);
184 System.out.println(line);
186 if (isContinue(line)) {
187 continue; //Server responce continue
191 if (R221ServiceClosing == getCode(line)) {
192 break; //end of session.
193 } else if (R354StartInput == getCode(line)) {
194 System.out.println("Send mail data.");
197 line = clientReader.readLine();
198 serverWriter.println(line);
200 if (line.equals(".")) {
201 break; //end of mail dara.
206 line = clientReader.readLine();
208 if (isRcptTo(line)) {
209 //stored To: address.
210 toList.add(formatToAddress(line));
211 } else if (isTurn(line)) {
212 System.err.println("'TURN' is unsupported command.");
213 clientWriter.println(R502CommandNotImplemented);
215 continue; //read next client request.
216 } else if (isData(line)) {
217 //Client want to send data. Check out toList.
218 ListIterator iterater = toList.listIterator();
220 while (iterater.hasNext()) {
221 System.out.println("ADDRESS CHECK:" + iterater.next());
225 new ToListDialog(this, toList);
227 while (result == RESULT_UNKNOWN) {
229 synchronized (this) {
232 } catch (InterruptedException e) {
233 System.err.println("Dialg wait interrupted");
238 if (result == RESULT_NG) {
239 System.out.println("CANCEL sending mail.");
240 serverWriter.println(COMMAND_RESET);
241 line = serverReader.readLine(); //Server MUST retrun "250 OK"
242 System.out.println(COMMAND_RESET + ":ANSER is " + line);
243 clientWriter.println(R451RequestedActionAbort);
245 continue; //I think Client QUIT or Retry.
249 break; // client read while(true);
252 serverWriter.println(line);
253 System.out.println(line);
256 } catch (IOException e) {
260 System.out.println("End of Session.");
263 private String formatToAddress(String line) {
264 System.out.println("FIND To: " + line);
266 //Splitting Mail address.
267 String str = line.substring(COMMAND_RCPT_TO.length() + 1);
268 Pattern pattern = Pattern.compile("[< >]+");
269 String[] address = pattern.split(str); // 0<1>2 3
272 for (i = 0; i < address.length; i++) {
273 if (!address[i].equals("")) {
279 str = address[i] + " " + LDAPSearch.search(address[i]);