.I Phân tích chương trình ứng dụng Email System
Chúng ta xây dựng chương trình theo mô hình Client/Server như sau:
Hinh 9 Mô hình hoạt động của chương trình mail server
Postfix là các MTA (Message Transfer Agents) có nhiệm vụ chuyển các thông điệp từ nguồ đến đích. Nó sẽ lấy mail (fetch mail) từ các mail host thông qua giao thức POP3. Nội dung của email sẽ lưu ở các thư mục khác nhau trên mail server tương ứng với từng user khác nhau. Các thư mục đó gọi là mailbox. Thông qua giao diện chương trình web mail client, người dùng sẽ đọc được mail của mình. Ngoài ra để gửi một mail đến một user khác, email sẽ được forward từ mailbox thông qua
postfix đến địa chỉ người dùng đã xác định cụ thể. Để chứa các thông tin của người dùng và domain, chương trình giao tiếp với hệ quản trị cơ sở dữ liệu Apache Derby thông qua các câu truy vấn sql.
Chương trình được xây dựng dựa trên mã nguồn mở Java Email Server (JES).
JES cung cấp các lớp tiện ích cơ bản để xây dựng một chương trình mail server. Khi khởi động chương trình mail server nó sẽ lắng nghe các kết nối của các client. Nó cho phép người dùng gửi mail thông qua cổng 25 và nhận mail thông qua cổng 110.
Chương trình mail server sẽ quản lý tất cả hộp thư của người dùng. Thông qua giao diện của chương trình mail client, người dùng sẽ đăng nhập để thực hiện các chức năng đọc và gửi email.
Hinh 10 Sơ đồ use case mô tả chức năng của chương trình
Người quản trị hệ thống (admin) có các chức năng sau : - Đăng nhập (login) vào hệ thống bằng username và password - Start và stop server
- Quản lý domain : admin có thể tạo mới và xóa các domain
- Quản lý người dùng (user) tương ứng với từng domain : admin có thể tạo mới và xóa các user tương ứng với từng domain
- Admin cũng có thể thay đổi password của chính mình.
- Thoát khỏi hệ thống (logout)
Để quản lý thông tin người dùng user và thông tin của domain, chương trình sử dụng hệ quản trị cơ sở dữ liệu Apache Derby.
Xây dựng cơ sở dữ liệu :
Bảng domain_tbl : domain_id, domain_name – chứa các thông tin về tên miền (domain)
Bảng user_tbl : user_id, username, domain_id, password, name, birthday, address – chứa các thông tin về người dùng ứng với từng tên miền
Bảng default_mailbox_tbl : domain_id, user_id – mailbox mặc định Bảng user_forward_tbl : user_forward_id, user_id, forward_address
.II Xây dựng chương trình JMailServer
.II.1. Giới thiệu
Chương trình được thiết kế bằng ngôn ngữ Java của hãng Sun, hỗ trợ các giao thức SMTP, POP3, đa miền (domain),… Lưu trữ thông tin người dùng được tổ chức theo dạng chuẩn mà các mail server hiện nay được dùng là dưới dạng cây thư mục.
Thông tin về người sử dụng được lưu trữ trong hệ quan trị cơ sở dữ liệu Apache Derby. Chương trình chạy trên mọi môi trường và dùng bất kỳ một trình mail client nào để có thể gửi và nhận mail. Chương trình được viết dưới dạng đa luồng nên không ảnh hưởng đến tốc độc truy xuất, khả năng xử lý cho từng người dùng khi kết nối vào cùng một lúc. Giao diện chương trình khá thân thiện với người dùng và hoàn toàn đáp ứng một dịch vụ mail server hỗ trợ đa miền.
.II.2. Mô phỏng các giao thức trong chương trình
Chức năng Reply và Forward
Có một vấn đề cần nói đến là khi trình mail server nhận được một email mà người nhận không thuộc quyền quản lý của trình mail server đang chạy, làm cách nào để đảm bảo email đến được với người nhận? Cụ thể là với một địa chỉ email như name@yahoo.com hay name@gmail.com làm cách nào biết được địa chỉ mail server thực sự ? Chúng ta dựa vào tên domain. Mỗi mail server sẽ đăng ký với DNS server nhưng tên miền mà nó quản lý theo dạng MX record(Mail Exchange Record). Ngoài ra ta có thể dùng một mail server trung gian để chuyển mail đến đích.
+ ServerReply: là trình mail server đang chạy sẽ chuyển nội dung lá thư mà địa chỉ mail đến mà không thuộc quyền quản lý thông qua một mail server khác có hỗ trợ dịch vụ này, thông thường thì rất ít trình mail server hỗ trợ dịch vụ này. Vì việc này sẽ làm cho trình chủ bị quá tải và tính bảo mật sẽ không được an toàn. Trên mạng internet các mail server của vnn.vn có hổ trợ dịch vụ server mail trung gian này.
+ ServerForward: đây là một phương pháp tối ưu và hiệu quả nhất. Cụ thể là khi nhận được một email mà địa chỉ đến không thuộc quyền quản lý, trình mail server đang chạy sẽ phân tích xem domain mail này thuộc quyền quản lý của mail server nào và địa chỉ máy đang chạy tên gì thông qua máy server DNS cổng kết nối là 53 (DNS server lưu trữ các địa chỉ máy server đang chạy trên mạng Internet). Sau đó tiến hành gởi mail đến người nhận thông qua server mà nó đang quản lý.
Giao thức SMTP và POP3 a. Giao thức SMTP
Tiến trình giao dịch SMTP là khá phức tạp. Nó phải thực hiện chức năng như một bộ dịch và xử lý lệnh theo chuẩn giao thức SMTP. Tất cả các lệnh gửi tới đều phải trải qua quá trình phân tích để xác định chính xác yêu cầu của người sử dụng. Hệ thống sử dụng một từ điển các lệnh của SMTP để làm công việc này. Sau khi lệnh đã được xác định là hợp lệ, nó sẽ được thực hiện tuỳ theo yêu cầu của người sử dụng.
Trong toàn bộ phiên giao dịch SMTP, hệ thống sử dụng chủ yếu năm lệnh là: HELO, MAIL FROM, RCPT TO, DATA và QUIT. Các lệnh này luôn phải thực hiện theo một trình tự quy định như sau:
HELO
MAIL FROM
RCPT TO (lệnh này có thể được lập lại nhiều lần - sử dụng trong trường hợp cho nhiều người nhận).
.. . DATA
.. . (phần dữ liệu thư)
<CRLF>.<CRLF>
QUIT
Trong quá trình nhận thư từ phía mail client, hệ thống sẽ phân tích địa chỉ người nhận để xác định là người nhận cục bộ hoặc người nhận thuộc một hệ thống mail server khác. Đây là phần phức tạp nhất trong phiên giao dịch SMTP:
Nếu người nhận là cục bộ, hệ thống chỉ cần ghi nội dung thư vào hộp thư tương ứng của người sử dụng.
Nếu người nhận không thuộc mạng cục bộ, hệ thống sẽ chuyển thư cho modul SMTP sender. Phần chức năng này sẽ chịu trách nhiệm kết nối với hệ thống mail server ở xa. Nếu kết nối thành công, thư sẽ được chuyển đến mail server ở xa đó.
Trong trường hợp ngược lại, hệ thống sẽ gửi trả các thông tin phản hồi cho người sử dụng.
- Vì hệ thống được thiết kế để cung cấp dịch vụ đồng thời cho nhiều client nên để đảm bảo an toàn và tính đồng bộ trong các thao tác xử lý, mỗi lần hệ thống ghi nội dung thư vào hộp thư, nó đều thực hiện việc khoá tạm thời hộp thư để tránh tình trạng mất mát và sai sót.
- Phiên giao dịch sẽ kết thúc khi có yêu cầu ngừng phiên giao dịch từ phía client. Tất nhiên, nếu hệ thống phía máy chủ kết thúc thì tất cả các phiên giao dịch cũng sẽ kết thúc và mọi thao tác sẽ bị huỷ bỏ.
N Y N
N Y
Y
N Y
Y
N
N N
N N
Y Nhận lệnh từ
Client
HELO
N từ điển
lệnh SMTP
Y
Định danh Sender
kiểm tra lệnh
nhận được tên Domain từ Client
MAIL Y Y
Báo lỗi Ghi lại địa chỉ
người gởi
Định danh Recipient
N RCPT Y
người nhận là cục bộ
Y Ghi lại địa chỉ
người nhận
Inbox DATA Nhận dữ liệu
từ client <CRLF>
.
<CRLF>
Ghi lại nội dung thư
chuyển thư đến Server người nhận
RSET huỷ bỏ các lệnh trước đó Y
N
NOOP kiểm tra lại kết nối
QUIT kết thúc kết nối
Hinh 11 Tiến trình giao dịch SMTP
b. Giao thức POP3
AUTHORIZATION +
nhận lệnh từ Client nhận lệnh từ
Client
USER
-
-
từ điển lệnh pop3
+
kết thúc phiên giao dịch POP3 kết thúc phiên giao dịch POP3
TRANSACTION
-
- Báo lỗi kết thúc phiên giao dịch POP3 kết thúc phiên giao dịch POP3
+ liệt kê số thư và kích thước
+ Tham số ? - Liệt kê số thư và kích thước
-
+ hiện thị thư theo tham số
Báo
- lỗi Kiểm tra lệnh
- PASS - QUIT +
USER+PASS
+ Ghi lại
account
Ghi lại passwo rd
- +
+
STAT LIST
+
kiểm tra tham số
+ -
NOOP + kiểm tra lại kết
nối
+ Tham số ? -
-
+ hiển thị thư theo tham số
-
RETR
+
kiểm tra tham số
-
+ Tham số ? -
+ Gán thư với cờ xoá
-
DELE
+
kiểm tra tham số
-
RSET + chuyển về trạng
thái ban đầu QUIT + chuyển sang
UPDATE
-
Xoá những thư đã
đánh dấu kết thúc kết nối POP3 kết thúc kết nối
- POP3
Chuyển sang trạng thái TRANSACTION
+
Hinh 12 Tiến trình giao dịch POP3
Báo lỗi
Báo lỗi
Báo lỗi
Báo lỗi
Cũng giống như tiến trình giao dịch SMTP, tiến trình giao dịch POP3 cũng khá phức tạp. Nó phải thực hiện chức năng như một bộ dịch và xử lý lệnh theo chuẩn giao thức POP3. Tất cả các lệnh gửi tới đều phải trải qua quá trình phân tích để xác định chính xác yêu cầu của người sử dụng. Hệ thống sử dụng một từ điển các lệnh của POP3 để làm công việc này.
- Sau khi lệnh đã được xác định là hợp lệ, nó sẽ được thực hiện tuỳ theo yêu cầu của người sử dụng.
- Trong toàn bộ phiên giao dịch POP3, hệ thống sử dụng chủ yếu là các lệnh:
USER, PASS, STAT, LIST, RETR, DELE và QUIT. Các lệnh còn lại có thể sử dụng hoặc không. Thứ tự của các lệnh là:
⇒ USER
⇒ PASS
⇒ STAT, LIST, RETR, DELE, NOOP,..., (các lệnh này không cần theo thứ tự)
⇒ QUIT
- Mỗi lần bắt đầu phiên giao dịch, hệ thống sẽ kiểm tra các tham số người sử dụng đưa vào trong hai lệnh USER và PASS để xác định người nhận email. Nếu việc định danh thành công thì hộp thư sẽ được mở cho người sử dụng này. Đồng thời, hệ thống sẽ cấm không cho bất kỳ ai thay đổi thậm chí sử dụng hộp thư đã bị khoá.
Trong trường hợp hộp thư đã khoá, nếu có một người sử dụng nào khác cũng định mở hộp thư sẽ bị hệ thống từ chối và kết thúc luôn phiên giao dịch.
- Trong quá trình khoá hộp thư, hệ thống vẫn cho phép hộp thư của người sử dụng này nhận email gửi đến từ phía các client khác. Tuy nhiên, các email mới sẽ không được sử dụng ngay trong phiên giao dịch hiện thời. Chỉ sau khi phiên giao dịch kết thúc thì toàn bộ email mới được cập nhật vào hộp của người sử dụng.
- Trong phiên giao dịch có thao tác xoá email. Tuy nhiên chức năng này chỉ thực hiện việc đánh dấu xoá tạm thời. Trong trường hợp người sử dụng muốn khôi phục lại thì hệ thống vẫn cho phép bằng cách sử dụng lệnh RSET và đồng thời hệ tiến trình chuyển về trạng thái ban đầu (trước khi vào trạng thái AUTHORIZATION).
Trong trường hợp ngược lại, khi hệ thống đã chuyển sang trạng thái UPDATE thì mọi email đã đánh dấu sẽ bị xoá hẳn.
- Phiên giao dịch sẽ kết thúc khi có yêu cầu ngừng phiên giao dịch từ phía client hoặc trong trường hợp có lỗi như đã nêu trên. Nếu hệ thống phía mail server kết thúc thì tất cả các phiên giao dịch cũng sẽ kết thúc và mọi thao tác sẽ bị huỷ bỏ.
.II.3. Triển khai chương trình và kết quả chương trình
1. Giao diện ban đầu khi chạy chương trình Server
2. Đăng nhập(login) vào hệ thống bằng User và Password
3. Đăng nhập thành công
4. Khởi động Server(Start Server)
5. Tắt Server (Stop Server)
6. Quản lý Domain : Admin có thể tạo mới và xóa Domain
7. Quản lý người dung: Tương ứng với từng Domain, Admin có thể tạo mới và xóa các User
8. Thay đổi Password của admin
9. Thoát khỏi hệ thống: Click vào logout để thoát khỏi hệ thống
.III Xây dựng chương trình JMailClient
.III.1. Giới thiệu
Web mail là một dịch vụ mail client rất nổi tiếng và thông dụng nhất hiện nay trên Internet. Web mail được xây dựng trong chương trình cũng dựa vào những đặc tính trên. Thông thường mỗi một Web mail chỉ truy xuất và được quản lý bởi một mail
server nào đó, web mail client này được tạo ra nhằm mục đích thể hiện rõ hơn những tính năng mà chương trình mail server được thiết kế ở trên. JMailClient hỗ trợ hai giao thức gửi và nhận mail phổ biết là POP3 và SMTP, thiết kế dựa trên mô hình JSP/Servlet MVC và sử dụng JavaMail API.
.III.2. JavaMail API và mô hình MVC
JavaMail API
JavaMail là một trong những dịch vụ phổ biến của kiến trúc J2EE dùng để xây dựng các ứng dụng email cho doanh nghiệp. JavaMail cho phép chúng ta cài đặt một Mail User Agent (MUA), tương tự những ứng dụng quen thuộc như Microsoft Outlook, Pine, hay Eudora. JavaMail về cơ bản cung cấp một tập các lớp với mục đích mô hình một hệ thống mail. API cung cấp một nền tảng và các protocol độc lập để xây dựng các ứng dụng Java mail.JavaMail là một dịch vụ thống nhất cho phép thể hiện một hệ thống thư điện tử (email). Nó được thiết kế để cung cấp việc truy cập các giao thức độc lập cho việc gửi và nhận email. Tuy nhiên nó không hỗ trợ cho việc thêm, xóa hay cập nhật các tài khoản người dùng. Không có một tiêu chuẩn nào để hoàn thành các nhiệm vụ này, và mỗi hệ thống email xử lý theo nhiều cách khác nhau.
Chúng ta đã làm quen hoặc đã sử dụng qua các dịch vụ mail client khác nhau như Outlook hay Netscape.Các hệ thống mail client hiện nay cho phép bạn gửi cả văn bản lẫn HTML, hỗ trợ các kiểu chữ như in đậm, in nghiêng hay các bản mã dành cho các ngôn ngữ khác nhau, như tiếng Nhật hay tiếng Trung Quốc. JavaMail API cung cấp các lớp trừu tượng (abstract classes) và các giao diện (interfaces) có thể xây dựng một hệ thống email. Các lớp này hỗ trợ nhiều cách cài đặt khác nhau cho việc lưu trữ, định dạng cũng như cách thức truyền một email. Nhiều ứng dụng đơn giản chỉ cần thông qua các lớp này để có thể tương tác với một hệ thống tin nhắn (message).
JavaMail cung cấp các lớp nhằm xây dựng các ứng dụng mail client, tuy nhiên nó không hỗ trợ cho việc xây dựng các chức năng tương tự như một mail server. Vì vậy trước khi sử dụng một mail client bạn phải có quyền truy cập vào một mail server nào đó. JavaMail API bao gồm các lớp con cụ thể được cài đặt phần lớn các giao thức email rộng rãi trên Internet, ví dụ như IMAP (Internet Message Access Protocol), POP (Post Office Protocol) và SMTP (Simple Mail Transfer Protocol).
Kiến trúc của JavaMail
JavaMail được thiết kế cung cấp các tiêu chuẩn cho việc truy cập đến các dịch vụ email khác nhau. Kiến trúc của JavaMail về cơ bản cung cấp các giao thức độc lập cho việc gửi và nhận email. Cơ chế trừu tượng của JavaMail tương tự như kiến trúc của J2EE APIs, như JDBC, JNDI và JMS. Chúng được chia thành hai phần cơ bản:
các ứng dụng độc lập và các dịch vụ độc lập.
Giao diện lập trình ứng dụng (API) : các lớp API được sử dụng bởi các thành phần ứng dụng (application component) cho việc gửi và nhận email, độc lập với các nhà cung cấp bên dưới và các protocol được sử dụng.
Giao diện cung cấp dịch vụ (SPI): ví dụ như SMPT, POP, IMAP.
Kiến trúc JavaMail API
JavaMail API bao gồm các interfaces và classes dùng để gửi, đọc và xóa các email. Gói mail.jar là ứng dụng hỗ trợ việc đọc và gửi mail thông qua các lớp có sẵn trong gói tin.Gói activation.jar xử lý các biến cố liên quan đến mail như khi đọc mail thì gói này làm nhiệm vụ phân tích mail đó có file đính kèm không hay mail được định dạng theo kiểu nào trước khi được gửi đi. Ngoài ra còn có nhiều tính năng khác tùy theo mục đích sử dụng trong chương trình.
JSP/Servlet và mô hình MVC
Phương pháp thiết kế MVC bắt đầu từ việc phát triển giao diện với người sử dụng (user interface) trong ngôn ngữ lập trình Smalltalk, và là một trong những phương pháp thiết kế thành công nhất trong các phương pháp thiết kế hướng đối tượng (Object Oriented Design Pattern).Hiện nay, MVC được dùng một cách rộng rãi trong nhiều hệ thống phần mềm hướng đối tượng (OO Application), bất kể được viết bằng ngôn ngữ hướng đối tượng (OO Language) nào.
MVC (Model-View-Controller) là phương pháp thiết kế MVC (MVC Design Pattern)với đặc điểm chia nhỏ Presentation tier của một ứng dụng nhiều lớp (multi- tier application) hoặc chia nhỏ phần giao diện với người dùng (user interface) của một ứng dụng bất kỳ thành ba thành phần chính là Model, View và Controller. Model (phần mô hình đúng như tên gọi của nó), là một đối tượng hoặc một tập hợp các đối