Qua quá trình khảo sát, phân tích – thiết kế và cài đặt chương trình ứng dụng WEB MAIL, bài toán cơ bản đã hoàn thành với đạt được những mục tiêu sau đây : ¯ Thực hiện được cơ bản các chức năng của một hệ thống WebMail ¯ Nắm bắt được công cụ lập trình đã sử dụng ¯ Tiếp cận được công nghệ mới và sử dụng vào việc xây dựng ứng dụng
92 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2848 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Xây dựng ứng dụng Webmail, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ø sinh maõ HTML traû veà trình khaùch. Baèng caùch naøy Servlet coù theå chaïy treân raát nhieàu trình chuû hieåu Java vaø chuùng khoâng phuï thuoäc vaø trình duyeät (browser).
2.4.2.Nhöõng öùng duïng thöïc teá cuûa JAVA SERVLET vaø kieán truùc cuûa JAVA SERVLET
Servlet coù theå ñöôïc söû duïng trong baát kyø moät öùng duïng naøo lieân quan ñeán Web. Hai goùi taïo neân kieán truùc cuûa Java Servlet laø : javax.servlet vaø javax.servlet.http. Goùi javax.servlet chöùa ñöïng phaàn giao dieän toång quaùt phuïc vuï cho Servlet. javax.servlet.http chöùa ñöïng caùc lôùp phuïc vuï cho giao thöùc trieäu goïi HTTP. Boä khung hình thaønh neân Servlet bao goàm caùc phöông thöùc sau:
init() Phöông thöùc khôûi taïo servlet.
service() Phöông thöùc nhaän vaø traû lôøi töø phía ngöôøi söû duïng.
destroy() Phöông thöùc thöïc hieän vieäc huyû servlet.
Caùc taäp tin Servlet ñeàu ñöôïc ñaët trong giao dieän bao goàm caùc phöông thöùc treân. Chuùng raát roõ raøng trong giaûi phaùp laäp trình ñoái töôïng vaø deã daøng môû roäng.
2.5.GIÔÙI THIEÄU VEÀ JAVA SERVER PAGES(JSP)
2.5.1.Khaùi nieäm veà JSP
JSP laø coâng ngheä raát maïnh ñeå taïo trang HTML ñoäng veà phía trình chuû. JSP laø phaàn môû roäng tröïc tieáp cuûa Java Servlet, boä dieãn dòch JSP seõ aùnh xaï tröïc tieáp maõ JSP thaønh Servlet. Vieát trang JSP ta khoâng caàn phaûi thoâng qua quaù trình bieân dòch taäp tin thöïc thi .class nhö trong Servlet. JSP cung caáp moâ hình laäp trình Web deã daøng vaø tieän duïng hôn Servlet. Coâng vieäc bieân dòch trang JSP ñöôïc thöïc hieän töï ñoäng bôûi trình chuû.
2.5.2.Quan heä giöõa Servlet vaø JSP
2.5.2.1.Caùch trình chuû bieân dòch trang JSP thaønh servlet
Thaät söï caùc trang JSP ñöôïc trình chuû dòch ra thaønh servlet tröôùc khi cho thöïc thi. Khi trình khaùch trieäu goïi trình chuû Web server seõ thöïc hieän caùc böôùc sau:
Böôùc 1: Kieåm tra trang JSP ñaõ ñöôïc dòch ra thaøn maõ nguoàn töông ñöông cuûa servlet chöa.
Böôùc 2 : Neáu chöa bieân dòch trang JSP thaønh file nguoàn thaønh file nguoàn .java theo caáu truùc cuûa servlet. Goïi trình bieân dòch javac bieân dòch file nguoàn .java thaønh file thöïc thi cuûa servlet .class.
Böôùc 3 : Naïp servlet ñaõ bieân dòch ôû böôùc 2, thöïc thi keát quaû traû veà cho trình khaùch.
Böôùc 4 :Neáu file JSP ñaõ ñöôïc bieân dòch tröôùc ñoù : thöïc hieän vieäc kieåm tra xem noäi dung file JSP coù thay ñoåi hay khoâng. Neáu coù, quay laïi böôùc 2 bieân dòch laïi trang. Neáu khoâng thöïc hieän laïi böôùc 3.
2.5.2.2. So saùnh giöõa Servlet vaø JSP
Do maõ trang JSP thi thöïc thi ñeàu ñöôïc bieân dòch ra servlet cho neân taát caû nhöõng gì servlet laøm ñöôïc cuõng ñoàng nghóa vôùi trang JSP laøm ñöôïc. Vieát trang JSP ñoâi khi ñôn giaûn hôn trang servlet vì khoâng caàn phaûi qua böôùc ñaêng kyù vaø bieân dòch thuû coâng.
JSP coù theå troän laãn maõ java vôùi caùc theû HTML neân vieäc thieát keá trang JSP thöôøng ñôn giaûn vaø deã boå sung hôn so vôùi servlet. Tuy nhieân ñaây cuõng laø yeáu toá khoâng neân laïm duïng ñoái vôùi JSP. Neáu taäp trung taát caû maõ Java vaøo cuøng vôùi maõ HTML thì moät khi döï aùn môû roäng vaø trôû neân phöùc taïp taát nhieân vieäc baûo trì vaø naâng caáp öùng duïng Web vôùi haøng traêm trang JSP seõ raát khoù khaên. Trong quaù trình phaùt trieån öùng duïng Web theo nhoùm, vieäc troän laãn maõ Java vaø HTML trong trang JSP cho thaáy khoâng hieäu quaû. Khoù coù theå taùch rôøi giöõa coâng vieäc vieát maõ cho öùng duïng (thöôøng laø vai troø cuûa laäp trình vieân – programmer) vaø nhoùm xaây döïng giao dieän (nhoùm thieát keá Web – Web designer). Maõ trang JSP ôû daïng thuaàn vaên baûn neân thöôøng khoâng che ñöôïc maõ nguoàn cuûa logic chöông trình.
Vôùi servlet tuy phaûi bieân dòch vaø ñaêng kyù thuû coâng vôùi trình chuû nhöng buø laïi tính baûo maät cao hôn. Ta chæ caàn cung caáp cho trình chuû Web Server baûn servlet nhò phaân ( file .class ) ñaõ qua böôùc bieân dòch maø khoâng caàn ñeán maõ nguoàn cuûa servlet ban ñaàu. Maët khaùc, caùc servlet coù theå töông taùc lieân hoaøn vôùi nhau ñeå taïo neân nhöõng keát xuaát tuyø bieán vaø ña daïng tröôùc khi traû keát quaû veà cho trình khaùch. Servlet coù theå phaân raõ caùc ñôn theå cuûa döï aùn vaø phaùt trieån ñoäc laäp nhau nhö caùc thaønh phaàn rieâng bieät ñeå raùp laïi trong moät toång theå chung. Maëc duø vaäy, vieäc keát xuaát trong servlet thöôøng döïa vaøo phöông thöùc print() hoaëc println() neân vieäc keát xuaát phuï thuoäc vaøo laäp trình vieân vôùi haøng loaït caùc leänh print() vaø println() raát khoù quaûn lyù.
Vieäc quyeát ñònh söû duïng trang JSP, Servlet hay keát hôïp caû hai laø tuøy vaøo töøng döï aùn vaø muïc ñích cuûa chöông trình caàn phaùt trieån. Thoâng thöôøng ñoái vôùi nhöõng döï aùn nhoû, yeâu caàu thôøi gian nhanh, JSP laø löïa choïn thích hôïp nhaát. Ñoái vôùi nhöõng döï aùn caàn söï ñoäc laäp vaø chæ thieân veà xöû lyù ta neân söû duïng servlet. Tröôøng hôïp döï aùn lôùn ta neân keát hôïp caû servlet vaø JSP. Moâ hình keát hôïp toát nhaát giöõa servlet vaø JSP thöôøng ñöôïc goïi laø MCV (Model – View – Controler) trong ñoù servlet ñoùng vai troø trung taâm ñieàu khieån (controler) ñöa ra quyeát ñònh xöû lyù, JSP ñoùng vai troø theå hieän giao dieän hay hieån thò döõ lieäu ñaõ xöû lyù (View). Quy trình tính toaùn logic cuûa öùng duïng ñöôïc giao laïi cho caùc thaønh phaàn JavaBean hay EJB.
2.6. GIÔÙI THIEÄU VEÀ JAVABEANS
2.6.1.Khaùi nieäm veà JAVABEANS
JavaBeans laø moät thaønh phaàn ñoái töôïng ñöôïc xaây döïng töø ngoân ngöõ Java. JavaBeans coù theå laø vieäc vaø chaïy treân moïi maùy aûo Java. Yeâu caàu toái thieåu nhaát ñeå taïo neân thaønh phaàn JavaBeans laø : coâng cuï vaø trình bieân dòch JDK 1.1 trôû leân. JavaBeans coù theå söû duïng caùc phöông thöùc get/set ñeå laùy veà 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.
Theû duøng ñeå khai baùo phaïm vi vaø ñònh danh id(identify) nhaän daïng Bean. Noù töông töï nhö khai baùo bieán ñoái töôïng trong maõ java.
Theû 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 daïng cuûa ñoái töôïng Bean trong moät phaïm vi cho tröôùc. “name” laø teân cuûa Bean coù phaân bieät chöõ hoa, thöôøng.
Scope
Thuoäc tính phaïm vi cho bieát moâi tröôøng soáng cuûa ñoái töôïng. Phaïm vi cuûa khai baùo maø thaønh phaàn Bean coù hieäu löïc bao goàm page (Bean chæ coù hieäu löïc vaø phaïm vi truy xuaát trong khai baùo noù). Request (Bean coù hieäu löïc trong moät laàn yeâu caà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
Teân ñaày ñuû cuûa lôùp Bean. Ñaây laø teân taäp tin .class sua khi ñaõ bieân dòch töø maõ nguoàn .java. teân naøy cuõng phaân bieät chöõ hoa vaø chöõ thöôøng
BeanName
Naøy ñeå tham chieáu ñeán teân cuûa Bean
Type
Thuoäc tính chæ ra loaïi bieán kòch baûn. Neáu bieán naøy khoâng chæ roõ giaù trò cuûa noù seõ laø giaù trò cuûa thuoäc tính lôùp
2.6.2.2.
Theû duøng ñeå gaùn giaù trò vaøo thuoäc tính Bean. Thuoäc tính teân cuûa Bean chæ ñònh cho ñoái töôïng phaûi ñöôïc ñònh nghóa vaø naèm trong phaïm vi cho pheùp.
Cuù phaùp cuûa
Trong cuù phaùp treân, name cho bieát teâ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 teân cuûa Bean, teân naøy ñaõ ñöôïc ñònh nghóa bôûi theû
Property
Thuoäc tính cuûa Bean caàn laáy giaù trò
Param
Tham soá caà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.
Theû 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û nhö sau:
Thuoäc tính
Dieãn giaûi
Name
Thuoäc tính trình baøy teân cuûa Bean, teân naøy ñaõ ñöôïc khai baùo vaø ñònh nghóa bôûi theû
Property
Thuoäc tính cuûa Bean caàn laáy giaù trò
2.6.3.Theâm JAVABEANS vaøo JSP
Ñeå söû duïng JavaBeans trong trang JSP, baïn caàn khai baùo Bean vôùi theû:
PHAÀN 2 : XAÂY DÖÏNG ÖÙNG DUÏNG
CHÖÔNG 1 PHAÂN TÍCH BAØI TOAÙN
1.1.TEÂN ÑEÀ TAØI
Tìm hieåu xaây döïng öùng duïng thö ñieän töû
1.2.DEÀ CÖÔNG CHI TIEÁT
1.2.1.Khaûo saùt
Trong thôøi gian thöïc taäp toát nghieäp toâi ñaõ khaûo saùt, tìm hieåu heä thoáng thö tín ñieän töû. Quaù trình xaây döïng moät öùng duïng thö ñieän töû (Email) raát ña daïng nhöng chuû yeáu taäp trung vaøo hai phaàn:
- Xaây döïng mail server : laø chöông trình hoaït ñoäng phía maùy chuû nhaän, löu tröõ mail, phaâ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.
- Xaây döïng mail client : laø chöông trình hoaï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û veà vaø hieån thò cho ngöôøi duøng xem noäi dung mail. Ví duï nhö Outlook Express cuûa Windows hay Web mail treân Internet laø nhöõng trình ñoùng vai troø mail client.
1.2.2.Yeâu caàu cuûa baøi toaùn
Yeâu caàu chính cuûa baøi toaùn
- Phaà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 thoâng qua trình duyeät Web vôùi giao thöùc HTTP cuûa Internet.
- Phaà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 leân (SMTP Server), löu tröõ mail trong thö muïc nhaát ñònh cho pheùp ngöôøi duøng söû duïng giao thöùc POP3 ñoïc mail (POP3 Server), chuyeån mail ñeán maùy chuû khaùc (Forward Server) hoaëc phaâ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 :
- Phaàn mail client :
+ Thoâng tin ñaêng kyù cuûa ngöôøi duøng
- Phaàn mail server :
+ Mail do trình khaùch göûi leân
+ Thoâng tin veà vò trí thö muïc löu tröõ mail treân server
* Döõ lieäu ra :
- Phaàn mail client :
+ Thoâng tin veà taøi khoaûn thö ñieän töû cuûa ngöôøi duøng.
+ Thö muïc töông öùng vôùi teân taøi khoaûn, thoâng tin veà user name vaø password ñeå duøng cho vieäc POP3 Server chöùng thöïc quyeàn truy caäp cuûa ngöôøi duøng khi caàn ñoïc mail
- Phaàn mail server :
+ Löu tröõ mail do trình khaùch göûi ñeán
+ Chuyeån tieáp nhöõng mail khoâng thuoäc domain mail do mail server quaûn lyù.
1.2.4. Chöùc naêng cuûa heä thoáng thoâng tin quaûn lyù
* Quaûn lyù toaøn boä thoâng tin lieân quan ñeán user nhö: hoï, teân, ngaøy thaùng naêm sinh, ngheà nghieäp, giôùi tính, quoác gia, thaønh phoá…
* Quaûn lyù soå ñòa chæ
1.3. LYÙ DO CHOÏN ÑEÀ TAØI
Ngaøy nay ñoái vôùi moãi chuùng ta thö ñieän töû khoâng coù gì xa laï tuy nhieân ñoù laø ñöùng veà 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 caïnh nhaø thieát keá neân toâi ñaõ quyeát ñònh choïn ñeà taøi xaây döïng öùng duïng thö ñieän töû theo moâ hình Client Server.
CHÖÔNG 2 : THIEÁT KEÁ VAØ CAØI ÑAËT ÖÙNG DUÏNG
2.1.PHAÂN TÍCH VAØ THEÁT KEÁ CÔ SÔÛ DÖÕ LIEÄU
2.1.1.Phaân tích
Cô sôû döõ lieäu ñöôïc thieát keá ñôn giaûn vaø duøng vaøo muïc ñích quaûn lyù danh saùch thaønh vieân ñaêng kyù söû duïng dòch vuï thö ñieän töû cuûa vietmail.
Vôùi muïc ñích ñoù CSDL chæ bao goàm hai thöïc theå chính laø ñöôïc theå hieän trong baûng sau :
STT
Teân thöïc theå
Thuoäc tính
1
members
(thaønh vieân)
userid (maõ thaønh vieân ), user_name (teân ñaêng nhaäp), password (maät khaåu), question (caâu hoûi), answer (caâu traû lôøi), ho (hoï), ten (teâ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á khoâng thuoäc Vieät Nam), job (ngheà nghieäp), thong_tin_khac (thoâng tin phuï khaùc),
date(ngaøy ñaêng kyù)
2
addressbook
(Soå ñòa chhæ)
addressid (maõ soå ñòa chæ), userid (maõ thaønh vieân), quickname (teân gôïi nhôù), ho (hoï), ten (teân), email (ñòa chæ email), phone (soá ñieän thoaïi), diachi (ñòa chæ)
CAÙC LÖÔÏC ÑOÀ QUAN HEÄ
Töø nhöõng thöïc theå vaø thöïc theå trung gian treân, baèng caùc nguyeân taéc bieán ñoåi, ta xaây döïng thaønh caùc löôïc ñoà 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 ñoà quan heä döõ lieäu
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
Phaân tích chöùc naêng
Sô ñoà bieåu dieãn chöùc naêng cuûa heä thoáng
Heä thoáng quaûn lyù thaønh vieân cuûa vietmail
Ñaêng kyù thaønh vieân
Quaûn lyù soå ñòa chæ
2.1.2. Giaûi thích caùc chöùc naêng cuûa heä thoáng
- chöùc naêng : Ñaêng kyù thaønh vieân
yù nghóa : thu thaäp caùc thoâng tin cuûa thaønh vieân nhaèm muïc ñích quaûn lyù cuõng nhö thieát laäp caùc thoâng soá phuïc vuï cho vieäc gôûi vaø nhaän thö ñieän töû cuûa thaønh vieân
- chöùc naêng : Quaûn lyù soå ñòa chæ
yù nghóa : taïo moät danh saùch boa goàm caùc ñòa chæ do thaønh vieân töï taïo rong quaù trình söû duïng heä thoáng.
2.1.3.bieåu ñoà luoàng döõ lieäu( DFD – Data flow Diagram)
.Bieåu ñoà luoàng döõ lieâïu möùc khung caûnh (BFD)
Yeâu caàu
Thaønh vieân
Ñaêng kyù
Thoâng baùo
Heä thoáng vietmail
2.1.4. THIEÁT KEÁ HEÄ THOÁ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ù ngoaïi (Foreign Key)
Baûng döõ lieäu: Member ( Thaønh vieân)
Teâ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
Teâ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_khac
text
16
date
datetime
8
Not Null
Baûngdöõ lieäu : Addresbook (soå ñòa chæ)
Teâ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
phone
text
diachi
text
2.2. CAØI ÑAËT MAILSERVER
2.2.1.Phöông aùn toå chöùc löu tröõ mail treân Server
Ñeå löu tröõ mail göûi ñeán treân server, moãi trình mailserver seõ coù moät phöông aùn rieâng ñeå löu tröõ. Chaúng haïn coù theå löu tröõ thoâ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 phaân caùch moãi thoâng ñieäp baèng moät daáu hieäu ñaëc tröng naøo ñoù. Tuy nhieân vieäc löu thoâng ñieäp mail döôùi daïng caùc file trong töøng thö muïc töông öùng cuûa caùc User toû ra ñôn giaûn hôn vaø cuõng khoâng keùm phaàn hieäu quaû. Vì vaäy trong ñoà aùn naøy toâi quyeát ñònh choïn phöông aùn löu thoâng ñieäp mail döôùi daïng taäp tin treân ñóa cuïc boä. Tröôùc khi caøi ñaët caùc ñôn theå Mail server ta caàn toå chöùc thö muïc ñeå SMTP server löu tröõ mail nhö sau:
Hình : Toå chöùc thö muïc löu tröõ mail
Moãi mailserver coù theå coù nhieàu teân domain cho ñòa chæ mail, caùc teân domain naøy ñöôïc toå chöùc trong 1 thö muïc, ôû ñaây ta choïn vietmail.com laø teâ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ù daïng nhö sau username@vietmail.com. Heä thoáng mail server coøn cho pheùp môû roäng theâm vaøo caùc domain mail khaùc. Danh saùch caùc teân domain main naèm trong file domain.txt.
Trong thö muïc email\data\vietmail.com chöùa danh saùch caùc thö muïc con ñaïi dieän cho töøng taøi khoaûn (nhö thanhboeing, xuanthu…). Thoâ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 ngoân ngöõ java vaø bao goàm caùc phaà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. Xaây döïng SMTP Server
Nhieäm vuïchính cuûa SMTP Server laø söû lyù taäp leänh SMTP, traû laïi maõ loãi do trình khaùch gôûi leân khoâng hôïp leä. Tieáp nhaän döõ lieäu vaø löu vaøo thö muï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 treâ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 phaân tích caùc leänh SMTP vaø nhaän mail do trình khaùch gôûi leâ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 voâ 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");
//Phaâ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 phaân tích caùc leänh SMTP, nhaän mail vaø löu vaø thö muï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æ khoâng thuoäc domain do mailserver quaûn lyù seõ ñöôïc löu vaø thö muï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ö muï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 thoâng ñieäp
String messageId = Server.storage.saveMessage(users, data);
// Thoâng baùo cho trình khaùch thoâ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:");
return false;
}
returnPath = arguments.nextToken();
System.out.println(returnPath+" "+returnPath.length());
if (returnPath.length() < 5) {
out.println("503 Syntax: MAIL FROM:");
return false;
}
if (!returnPath.substring(0, 5).equalsIgnoreCase("FROM:")) {
out.println("503 Syntax: MAIL FROM:");
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 (command.equalsIgnoreCase("DATA")) {
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:");
return;
}
String arg = arguments.nextToken();
if (!arg.substring(0, 3).equalsIgnoreCase("TO:")) {
out.println("501 Syntax: RCPT TO:");
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: khoâ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);//khoâng coù khoaûng traéng
}
System.out.println("Receipt address :"+address);
// Thoâng thöôøng ñòa chæ mail ñöôïc gôûi theo daïng
if (address.substring(0, 1).equals(""))
address = address.substring(1, address.length() - 1);
// Laáy veà thoâ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 khoâng toàn taïi
if (user == null) {
out.println("550 User " + address + " is not known");
return;
}
// Ñöa user vaøo danh saùch phaân phoái mail
users.addElement(user);
// Traû veà maõ loãi thaønh coâ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 lieân tuï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();
// Loaïi boû keát noái trong danh saùch SMTPServer
server.removeConnection(this);
}
}
Chöông trình Server.java döôùi ñaây ñöôïc duøng ñeå ñoïc file caáu hình email.properties, khôûi taïo SMTPServer. Server.java cuõng laøm nhieäm vuï khôûi taïo trình chuû POPServer. Trình Server.java ñöôïc caøi ñaët nhö sau:
Server.java
import java.io.*;
import java.util.*;
public class Server {
public static Properties properties;
public static SMTPServer smtp;
public static EmailStorage storage;
public static POPServer pop;
public static String getAddress() {
String address = properties.getProperty("server.address");
if (address == null)
address = "UNKNOWN[server.address]";
return address;
}
protected static boolean getProperties() {
try {
String fileName = "email.properties";
// Kieåm tra söï toàn taïi cuûa file caáu hình email.properties
File file = new File(fileName);
if (!file.exists()) {
fileName = file.getAbsolutePath();
System.out.println("Specified properties file '" + file.getAbsolutePath() + "' does not exist!");
return false;
}
// Ñoïc caùc thoâng tin caáu hình
properties = new Properties();
FileInputStream in = new FileInputStream(file);
properties.load(in);
in.close();
} catch (Exception e) {
System.out.println(e);
return false;
}
System.getProperties().put("line.separator", "\r\n");
return true;
}
/**
* Chöông trình chính
*/
public static void main(String[] args) {
if (!getProperties()) {
System.err.println("Could not get properties!");
return;
}
System.out.println(Server.properties.getProperty("smtp.port"));
// Thieát laäp nôi löu tröõ mail
if (!setupStorage()) {
System.out.println("Could not setup storage!");
return;
}
// Khôûi taïo SMTP server
if (!startSMTPServer()) {
System.err.println("Could not start SMTP server!");
return;
}
// Khôûi taïo POP server
if (!startPOPServer()) {
System.err.println("Could not start POP server!");
return;
}
}
/**
*Phöông thöùc khôûi taïo nôi löu tröõ mail
*/
public static boolean setupStorage() {
String className = properties.getProperty("storage.class");
if (className == null || className.length() == 0) {
System.err.println("No storage class specified in property 'storage.class'!");
return false;
}
Class c = null;
try {
c = Class.forName(className);
} catch (ClassNotFoundException e) {
System.err.println("Class '" + className + "' not found! (check CLASSPATH)");
e.printStackTrace(System.err);
return false;
}
// Taïo theå hieän cuûa lôùp
try {
storage = (EmailStorage)c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace(System.err);
return false;
} catch (IllegalAccessException e) {
e.printStackTrace(System.err);
return false;
}
return storage.init();
}
/**
* Khôûi taïo POP server.
*/
protected static boolean startPOPServer() {
try {
pop = new POPServer();
pop.setDaemon(false);
pop.start();
} catch (Exception e) {
e.printStackTrace(System.err);
return false;
}
return true;
}
/**
* Khôûi taïo SMTP server.
*/
protected static boolean startSMTPServer() {
try {
smtp = new SMTPServer();
smtp.setDaemon(false);
smtp.start();
} catch (Exception e) {
e.printStackTrace(System.err);
return false;
}
return true;
}
}
2.2.2.2. Xaây döïng POP3 Server
Trình POP3 Server goàm hai phaàn, phaàn POPServer chòu traùch nhieäm môû socket vaø laéng nghe keát noái töø trình khaùch gôûi leân theo coång 110 (coång maëc ñònh cuûa giao thöùc POP3). Khi nhaän ñöôïc keát noái, POPServer yeâu caàu lôùp POÂPCnnection phaân tích caùc leänh cuûa giao thöùc POP3 vaø gôûi mail veà cho trình khaùch. Lôùp POP3 ñöôïc caøi ñaët nhö sau:
POPServer.java
import java.io.*;
import java.net.*;
import java.util.*;
public class POPServer extends Thread {
public Vector connections;
public Boolean stopRequested;
protected ServerSocket listenSocket;
public POPServer() throws Exception {
int port = 0;
String portString = null;
// Laáy soù hieäu coång töø file caáu hình
try {
portString = Server.properties.getProperty("pop.port");
port = Integer.parseInt(portString);
} catch (NumberFormatException e) {
throw new Exception("Invalid 'pop.port' - " + portString);
}
// Laéng nghe treân socket söï keát noái töø trình khaùch
listenSocket = new ServerSocket(port);
// Taïo maûng chöùa danh saùch caùc keát noái
connections = new Vector(10, 10);
}
public void removeConnection(POPConnection connection) {
}
/**
* Xöû lyù keát noái
*/
public void run() {
// Laëp voâ taän cho ñeán khi coù yeâu caàu döøng
stopRequested = new Boolean(false);
while (true) {
synchronized (stopRequested) {
if (stopRequested.booleanValue())
break;
}
// Chaáp nhaän keát noái do trình khaùch gôûi leân
try {
Socket s = listenSocket.accept();
//Yeâu caàu lôùp POPConnection xöû lyù giao thöùc phuïc vuï trình khaùch
POPConnection connection = new POPConnection(s, this);
connections.addElement(connection);
connection.setDaemon(true);
connection.start();
} catch (IOException e) {
e.printStackTrace();
break;
}
}
// Ñoùng keát noái
try {
listenSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Lôùp POPConnection.java chòu traùch nhieäm chính trong vieäc xöû lyù caùc leänh cuûa giao thöùc POP3. Lôùp POPConnection ñöôïc caøi ñaët nhö sau :
POPConnection.java
import java.io.*;
import java.net.*;
import java.util.*;
public class POPConnection extends Thread {
protected static final int ENTER_USER = 0;
protected static final int ENTER_PASSWORD = 1;
protected static final int TRANSACTION = 2;
protected static final int UPDATE = 3;
protected POPServer server;
protected Socket socket;
protected BufferedReader in;
protected PrintStream out;
protected boolean stopRequested;
protected int state;
protected String userName;
protected User user;
protected Vector messages = null;
public POPConnection(Socket socket, POPServer server) {
super();
this.socket = socket;
this.server = server;
}
protected void close() {
try {
socket.close();
} catch (Exception e) {
System.err.println("Exception trying to close POPConnection socket!");
e.printStackTrace(System.err);
}
}
// Ñeám soá mail coù trong hoäp thö
protected int countMessages() {
if (messages == null)
return 0;
Enumeration enum = messages.elements();
int count = 0;
while (enum.hasMoreElements()) {
Message message = (Message)enum.nextElement();
if (!message.isDeleted())
count++;
}
return count;
}
/**
* Laáy noäi dung mail döïa vaøo soá thöù töï cuûa mail löu trong hoäp thö
*/
protected Message getMessage(int number) {
if (number messages.size())
return null;
Message message = (Message)messages.elementAt(number - 1);
if (message.isDeleted())
return null;
return message;
}
protected Message getMessage(String messageNumber) {
int number;
try {
number = Integer.parseInt(messageNumber);
} catch (NumberFormatException e) {
return null;
}
return getMessage(number);
}
protected long getMessagesSize() {
if (messages == null)
return 0;
Enumeration enum = messages.elements();
long size = 0;
while (enum.hasMoreElements()) {
Message message = (Message)enum.nextElement();
if (!message.isDeleted())
size += message.getSize();
}
return size;
}
protected void processDELE(StringTokenizer arguments) {
if (!arguments.hasMoreTokens()) {
out.println("-ERR must supply message number");
} else {
Message message = getMessage(arguments.nextToken());
if (message == null) {
out.println("-ERR no such message");
}
message.setDeleted(true);
out.println("+OK");
}
}
/**
* Xöû lyù leänh PASS kieåm tra password
*/
protected void processEnterPassword(String command, StringTokenizer arguments) {
if (command.equalsIgnoreCase("QUIT")) {
stopRequested = true;
out.println("+OK Signing off");
} else if (command.equalsIgnoreCase("PASS")) {
if (!arguments.hasMoreTokens()) {
out.println("-ERR must supply password");
return;
}
String password = arguments.nextToken();
if (arguments.hasMoreTokens()) {
out.println("-ERR only one argument to PASS, your password");
return;
}
// Kieåm tra quyeàn ñaêng nhaäp
user = Server.storage.login(userName, password);
if (user == null) {
out.println("-ERR invalid user or password");
state = ENTER_USER;
} else {
// user ñaõ ñaêng nhaäp – traû veà danh saùch caùc mail coù trong hoäp thö
messages = Server.storage.getMessages(user);
out.println("+OK mailbox open, " + countMessages() + " messages");
state = TRANSACTION;
}
} else {
out.println("-ERR Only use PASS or QUIT commands");
}
}
/**
* Xöû lyù leänh USER
*/
protected void processEnterUser(String command, StringTokenizer arguments) {
if (command.equalsIgnoreCase("QUIT")) {
stopRequested = true;
out.println("+OK Signing off");
return;
}
if (command.equalsIgnoreCase("USER")) {
if (!arguments.hasMoreTokens()) {
out.println("-ERR must supply user name");
return;
}
userName = arguments.nextToken();
if (arguments.hasMoreTokens()) {
out.println("-ERR only one argument to USER, the user name");
return;
}
state = ENTER_PASSWORD;
out.println("+OK use PASS command to send password");
return;
}
out.println("-ERR Only use USER or QUIT commands");
}
/**
* Xöû lyù leänh LIST
*/
protected void processLIST(StringTokenizer arguments) {
if (!arguments.hasMoreTokens()) {
out.println("+OK " + countMessages() + " " + getMessagesSize());
for (int i = 1; i <= messages.size(); i++) {
Message message = getMessage(i);
if (message != null) {
out.println(i + " " + message.getSize());
}
}
out.println(".");
} else {
String messageNumber = arguments.nextToken();
Message message = getMessage(messageNumber);
if (message == null) {
out.println("-ERR no such message");
} else {
out.println("+OK " + messageNumber + " " + message.getSize());
}
}
}
/**
* Xöû lyù leänh NOOP – Leänh NOOP cuûa POP3 khoâng laøm gì caû, muïc ñích chæ ñeå trình khaùch xem keát noái coøn hieäu löïc hay khoâng
*/
protected void processNOOP(StringTokenizer arguments) {
out.println("+OK");
}
/**
* Xöû lyù leänh QUIT
*/
protected void processQUIT(StringTokenizer arguments) {
Enumeration enum = messages.elements();
while (enum.hasMoreElements()) {
Message message = (Message)enum.nextElement();
if (message.isDeleted()) {
Server.storage.deleteMessage(message);
}
}
out.println("+OK Goodbye, " + user.getName());
stopRequested = true;
}
/**
* Xöû lyù leänh RETR traû veà noäi dung mail
*/
protected void processRETR(StringTokenizer arguments) {
if (!arguments.hasMoreTokens()) {
out.println("-ERR message number required, RETR 1");
} else {
String messageNumber = arguments.nextToken();
Message message = getMessage(messageNumber);
if (message == null) {
out.println("-ERR no such message");
return;
}
out.println("+OK " + message.getSize() + " octets");
// Ñoïc döõ lieäu mail
StringBuffer buffer = Server.storage.getMessageData(message);
BufferedReader reader = new BufferedReader(new StringReader(buffer.toString()));
// Ñoïc töøng doøng
boolean done = false;
try {
while (reader.ready() && (!done)) {
String line = reader.readLine();
if (line == null)
break;
// Daáu chaám keát thuùc
if (line.length() >= 1) {
if (line.substring(0, 1).equals("."))
line = "." + line;
}
// Göûi döõ lieäu veà trình khaùch
out.println(line);
}
} catch (IOException e) {
System.err.println("POPConnection.processRETR()");
e.printStackTrace(System.err);
}
try {
reader.close();
} catch (IOException e) {
System.err.println("POPConnection.processRETR() - reader.close()");
e.printStackTrace(System.err);
}
out.println(".");
}
}
/**
* Xöû lyù leänh RSET
*/
protected void processRSET(StringTokenizer arguments) {
Enumeration enum = messages.elements();
while (enum.hasMoreElements()) {
Message message = (Message)enum.nextElement();
if (message.isDeleted())
message.setDeleted(false);
}
out.println("+OK");
}
/**
* Xöû lyù leänh STAT
*/
protected void processSTAT(StringTokenizer arguments) {
out.println("+OK " + countMessages() + " " + getMessagesSize());
}
/**
* Xöû lyù leänh TOP – traû veà trình khaùch caùc mail header
*/
protected void processTOP(StringTokenizer arguments) {
if (!arguments.hasMoreTokens()) {
out.println("-ERR syntax: TOP ");
return;
}
String messageNumber = arguments.nextToken();
if (!arguments.hasMoreTokens()) {
out.println("-ERR syntax: TOP ");
return;
}
int lines = 0;
try {
lines = Integer.parseInt(arguments.nextToken());
} catch (NumberFormatException e) {
out.println("-ERR bad number of lines");
return;
}
Message message = getMessage(messageNumber);
if (message == null) {
out.println("-ERR no such message");
return;
}
out.println("+OK " + message.getSize() + " octets");
StringBuffer buffer = Server.storage.getMessageData(message);
BufferedReader reader = new BufferedReader(new StringReader(buffer.toString()));
boolean done = false;
boolean inBody = false;
int count = 0;
try {
while (reader.ready() && (!done) && (count <= lines)) {
String line = reader.readLine();
if (line == null)
break;
if (line.length() >= 1) {
if (line.substring(0, 1).equals("."))
line = "." + line;
} else {
inBody = true;
}
if (inBody) {
count++;
}
out.println(line);
}
} catch (IOException e) {
System.err.println("POPConnection.processTOP()");
e.printStackTrace(System.err);
}
try {
reader.close();
} catch (IOException e) {
System.err.println("POPConnection.processTOP() - reader.close()");
e.printStackTrace(System.err);
}
out.println(".");
}
/**
* Xöû lyù caùc leänh cuûa giao thöùc POP3
*/
protected void processTransaction(String command, StringTokenizer arguments) {
if (command.equalsIgnoreCase("STAT")) {
processSTAT(arguments);
} else if (command.equalsIgnoreCase("LIST")) {
processLIST(arguments);
} else if (command.equalsIgnoreCase("RETR")) {
processRETR(arguments);
} else if (command.equalsIgnoreCase("DELE")) {
processDELE(arguments);
} else if (command.equalsIgnoreCase("NOOP")) {
processTOP(arguments);
} else if (command.equalsIgnoreCase("TOP")) {
processTOP(arguments);
} else if (command.equalsIgnoreCase("UIDL")) {
processUIDL(arguments);
} else if (command.equalsIgnoreCase("RSET")) {
processRSET(arguments);
} else if (command.equalsIgnoreCase("QUIT")) {
processQUIT(arguments);
} else {
out.println("-ERR Unknown command " + command);
}
}
protected void processUIDL(StringTokenizer arguments) {
if (!arguments.hasMoreTokens()) {
out.println("+OK " + countMessages() + " " + getMessagesSize());
for (int i = 1; i <= messages.size(); i++) {
Message message = getMessage(i);
if (message != null) {
out.println(i + " " + message.getMessageId());
}
}
out.println(".");
} else {
String messageNumber = arguments.nextToken();
Message message = getMessage(messageNumber);
if (message == null) {
out.println("-ERR no such message");
} else {
out.println("+OK " + messageNumber + " " + message.getMessageId());
}
}
}
/**
* Nhaän keát noái vaø caùc leänh POP3 göûi leân töø trình khaùch
*/
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;
}
if (server == null) {
System.err.println("SERVER NOT SET!!!");
return;
}
stopRequested = false;
state = ENTER_USER;
out.println("+OK POP3 " + Server.getAddress());
while (!stopRequested) {
try {
String line = in.readLine();
if (line == null)
break;
StringTokenizer tokenizer = new StringTokenizer(line);
String command = "";
if (tokenizer.hasMoreTokens())
command = tokenizer.nextToken();
// Xöû lyù leänh tuyø theo traïng thaùi ñaêng nhaäp cuûa user
switch (state) {
case ENTER_USER:
processEnterUser(command, tokenizer);
break;
case ENTER_PASSWORD:
processEnterPassword(command, tokenizer);
break;
case TRANSACTION:
processTransaction(command, tokenizer);
break;
default:
out.println("-ERR invalid state! ");
System.err.println("Invalid State in POPConnection.run()");
stopRequested = true;
break;
}
} catch (Exception e) {
e.printStackTrace(System.err);
stopRequested = true;
}
}
// Ñoùng keát noái
close();
server.removeConnection(this);
}
public void setServer(POPServer server) {}
}
2.3.CAØI ÑAËT MAILCLIENT
Caáu truùc cuûa Website
Hình caáu truùc Website
Phaàn MailClient ñöôïc thieát keá döôùi daïng Web duøng Java Server Page neân ñöôïc goïi laø moät WebMail. Trang Web vaø quaù trình söû duïng mailclient coù theå ñöôïc hình dung qua sô ñoà vaø ñaëc taû ñöôùi ñaây
HomePage
Ñaêng Kyù Thaønh Vieân
Login
Help
Menumail
Inbox
AddressBook
Option
Add
Edit
Review Inf
Change Password
1.Ñaêng nhaäp heä thoáng :
Laàn ñaàu tieân söû duïng CT ñeå göûi nhaän mail, chuùng ta phaûi ñaêng kyù moät account môùi cho rieâng mình, nghóa laø chuùng ta phaûi coù moät username vaø password rieâng cho mình nhaèm phaân bieät nhöõng ngöôøi söû duïng email khaùc nhau vaø baûo maät thö cuûa töøng ngöôøi.
_ Ñaêng nhaäp username vaø password tröôùc khi vaøo heä thoáng .
Neáu laø “member”: baïn coù theå söû duïng CT göûi /nhaän thö .
Neáu laø “guest”: baïn phaûi Ñaêng kyù thaønh vieân
2.Ñaêng kyù thaønh vieân :
Cho laàn ñaàu tieân baïn ñaêng nhaäp vaøo heä thoáng , ghi caùc thoâng tin caù nhaân, username vaø password cuûa baïn.
3.Caùc loaïi Address Book . Ñieàu chænh thoâng tin trong Personal Address Book :
(User coù quyeàn T, X, S addressbook cuûa mình)
Caùc thoâng tin veà ñòa chæ mail cuûa caùc Client ñöôïc löu tröõ trong caùc soå ñòa chæ. Moãi ngöôøi söû duïng mail thöôøng coù moät soå ñòa chæ caù nhaân (Personal Address Book - PAB) cuûa rieâng mình vaø ñöôïc löu tröõ trong oå ñóa cuïc boä .
Caùc thoâng tin caàn thieát khi theâm moät ñòa chæ E-mail vaøo PAB:
_ RealName laø hoï teân ñaày ñuû cuûa ngöôøi coù ñòa chæ mail caàn theâm vaøo PAB
_ E-mail Address ñòa chæ E-mail chính xaùc cuûa ngöôøi caàn theâm vaøo.
Ngoaøi ra, chuùng ta coù theå theâm vaøo nhöõng ñòa chæ email khaùc, soá phone, mobile vaø ñòa chæ nhaø rieâng
4.Review Account Information:
_ User xem lai thoâng tin caù nhaân ñaõ ñaêng nhaäp vaø AddressBook cuûa mình.
_ Coù theå thay ñoåi Password (changepassword.asp) khi baïn muoán ñaët laïi moät password môùi cho mình.
5.Thay ñoåi Pass :
_ Old Password: nhaäp laïi pass hieän taïi.
_ New password: nhaäp pass môùi. Baïn coù theå söû duïng caùc kyù töï chöõ, soá vaø caû heä thoáng chaám caâu, nhöng khoâng theå söû duïng khoaûng traéng.
_ Nhaäp laïi password moät laàn nöõa. Neáu so truøng, vieäc thay ñoåi password xem nhö thaønh coâng.
INBOX
CheckMail
Upload File
Compose
Read
Reply
Delete
DownLoad
Send
Error
Ok
6.Kieåm tra thö:
Vuøng noäi dung caùc Folder seõ xuaát hieän tieâu ñeà caùc thö trong folder ñoù. Caùc thö chöa ñöôïc ñoïc thöôøng ñöôïc trình baøy khaùc vôùi thö ñaõ ñöôïc ñoïc. Thoâng thöôøng phaàn tieâu ñeàthö goàm caùc noäi dung nhö sau:
_ From: Teân ngöôøi göûi, noäi dung xuaát hieän ôû ñaây khoâng phaûi laø ñòa chæ e-mail cuûa ngöôøi göûi maø laø hoï teân cuûa ngöôøi göûi.
_ Subject : Chuû ñeà cuûa laù thö . Khi göûi thö, ngöoøi göûi thöôøng ghi moät noäi dung ngaén vaøo vuøng subject ñeå ngöôøi nhaän bieát ñöôïc muïc ñích toång quaùt cuûa laù thö tröôùc khi quyeát ñònh coù ñoïc thö hay khoâng.
_ Date : Ngaøy giôø nhaän thö
_ Size: Kích thöôùc laù thö (thöôøng tính baèng KB)
7.Ñoïc thö :
Taát caû thö cuûa baïn ñöôïc lieät keâ trong moät baûng trong Inbox vôùi moãi haøng laø moät thö. Ñeå xem noäi dung thö caàn click vaøo vuøng tieâu ñeà cuûa thö. Trong vuøng noäi dung thö, caùc thoâng tin cuûa ngöoøi göûi seõ ñöôïc theå hieän cuøng noäi dung laù thö . Caùc thoâng tin ngöôøi göûi bao goàm: teân ngöôøi göûi, thôøi ñieåm göûi, teân ngöôøi nhaän
Muoán ñoïc email naøo, click vaøo coät From töông öùng. Sau khi ñoïc xong, ñeå ñoïc thö khaùc, click vaøo Inbox hay click vaøo nuùt Back cuûa Internet Explorer.
_ Sau khi ñoïc xong thö ,Delete neáu muoán xoùa thö.
_ Reply neáu muoán traû lôøi thö
_ Download attach file neáu thö coù göûi file keøm theo .
8.Vieát email trong WebMail:
Chuùng ta coù hai tröôøng hôïp:
Neáu baïn ñang ñoïc moät thö naøo ñoù, baïn muoán traû lôøi thö ñoùthì click vaøo nuùt Reply phía treân.
Neáu baïn muoán göûi thö tröïc tieáp, click vaøo nuùt Compose.
Khi muoán göûi thö cho moät ngöôøi ñaõ coù ñòa chæ trong moät AddressBook, ñaàu tieân phaûi chuaån bò noäi dung thö ñeå göûi. Phaàn tieâu ñeà cuûa moät thö caàn göûi bao goàm caùc thoâng tin sau:
_ To : Ñòa chæ email maø baïn muoán göûi tôùi.
_ Subject: moät ñoaïn text ngaén cho bieát muïc ñích cuûa noäi dung thö caàn göûi. Ñoaïn text naøy giuùp cho ngöôøi ñoïc thö quyeát ñònh coù neân xem noäi dung cuûa thö hay khoâng.
_ Attachments gôûi keøm taäp tin cho nguöôøi nhaän.
_ Noäi dung soaïn trong comment
_ Sau khi soaïn thaûo noäi dung thö xong, nhaán nuùt Send ñeå thö ñöôïc caát vaøo Outbox. Nghóa laø, thö khoâng ñöôïc truyeàn ñi ngay, do ñoù chuùng ta coù theå soaïn thaûo nhieàu thö tröôùc khi keát noái vôùi Mail Server ñeå göûi ñi.
Khi thö ñaõ ñöa vaøo Outbox, moïi chænh söûa tieáp theo thöôøng laøm thö khoâng göûi ñi ñöôïc nöõa. Tröôøng hôïp naøy caàn phaûi soaïn thaûo moät laù thö khaùc ñeå göûi ñi vaø xoùa boû laù thö cuõ.
9.Göûi keøm file theo Mail (attach file)
Trong moät soá tröôøng hôïp caàn ñöa theâm toaøn boä noäi dung moät taäp tin ñang coù saün treân ñóa cuïc boä vaøo thö ñeå göûi ñeán ngöoøi nhaän. Coâng vieäc naøy ñöôïc goïi laø Attach file vaøo thö.
Caàn chuù yù raèng vieäc attach moät taäp tin vaøo mail caàn phaûi ñöôïc thöïc hieän ñoàng boä giöõa ngöôøi göûi , ngöôøi nhaän vaø ñöôøng truyeàn thö.Neáu khoâng coù söï ñoàng boä, noäi dung cuûa taäp tin ñöôïc attach coù ngöôøi nhaän khoâng ñoïc ñöôïc. Lyù do cuûa vieäc naøy laø do noäi dung cuûa taäp tin ñöôïc attach seõ ñöôïc maõ hoaù theo UUENCODE hay theo MIME (Multipurpose Internet Mail Extensions).
Thoâng thöôøng ñeå giaûm thôøi gian truyeàn thö, caùc taäp tin caàn attach vaøo thö seõ ñöôïc neùn tröôùc khi thöïc hieän thao taùc attach. Caùch neùn thoâng duïng laø ZIP.
Caùc taäp tin ñöôïc göûi keøm coù theå löu thaønh moät taäp tin rieâng trong ñiaõ cuïc boä cuûa ngöôøi söû duïng. Thoâng thöôøng dung löôïng taäp tin göûi keøm khoâng neân quaù 1MB, neáu lôùn hôn ta caàn taùch ra göûi noù trong nhieàu thö.
10. Download / Upload file
Moät soá giao dieän chính
Trang ñaêng nhaäp cuûa vietmail
Menu chính
TAØI LIEÄU THAM KHAÛO
Phaân tích, thieát keá vaø caøi ñaët heä thoáng thoâng tin quaûn lyù
- Hieäu ñính: GS. Baïch Höng Khang
Cô sôû döõ lieäu quan heä - Leâ Taán Vöông
System Administrator for Microsoft SQL Serever 7.0 workbook
Microsoft SQL Server 7.0 Database Implementation Training Kit
Microsoft SQL Server hoaïch ñònh vaø xaây döïng cô sôû döõ lieäu cao caáp
Allaire JRUN Developer Documentation
Enterprise JavaBeans – Tom Valesky
Enterprise JavaBeans by Example – Henri Jubin, Jurgen Friendichs
HTML by Example – Todd Stauffer
Special Edition Using HTML 4 – Jerry Honeycutt
Special Edition Using JavaScript – Mark C. Reynolds
Java by Example – Clayton Walnum
Laäp trình Java theá naøo? – Hoaøng Ngoïc Giao
Java laäp trình maïng – Nguyeãn Phöông Lan, Hoaøng Ñöùc Haûi
Caùc taøi lieäu veà JSP/EJB taïi website: