OSDN Git Service

Mail Destination Confirm Program(Beta)
[mdc/BetaProject.git] / src / org / jent / checksmtp / Processer.java
1 package org.jent.checksmtp;
2
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;
8
9 /*
10  * Socket accept proceed
11  */
12 import java.io.OutputStreamWriter;
13 import java.io.PrintWriter;
14
15 import java.net.Socket;
16
17 import java.util.ArrayList;
18 import java.util.ListIterator;
19 import java.util.regex.Pattern;
20
21
22 public class Processer implements Runnable {
23   private Socket client;
24
25   //Conform status.
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;
30
31   //SMTP result code
32   private final int R354StartInput = 354;
33   private final int R221ServiceClosing = 221;
34   private final int R451RequestedActionAbort = 451;
35   private final int R502CommandNotImplemented = 502;
36
37   //SMTP command
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";
42
43   //private final String COMMAND_NOOP = "NOOP";
44   //private final String COMAMND_QUIT = "QUIT";
45   public Processer(Socket client) {
46       this.client = client;
47   }
48
49   public void run() {
50     InputStream serverInput;
51     OutputStream serverOutput;
52     InputStream clientInput;
53     OutputStream clientOutput;
54
55     BufferedReader serverReader;
56     PrintWriter serverWriter;
57     BufferedReader clientReader;
58     PrintWriter clientWriter;
59
60     try {
61       //Connect to SMTP Server host 
62       String servername = ApplicationProperties.getSmtpServerHost();
63
64       //SMTP Server port 
65       int serverport = ApplicationProperties.getSmtpServerPort();
66
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();
73
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);
84
85       smtpStart(serverReader, clientWriter, clientReader, serverWriter);
86
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();
94       server.close();
95       client.close();
96     } catch (IOException e) {
97       System.err.println("Execption occurred in Processer.");
98       e.printStackTrace();
99     }
100   }
101
102   private int getCode(String s) {
103       return Integer.parseInt(s.substring(0, 3));
104   }
105
106   private boolean isContinue(String s) {
107       if ('-' == s.charAt(3)) {
108           return true;
109       }
110
111       return false;
112   }
113
114   private boolean isRcptTo(String s) {
115       if (s.startsWith(COMMAND_RCPT_TO)) {
116           return true;
117       }
118
119       return false;
120   }
121
122   private boolean isData(String s) {
123       if (s.startsWith(COMMAND_DATA)) {
124           return true;
125       }
126
127       return false;
128   }
129
130   private boolean isTurn(String s) {
131       if (s.startsWith(COMMAND_TURN)) {
132           return true;
133       }
134
135       return false;
136   }
137
138   public void sayOK() {
139       result = RESULT_OK;
140       notifyResult();
141   }
142
143   public void sayNG() {
144       result = RESULT_NG;
145       notifyResult();
146   }
147
148   private synchronized void notifyResult() {
149       notify();
150   }
151
152   private void smtpStart(BufferedReader serverReader,
153     PrintWriter clientWriter, BufferedReader clientReader,
154     PrintWriter serverWriter) {
155     String line;
156
157     try {
158       ArrayList toList = new ArrayList();
159
160       while (true) {
161         //Server responce
162         line = serverReader.readLine();
163         clientWriter.println(line);
164         System.out.println(line);
165
166         if (isContinue(line)) {
167           continue; //Server responce continue
168         }
169
170         //Client request
171         if (R221ServiceClosing == getCode(line)) {
172           break; //end of session.
173         } else if (R354StartInput == getCode(line)) {
174           System.out.println("Send mail data.");
175
176           while (true) {
177             line = clientReader.readLine();
178             serverWriter.println(line);
179
180             if (line.equals(".")) {
181               break; //end of mail dara.
182             }
183           }
184         } else {
185           while (true) {
186             line = clientReader.readLine();
187
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);
194
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();
199
200               while (iterater.hasNext()) {
201                 System.out.println("ADDRESS CHECK:" + iterater.next());
202               }
203
204               //checkout toList
205               new ToListDialog(this, toList);
206
207               while (result == RESULT_UNKNOWN) {
208                 try {
209                     synchronized (this) {
210                         wait();
211                     }
212                 } catch (InterruptedException e) {
213                     System.err.println("Dialg wait interrupted");
214                     e.printStackTrace();
215                 }
216               }
217
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);
224
225                 continue; //I think Client QUIT or Retry. 
226               }
227             }
228
229             break; // client read while(true);
230           }
231
232           serverWriter.println(line);
233           System.out.println(line);
234         }
235       }
236     } catch (IOException e) {
237       e.printStackTrace();
238     }
239
240     System.out.println("End of Session.");
241   }
242
243   private String formatToAddress(String line) {
244     System.out.println("FIND To: " + line);
245
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
250     int i;
251
252     for (i = 0; i < address.length; i++) {
253       if (!address[i].equals("")) {
254         break;
255       }
256     }
257
258     //Search LDAP
259     str = address[i] + " " + LDAPSearch.search(address[i]);
260     return str;
261   }
262 }