2. 3.1 Caực khaựi nieọm cụ baỷn
2.6. GIễÙI THIỆU VỀ JAVABEANS
2.6.1.Khaựi nieọm về JAVABEANS
JavaBeans laứ moọt thaứnh phần ủoỏi tửụùng ủửụùc xãy dửùng tửứ ngõn ngửừ Java. JavaBeans coự theồ laứ vieọc vaứ cháy trẽn mói maựy aỷo Java. Yẽu cầu toỏi thieồu nhaỏt ủeồ táo nẽn thaứnh phần JavaBeans laứ : cõng cú vaứ trỡnh biẽn dũch JDK 1.1 trụỷ lẽn. JavaBeans coự theồ sửỷ dúng caực phửụng thửực get/set ủeồ laựy về vaứ ủaởt thuoọc tớnh cho ủoỏi tửụùng Bean maứ noự theồ hieọn.
2.6.2.Caực theỷ chuaồn cuỷa JAVABEANS trong trang JSP
2.6.2.1.<jsp:useBean>
Theỷ <jsp:useBean> duứng ủeồ khai baựo phám vi vaứ ủũnh danh id(identify) nhaọn dáng Bean. Noự tửụng tửù nhử khai baựo bieỏn ủoỏi tửụùng trong maừ java.
Theỷ <jsp:useBean> coự cuự phaựp nhử sau:
<jsp:useBean id=”name”
scope=”page | request | session | application” class=”packagename.classname”>
Thuoọc tớnh Dieĩn giaỷi
Id Thuoọc tớnh naứy laứ ủũnh danh nhaọn dáng cuỷa ủoỏi tửụùng Bean trong moọt phám vi cho trửụực. “name” laứ tẽn cuỷa Bean coự phãn bieọt chửừ hoa, thửụứng.
Scope Thuoọc tớnh phám vi cho bieỏt mõi trửụứng soỏng cuỷa ủoỏi tửụùng. Phám vi cuỷa khai baựo maứ thaứnh phần Bean coự hieọu lửùc bao gồm page (Bean chổ coự hieọu lửùc vaứ phám vi truy xuaỏt trong khai baựo noự). Request (Bean coự hieọu lửùc trong moọt lần yẽu cầu tửứ maựy khaựch). Session (hieọu lửùc cuỷa bean tửụng tửù hieọu lửùc cuỷa caực bieỏn session). Application (hieọu lửùc cuỷa bean tửụng tửù hieọu lửùc cuỷa caực bieỏn application)
Class Tẽn ủầy ủuỷ cuỷa lụựp Bean. ẹãy laứ tẽn taọp tin .class sua khi ủaừ biẽn dũch tửứ maừ nguồn .java. tẽn naứy cuừng phãn bieọt chửừ hoa vaứ chửừ thửụứng
BeanName Naứy ủeồ tham chieỏu ủeỏn tẽn cuỷa Bean
Type Thuoọc tớnh chổ ra loái bieỏn kũch baỷn. Neỏu bieỏn naứy khõng chổ roừ giaự trũ cuỷa noự seừ laứ giaự trũ cuỷa thuoọc tớnh lụựp
Theỷ <jsp:setProperty> duứng ủeồ gaựn giaự trũ vaứo thuoọc tớnh Bean. Thuoọc tớnh tẽn cuỷa Bean chổ ủũnh cho ủoỏi tửụùng phaỷi ủửụùc ủũnh nghúa vaứ naốm trong phám vi cho pheựp.
Cuự phaựp cuỷa <jsp:setProperty>
<jsp:setProperty name = “beanName” prop_expr/>
Trong cuự phaựp trẽn, name cho bieỏt tẽn Bean maứ thuoọc tớnh cuỷa noự ủaừ ủửụùc caứi ủaởt. prop_expr coự theồ coự caực khai baựo sau:
property =”*” |
property = “propertyName” |
property = “propertyName” param=”parameterName”| property = “propertyName” value=” propertyValue”
Thuoọc tớnh Dieĩn giaỷi
Name Thuoọc tớnh trỡnh baứy tẽn cuỷa Bean, tẽn
naứy ủaừ ủửụùc ủũnh nghúa bụỷi theỷ <jsp:useProperty>
Property Thuoọc tớnh cuỷa Bean cần laỏy giaự trũ
Param Tham soỏ cần duứng cho thuoọc tớnh cuỷa
Bean
Value Giaự trũ ủửụùc gaựn vaứo cho thuoọc tớnh
cuỷa Bean 2.6.2.3. <jsp:getProperty>
Theỷ <jsp:getProperty> duứng ủeồ laỏy giaự trũ thuoọc tớnh Bean vaứ chuyeồn giaự trũ thaứnh kieồu chuoĩi. Cuự phaựp cho theỷ <jsp:getProperty> nhử sau:
<jsp:getProperty name=”name” property=”propertyName”/>
Thuoọc tớnh Dieĩn giaỷi
Name Thuoọc tớnh trỡnh baứy tẽn cuỷa Bean, tẽn naứy ủaừ ủửụùc khai baựo vaứ ủũnh nghúa bụỷi theỷ <jsp:useProperty>
Property Thuoọc tớnh cuỷa Bean cần laỏy giaự trũ
2.6.3.Thẽm JAVABEANS vaứo JSP
ẹeồ sửỷ dúng JavaBeans trong trang JSP, bán cần khai baựo Bean vụựi theỷ: < jsp:useBean >
< jsp : useBean id = “jb” scope = “page” class = “searchbean. searchbean”/> < jsp : setProperty name = “jb” property = “job” param = “name”/>
PHẦN 2 : XÂY DệẽNG ệÙNG DUẽNG CHệễNG 1 PHÂN TÍCH BAỉI TOÁN
1.1.TÊN ẹỀ TAỉI
Tỡm hieồu xãy dửùng ửựng dúng thử ủieọn tửỷ
1.2.1.Khaỷo saựt
Trong thụứi gian thửùc taọp toỏt nghieọp tõi ủaừ khaỷo saựt, tỡm hieồu heọ thoỏng thử tớn ủieọn tửỷ. Quaự trỡnh xãy dửùng moọt ửựng dúng thử ủieọn tửỷ (Email) raỏt ủa dáng nhửng chuỷ yeỏu taọp trung vaứo hai phần:
- Xãy dửùng mail server : laứ chửụng trỡnh hoát ủoọng phớa maựy chuỷ nhaọn, lửu trửừ mail, phãn phoỏi, gụỷi mail ủeỏn caực trỡnh chuỷ khaực. Caực chửụng trỡnh nhử Mail Deamon, SendMail, Mail Exchange… laứ nhửừng mail server.
- Xãy dửùng mail client : laứ chửụng trỡnh hoát ủoọng phớa maựy khaựch thửùc hieọn chửực naờng cho pheựp ngửụứi duứng nhaọp vaứo noọi dung mail, gụỷi mail ủeỏn maựy chuỷ mail server xaực ủũnh. Nhaọn mail tửứ maựy chuỷ về vaứ hieồn thũ cho ngửụứi duứng xem noọi dung mail. Vớ dú nhử Outlook Express cuỷa Windows hay Web mail trẽn Internet laứ nhửừng trỡnh ủoựng vai troứ mail client.
1.2.2.Yẽu cầu cuỷa baứi toaựn
Yẽu cầu chớnh cuỷa baứi toaựn
- Phần mail client: thửùc hieọn ủửụùc cụ baỷn nhaỏt nhửừng chửực naờng cuỷa moọt mail client nhử vieọc gụỷi, nhaọn, hieồn thũ noọi dung mail thõng qua trỡnh duyeọt Web vụựi giao thửực HTTP cuỷa Internet.
- Phần mail server : thửùc hieọn ủửụùc chửực naờng tieỏp nhaọn mail do trỡnh khaựch (mail client) gửỷi lẽn (SMTP Server), lửu trửừ mail trong thử múc nhaỏt ủũnh cho pheựp ngửụứi duứng sửỷ dúng giao thửực POP3 ủóc mail (POP3 Server), chuyeồn mail ủeỏn maựy chuỷ khaực (Forward Server) hoaởc phãn giaỷi ủũa chổ mail gửỷi thaỳng ủeỏn ủớch (Relay Server).
1.2.3.Dửừ lieọu vaứo, dửừ lieọu ra vaứ caực chửực naờng xửỷ lyự cuỷa heọ thoỏng
* Dửừ lieọu vaứo :
- Phần mail client :
+ Thõng tin ủaờng kyự cuỷa ngửụứi duứng - Phần mail server :
+ Mail do trỡnh khaựch gửỷi lẽn
+ Thõng tin về vũ trớ thử múc lửu trửừ mail trẽn server * Dửừ lieọu ra :
- Phần mail client :
+ Thử múc tửụng ửựng vụựi tẽn taứi khoaỷn, thõng tin về user name vaứ password ủeồ duứng cho vieọc POP3 Server chửựng thửùc quyền truy caọp cuỷa ngửụứi duứng khi cần ủóc mail
- Phần mail server :
+ Lửu trửừ mail do trỡnh khaựch gửỷi ủeỏn
+ Chuyeồn tieỏp nhửừng mail khõng thuoọc domain mail do mail server quaỷn lyự.
1.2.4. Chửực naờng cuỷa heọ thoỏng thõng tin quaỷn lyự
* Quaỷn lyự toaứn boọ thõng tin liẽn quan ủeỏn user nhử: hó, tẽn, ngaứy thaựng naờm sinh, nghề nghieọp, giụựi tớnh, quoỏc gia, thaứnh phoỏ…
* Quaỷn lyự soồ ủũa chổ
1.3. LÝ DO CHOẽN ẹỀ TAỉI
Ngaứy nay ủoỏi vụựi moĩi chuựng ta thử ủieọn tửỷ khõng coự gỡ xa lá tuy nhiẽn ủoự laứ ủửựng về phửụng dieọn ngửụứi duứng. Xuaỏt phaựt tửứ mong muoỏn tỡm hieồu moọt caựch tửụứng taọn hụn heọ thoỏng thử ủieọn tửỷ nhỡn tửứ khớa cánh nhaứ thieỏt keỏ nẽn tõi ủaừ quyeỏt ủũnh chón ủề taứi xãy dửùng ửựng dúng thử ủieọn tửỷ theo mõ hỡnh Client Server.
CHệễNG 2 : THIẾT KẾ VAỉ CAỉI ẹAậT ệÙNG DUẽNG
2.1.PHÂN TÍCH VAỉ THẾT KẾ Cễ SễÛ Dệế LIỆU
2.1.1.Phãn tớch
Cụ sụỷ dửừ lieọu ủửụùc thieỏt keỏ ủụn giaỷn vaứ duứng vaứo múc ủớch quaỷn lyự danh saựch thaứnh viẽn ủaờng kyự sửỷ dúng dũch vú thử ủieọn tửỷ cuỷa vietmail.
Vụựi múc ủớch ủoự CSDL chổ bao gồm hai thửùc theồ chớnh laứ ủửụùc theồ hieọn trong baỷng sau :
STT Tẽn thửùc theồ Thuoọc tớnh
1 members
(thaứnh viẽn) userid password (maừ thaứnh viẽn ), (maọt khaồu), question user_name (cãu hoỷi), (tẽn ủaờng nhaọp), answer (cãu traỷ lụứi), ho (hó), ten (tẽn), ngay (ngaứy sinh), thang (thaựng sinh), nam (naờm sinh), gioi_tinh (giụựi tớnh)
nuoc (quoỏc gia), thanh_pho (thaứnh phoỏ), thanh_pho_khac
(thaứnh phoỏ khõng thuoọc Vieọt Nam), job (nghề nghieọp),
thong_tin_khac (thõng tin phú khaực),
date(ngaứy ủaờng kyự) 2 addressbook
(Soồ ủũa chhổ) addressid quickname(maừ soồ ủũa chổ), (tẽn gụùi nhụự), houserid (hó), (maừ thaứnh viẽn), ten (tẽn), email (ủũa chổ email), phone (soỏ ủieọn thoái), diachi (ủũa chổ)
CÁC LệễẽC ẹỒ QUAN HỆ
Tửứ nhửừng thửùc theồ vaứ thửùc theồ trung gian trẽn, baống caực nguyẽn taộc bieỏn ủoồi, ta xãy dửùng thaứnh caực lửụùc ủồ quan heọ nhử sau:
Member (userid, user_name, password, question, answer, ho, ten, ngay, thang, nam, gioi_tinh, nuoc, thanh_pho, thanh_pho_khac, job, thong_tin_khac, date)
Addressbook (addressid, userid, quickname,ho,ten,email,phone,diachi)
Lửụùc ủồ quan heọ dửừ lieọu
Sinh viẽn thửùc hieọn Nguyeĩn Xuãn Thanh Trang 56 member userid user_name password question answer ho ten ngay thang nam gioi_tinh nuoc thanh_pho thanh_pho_khac job addressbook addressid userid quickname ho ten email phone diachi
Phãn tớch chửực naờng
Sụ ủồ bieồu dieĩn chửực naờng cuỷa heọ thoỏng
2.1.2. Giaỷi thớch caực chửực naờng cuỷa heọ thoỏng thớch caực chửực naờng cuỷa heọ thoỏng
- chửực naờng : ẹaờng kyự thaứnh viẽn
yự nghúa : thu thaọp caực thõng tin cuỷa thaứnh viẽn nhaốm múc ủớch quaỷn lyự cuừng nhử thieỏt laọp caực thõng soỏ phúc vú cho vieọc gụỷi vaứ nhaọn thử ủieọn tửỷ cuỷa thaứnh viẽn
- chửực naờng : Quaỷn lyự soồ ủũa chổ
yự nghúa : táo moọt danh saựch boa gồm caực ủũa chổ do thaứnh viẽn tửù táo rong quaự trỡnh sửỷ dúng heọ thoỏng.
2.1.3.bieồu ủồ luồng dửừ lieọu( DFD – Data flow Diagram)
.Bieồu ủồ luồng dửừ liẽùu mửực khung caỷnh (BFD)
Heọ thoỏng quaỷn lyự thaứnh viẽn cuỷa vietmail
ẹaờng kyự thaứnh viẽn Quaỷn lyự soồ ủũa chổ
Yẽu cầu Thaứnh viẽn Thaứnh viẽn ẹaờng kyự Thõng baựo Heọ thoỏng vietmail
2.1.4. THIẾT KẾ HỆ THỐNG
2.1.4.1. Caực baỷng dửừ lieọu chớnh
Kyự hieọu:
PK: Khoaự chớnh (Primary Key)
FK: Khoaự ngoái (Foreign Key) Baỷng dửừ lieọu: Member ( Thaứnh viẽn)
Tẽn trửụứng Kieồu DL ẹoọ lụựn Raứng buoọc Khoaự Ghi chuự
userid int 4 Not Null PK
user_name varchar 20 Not Null Tẽn ủaờng nhaọp
password char 10 Maọt khaồu
question text 16
answer text 16
ho text 16 Not Null
ten text 16 Not Null
ngay smallint 2 Not Null
thang smallint 2 Not Null
nam int 4 Not Null
gioitinh char 5 Not Null
nuoc text Not Null
thanh_pho text 16 Not Null
thanh_pho_ khac text 16 job int 4 thong_tin_k hac text 16
date datetime 8 Not Null
Baỷngdửừ lieọu : Addresbook (soồ ủũa chổ)
Tẽn trửụứng Kieồu DL ẹoọ lụựn Raứng buoọc Khoaự Ghi chuự
addressid int 7 Not Null PK
userid int 8 Not Null Fk
quickname text 8
ho text 8
ten text 20
email text Not Null
diachi text
2.2. CAỉI ẹAậT MAILSERVER
2.2.1.Phửụng aựn toồ chửực lửu trửừ mail trẽn Server
ẹeồ lửu trửừ mail gửỷi ủeỏn trẽn server, moĩi trỡnh mailserver seừ coự moọt phửụng aựn riẽng ủeồ lửu trửừ. Chaỳng hán coự theồ lửu trửừ thõng ủieọp mail nhử laứ caực record trong baỷng dửừ lieọu cuỷa database hoaởc lửu trong cuứng moọt file text phãn caựch moĩi thõng ủieọp baống moọt daỏu hieọu ủaởc trửng naứo ủoự. Tuy nhiẽn vieọc lửu thõng ủieọp mail dửụựi dáng caực file trong tửứng thử múc tửụng ửựng cuỷa caực User toỷ ra ủụn giaỷn hụn vaứ cuừng khõng keựm phần hieọu quaỷ. Vỡ vaọy trong ủồ aựn naứy tõi quyeỏt ủũnh chón phửụng aựn lửu thõng ủieọp mail dửụựi dáng taọp tin trẽn ủúa cúc boọ. Trửụực khi caứi ủaởt caực ủụn theồ Mail server ta cần toồ chửực thử múc ủeồ SMTP server lửu trửừ mail nhử sau:
Hỡnh : Toồ chửực thử múc lửu trửừ mail
Moĩi mailserver coự theồ coự nhiều tẽn domain cho ủũa chổ mail, caực tẽn domain naứy ủửụùc toồ chửực trong 1 thử múc, ụỷ ủãy ta chón vietmail.com laứ tẽn domain mail. Luực naứy moọt ủũa chổ e – mail hụùp leọ gửỷi ủeỏn SMTP server cuỷa ta phaỷi coự dáng nhử sau username@vietmail.com. Heọ thoỏng mail server coứn cho pheựp mụỷ roọng thẽm vaứo caực domain mail khaực. Danh saựch caực tẽn domain main naốm trong file
domain.txt.
Trong thử múc email\data\vietmail.com chửựa danh saựch caực thử múc con ủái dieọn cho tửứng taứi khoaỷn (nhử thanhboeing, xuanthu…). Thõng tin ủaờng nhaọp cuỷa taứi khoaỷn ủửụùc ủaởt trong file User.txt.
2.2.2.Caực ủụn theồ cuỷa mailserver
Trỡnh MailServer coự caực ủụn theồ ủửụùc caứi ủaởt baống ngõn ngửừ java vaứ bao gồm caực phần chớnh sau:
- ẹụn theồ xửỷ lyự taọp leọnh SMTP - ẹụn theồ xửỷ lyự taọp leọnh POP3 2.2.2.1. Xãy dửùng SMTP Server
Nhieọm vúchớnh cuỷa SMTP Server laứ sửỷ lyự taọp leọnh SMTP, traỷ lái maừ loĩi do trỡnh khaựch gụỷi lẽn khõng hụùp leọ. Tieỏp nhaọn dửừ lieọu vaứ lửu vaứo thử múc nhaỏt ủũnh ủeồ trỡnh chuỷ POP3 Server coự theồ truy xuaỏt sau naứy. SMTP server seừ mụỷ socket laộng nghe trẽn coồng 25 (coồng maởc ủũnh cuỷa SMTP). Ta cuừng coự theồ thay ủoồi soỏ hieọu coồng trong file caỏu hỡnh email.properties. khi nhaọn ủửụùc keỏt noỏi tửứ trỡnh khaựch, SMTP server seừ mụỷ moọt tuyeỏn (thread) laứ lụựp SMTPConection chũu traựch nhieọm phãn tớch caực leọnh SMTP vaứ nhaọn mail do trỡnh khaựch gụỷi lẽn. Lụựp SMTP ủửụùc caứi ủaởt nhử sau:
SMTPServer.java
import java.io.*; import java.net.*; import java.util.*;
public class SMTPServer extends Thread {
protected ServerSocket listenSocket = null; protected Vector connections;
public Boolean stopRequested; public SMTPServer() throws Exception {
int port = 0;
String portString = null;
// Laỏy soỏ hieọu coồng S MTP tửứ file caỏu hỡnh try {
portString = Server.properties.getProperty("smtp.port"); port = Integer.parseInt(portString);
} catch (NumberFormatException e) {
throw new Exception("Invalid 'smtp.port' - " + portString); }
// Mụỷ socket laựng nghe keỏt noỏi tửứ trỡnh khaựch listenSocket = new ServerSocket(port); // Maỷng lửu caực keỏt noỏi tửứ trỡnh khaựch connections = new Vector(10, 10);
}
public void removeConnection(SMTPConnection connection) { connections.removeElement(connection);
}
public void run() {
// Laởp võ taọn chụứ nhaọn keỏt noỏi cho ủeỏn khi coự tớn hieọu dửứng stopRequested = new Boolean(false);
while (true) {
synchronized (stopRequested) {
if (stopRequested.booleanValue()) break;
}
// chaỏp nhaọn keỏt noỏi try {
Socket s = listenSocket.accept();
System.out.println("Accept");
//Phãn tớch caực leọnh SMTP cuỷa trỡnh khaựch – thửùc hieọn vieọc tieỏp nhaọn mail SMTPConnection connection = new SMTPConnection(s, this); connections.addElement(connection); connection.start(); } catch (IOException e) { e.printStackTrace(); break; } }
// ẹoựng keỏt noỏi try { listenSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Lụựp SMTPConnection ủoựng vai troứ chớnh trong SMTPServer. SMTPConnection phãn tớch caực leọnh SMTP, nhaọn mail vaứ lửu vaứ thử múc tửụng ửựng vụựi ủũa chổ mail cuỷa User. Chửụng trỡnh mailserver cuừng cho pheựp khaỷ naờng
relayvaứ chuyeồn tieỏp mail. Caực mail coự ủũa chổ khõng thuoọc domain do mailserver quaỷn lyự seừ ủửụùc lửu vaứ thử múc queue (hay haứng ủụùi). Chửụng trỡnh SMTPRelayServer vaứ SMTPRForrwardServer seừ xửỷ lyự caực mail naứy. Lụựp SMTPConnection ủửụùc caứi ủaởt nhử sau:
SMTPConnection.java
import java.io.*; import java.net.*; import java.util.*; /**
* SMTPConnection : Xửỷ lyự caực leọnh SMTP, lửu mail vaứo thử múc thớch hụùp */
public class SMTPConnection extends Thread { protected SMTPServer server;
protected Socket socket; protected Vector recipients; public BufferedReader in; public PrintStream out; public String returnPath; protected Vector users;
protected boolean stopRequested;
public SMTPConnection(Socket socket, SMTPServer server) { this.socket = socket;
this.server = server; }
/**
* ẹoựng keỏt noỏi – hoaứn taỏt quaự trỡnh nhaọn mail tửứ trỡnh khaựch * */
public void close() { try {
socket.close(); } catch (Exception e) {
System.err.println("Exception trying to close SMTPConnection socket!"); e.printStackTrace(System.err);
} }
/**
* Xửỷ lyự leọnh SMTP DATA */
public void processDATA() throws IOException { String line;
StringBuffer data = new StringBuffer(); line = in.readLine();
while (!line.equals(".")) { if (line.startsWith(".."))
line = line.substring(1);
// ẹaởt chuoĩi nhaọn ủửụùc vaứo StringBuffer System.out.println(line);
data.append(line + "\n"); line = in.readLine(); }
// Lửu thõng ủieọp
String messageId = Server.storage.saveMessage(users, data); // Thõng baựo cho trỡnh khaựch thõng ủieọp ủaừ ủửụùc lửu
out.println("250 Message '" + messageId + "' accepted for delivery"); }
/**
* Xửỷ lyự leọnh SMTP EHELO – Leọnh naứy chổ daứnh cho taọp leọnh cuỷa SMTP mụỷ roọng – noự tửụng ửựng vụựi leọnh baột tay HELO
**/
public void processEHLOCommand(StringTokenizer arguments) { processHELOCommand(arguments);
} /**
* Xửỷ lyự leọnh SMTP HELO **/
public void processHELOCommand(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) {
out.println("501 HELO requires domain address"); return;
}
out.println("250 " + Server.getAddress() + " Hello"); }
/**
* Xửỷ lyự leọnh SMTP MAIL **/
public boolean processMAIL() throws IOException { String line = "";
while (true) {
line = in.readLine(); System.out.println(line);
if (line.length() < 4) {
out.println("500 Command Unknown '" + line + "'"); continue;
}
StringTokenizer tokenizer = new StringTokenizer(line); String command = tokenizer.nextToken();
if (command.equalsIgnoreCase("HELO")) { processHELOCommand(tokenizer); continue; } if (command.equalsIgnoreCase("EHLO")) { processEHLOCommand(tokenizer); continue; } if (command.equalsIgnoreCase("VRFY")) { processVRFYCommand(tokenizer); continue; } if (command.equalsIgnoreCase("QUIT")) { processQUITCommand(tokenizer); return false; } if(command.equalsIgnoreCase("RCPT")|| command.equalsIgnoreCase("DATA")) {
out.println("503 Bad sequence of commands - specify MAIL first"); continue;
if (command.equalsIgnoreCase("MAIL")) { if (processMAILCommand(tokenizer)) { out.println("250 OK"); return true; } }
out.println("500 Command Unknown '" + line + "'"); }
}
public boolean processMAILCommand(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) {
out.println("503 Syntax: MAIL FROM:<user>"); return false;
}
returnPath = arguments.nextToken();
System.out.println(returnPath+" "+returnPath.length()); if (returnPath.length() < 5) {
out.println("503 Syntax: MAIL FROM:<user>"); return false;
}
if (!returnPath.substring(0, 5).equalsIgnoreCase("FROM:")) { out.println("503 Syntax: MAIL FROM:<user>");
return false; }
return true; }
protected void processQUITCommand(StringTokenizer arguments) { out.println("221 " + Server.getAddress() + " closing connection"); stopRequested = true;
public boolean processRCPT() throws IOException { users = new Vector(2, 2);
String line = ""; while (true) {
line = in.readLine(); System.out.println(line);
if (line.length() < 4) {
out.println("500 Command Unknown '" + line + "'"); continue;
}
StringTokenizer tokenizer = new StringTokenizer(line); String command = tokenizer.nextToken();
if (command.equalsIgnoreCase("EHLO")) { processEHLOCommand(tokenizer); continue; } if (command.equalsIgnoreCase("VRFY")) { processVRFYCommand(tokenizer); continue; } if (command.equalsIgnoreCase("RSET")) { out.println("250 Reset state");
return false; } if (command.equalsIgnoreCase("QUIT")) { processQUITCommand(tokenizer); return false; } if (command.equalsIgnoreCase("MAIL")) {
out.println("503 Sender already specified"); continue;
}
if (users.size() == 0) {
out.println("503 Bad sequence of commands - specify RCPT first"); continue;
}
out.println("354 Enter mail, ending with '.' on a line by itself"); return true; } if (command.equalsIgnoreCase("RCPT")) { processRCPTCommand(tokenizer); continue; }
out.println("500 Command Unknown '" + line + "'"); }
}
public void processRCPTCommand(StringTokenizer arguments) { if (!arguments.hasMoreTokens()) {
out.println("501 Syntax: RCPT TO:<address>"); return;
}
String arg = arguments.nextToken();
if (!arg.substring(0, 3).equalsIgnoreCase("TO:")) { out.println("501 Syntax: RCPT TO:<address>"); return;
}
// ẹũa chổ naốm sau "TO:" System.out.println(arg);
// Moọt vaứi trỡnh khaựch gụỷi leọnh RCPT TO: khõng coự khoaỷng traộng sau TO String address;
try{
address=arguments.nextToken(); //coự khoaỷng traộng } catch(Exception e){
address = arg.substring(3);//khõng coự khoaỷng traộng }
System.out.println("Receipt address :"+address);
// Thõng thửụứng ủũa chổ mail ủửụùc gụỷi theo dáng <user@domainname>
if (address.substring(0, 1).equals("<") && address.substring(address.length() - 1, address.length()).equals(">"))
address = address.substring(1, address.length() - 1); // Laỏy về thõng tin cuỷa user tửứ ủũa chổ mail
User user = Server.storage.getUser(address); // Baựo loĩi cho trỡnh khaựch neỏu user khõng tồn tái
if (user == null) {
out.println("550 User " + address + " is not known"); return;
}
// ẹửa user vaứo danh saựch phãn phoỏi mail users.addElement(user);
// Traỷ về maừ loĩi thaứnh cõng
out.println("250 Recipient " + address + " ok"); }
public void processVRFYCommand(StringTokenizer arguments) { out.println("252 VRFY command not implemented");
} /**
* Phửụng thửực run() laởp liẽn túc ủeồ lyự leọnh cho ủeỏn khi hoaứn taỏt */
public void run() { try {
in=new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintStream(socket.getOutputStream());
} catch (IOException e) { e.printStackTrace(System.err); close(); return; } stopRequested = false; out.println("220mail.goemaat.comJAVASMTPServer (com.goemaat.email.SMTP) ready");
while (!stopRequested) { try { if (processMAIL()) { if (processRCPT()) processDATA(); } } catch (IOException e) { e.printStackTrace(System.err); stopRequested = true; } }
// ẹoựng socket ủaừ mụỷ trửụực ủoự close();
// Loái boỷ keỏt noỏi trong danh saựch SMTPServer server.removeConnection(this);
} }
Chửụng trỡnh Server.java dửụựi ủãy ủửụùc duứng ủeồ ủóc file caỏu hỡnh email.properties, khụỷi táo SMTPServer. Server.java cuừng laứm nhieọm vú khụỷi táo