Pull mail là cơ chế nhận mail bằng cách: Client sẽ gởi thông điệp cho server, client có thể biết được server có mail mới hay không. Nếu có mail mới, client sẽ nhận mail mới này về client cho người dùng sử dụng.
Chương 5: Push E-mail và Pull E-mail
69
Thông thường Pull mail được thực hiện trong 1 khoảng thời gian nhất định. Không liên tục như Push mail. Pull mail có thể khắc phục tình trạng này bằng cách gởi thông điệp liên tục cho server. Nhưng việc này chỉ thuận lợi khi đường truyền tốt và kết nối giữa client và server bền vững.
Nếu kết nối giữa Server và client không bền vững, hoặc có sự cố về đường truyền. Client có thể bị timeout và không thể nhận được mail mới từ server. Thông thường người ta khắc phục bằng cách dừng một khoảng thời gian giữa những lần pull mail.
Chương 6: các kĩ thuật xử lý trong ứng dụng
70
PHẦN 3: XÂY DỰNG ỨNG DỤNG GỬI NHẬN E-MAIL
Chương 6: Các kĩ thuật xử lí trong ứng dụng 6.1 Các giải pháp về vấn đề nhận e-mail:
Trong ứng dụng mail, việc nhận mail có thể được thực hiện thông qua 2 giao thức POP3 và IMAP, với các đặc điểm khác nhau của 2 giao thức này mà ta có 2 cách thức nhận mail cũng khác nhau:
6.1.1 Nhận mail với giao thức POP3:
Nhận xét:
Như đã đề cập ở trên, giao thức POP3 hỗ trợ ít lệnh do đó có nhiều hạn chế trong việc nhận mail. Cụ thể, POP3 không có lệnh nào để nhận biết được cấu trúc MIME của một e-mail và cũng không hỗ trợ khả năng tải một phần dữ liệu trong cấu trúc của mail về client. Do đó, khi làm việc với POP3, nếu muốn đọc nội dung của một mail, ta buộc phải tải toàn bộ nội dung của mail đó về. Điều này dẫn đến trường hợp phải tải luôn nội dung của các tập tin kèm theo mail đó. Nếu kích thước những tập tin này lớn và người dùng chỉ quan tâm đến nội dung của mail thì cũng không có cách nào cải thiện được quá trình nhận mail.
Hướng giải quyết:
Nhận về thông tin tóm tắt của message:
Lệnh TOP trong POP3 cho phép nhận về toàn bộ phần header của mail và N dòng phần nội dung bên trong.
Nếu ta cho tham số N này có giá trị là 0 thì dữ liệu nhận về chỉ là nội dung phần header.
TOP <số thứ tự message> 0
Nhờ vậy ta có thể sử dụng cách này để lấy về thông tin người gửi, tiêu đề đề hiển thị trong danh sách các email mà không phải tải toàn bộ nội dung của từng mail.
Nhận về toàn bộ message:
Lệnh RETR trả về toàn bộ nội dung của message, bao gồm nội dung của các attachment. Nếu kích thước attachment này lớn, nếu bộ nhớ của thiết bị không đủ lớn có thể sẽ gây ra lỗi chương trình. Vấn đề đặt ra là có cách nào cải thiện vấn để này.
Hướng giải quyết được đề nghị là xây dựng hàm nhận dữ liệu đặc biệt. Khi nhận từng dòng dữ liệu trả về, ta kiểm tra để nhận biết đó là một attachment hay không. Ta sẽ lưu nội dung attachment này xuống một file tạm và thay nội dung của part tương ứng bằng định danh của file tạm này. Với cách giải quyết này, kích thước của một message lưu trong bộ nhớ chương trình sẽ không lớn và giải quyết được vấn đề trên.
Chương 6: các kĩ thuật xử lý trong ứng dụng
71
Tuy nhiên, các dòng máy BlackBerry hiện nay có không gian bộ nhớ khá lớn, có thể lưu trữ được hầu hết các kích thước mà các server mail có thể hỗ trợ hiện nay, do đó ta có thể bỏ qua vấn đề này khi xây dựng ứng dụng.
6.1.2 Nhận mail với giao thức IMAP:
Nhận xét:
Với IMAP, tập hợp các lệnh nhiều hơn giúp ta có thể xác định được cấu trúc MIME của mail, cũng như tải về nội dung một phần trong cấu trúc đó. Việc nhận mail trở nên nhanh hơn so với giao thức POP3.
Hướng giải quyết:
Ta xây dựng nhận mail bằng IMAP theo hướng sau:
Nhận về header của mai để hiển thị trong danh sách: Lệnh FETCH cho phép ta tải về nội dung của một mail theo từng phần (address). Khi giá trị address là
HEADER thì nội dung tải về là toàn bộ phần header của mail đó.
FETCH <số thứ tự message> BODY[HEADER]
Nhận về nội dung của mail mà không kèm theo nội dung của các tập tin đính kèm:
Đấu tiên ta lấy về thông tin cấu trúc MIME bằng cách sử dụng lệnh:
FETCH <số thứ tự message> (BODYSTRUCTURE)
Tiếp theo, ta sẽ tiến hành tự đóng gói một message tương tự như khi lấy toàn bộ thông tin của mail. Để làm được điều này ta sẽ duyệt qua cấu trúc MIME vừa nhận được, ta có thể biết được phần nào trong cấu trúc này là attachment cùng với thông tin tên tập tin đó. Bằng cách này ta sẽ lần lượt tải nội dung từng phần và gắn vào mail, nếu phát hiện phần chuẩn bị gắn vào thì ta sẽ bỏ qua không tải nội dung về, thay vào đó ta sẽ ghi thông tin có cấu trúc sau:
Attachment(1)(2)(3)[4]
Trong đó:
(1): loại của phần dữ liệu đó (2): phần mở rộng cụ thể (3): dạng encode của dữ liệu
(4): địa chỉ của phần đó trong cấu trúc MIME
6.1.3 Hiển thị nội dung một e-mail:
Mail được hiển thị luôn có cấu trúc MIME với nhiều phần (MultiPart). Các loại part có thể là Image, Audio, Video, Application, Text hoặc là một MultiPart khác. Với 2 giao thức POP3 và IMAP tùy có cách nhận dữ liệu khác nhau, song kết quả trả
Chương 6: các kĩ thuật xử lý trong ứng dụng
72
về cuối cùng vẫn là một cấu trúc dạng Message chung và có cách thức hiển thị như nhau:
Hiển thị thông tin chính:
Ta sẽ duyệt qua lần lượt tất cả các part trong message, nếu part đang xét không phải là một attachment (thường là kiểu TEXT) ta sẽ gắn thêm một field thông tin lên màn hình. Các đời máy BlackBerry hiện nay sử OS 5.0 có hỗ trợ BrowserField do đó trong phần xử lí hiển thị thông tin ta cũng kiểm tra xem nếu là multipart dạng
alternative và có part dạng text/html thì ta ưu tiên hiển thị dạng HTML cho người dùng.
Với các part là attachment thì ta có cách xử lí để lưu thông tin attachment này. Lưu tạm các attachment trong e-mail:
Trong mỗi màn hình hiển thị message, ta sẽ tạo một bảng lưu trữ thông tin các attachment, với key là tên của attachment và value là nội dung của attachment (POP3) hoặc định danh của attachment (IMAP), giá trị định danh này sẽ bị thay thế bằng nội dung của attachment khi người dùng chọn tải attachment về máy.
Lưu attachment:
Duyệt qua tất cả các trường trong bảng thông tin attachment. Với mỗi trường, lấy thông tin tên attachment, cho phép người dùng đổi tên và chọn đường dẫn lưu file. Kiểm tra giá trị của trường, nếu là nội dung attachment thì lưu xuống file; nếu là định danh thì ta dựa vào định danh này để tải nội dung attachment về lưu xuống máy.
6.2 Các giải pháp về vấn đề gửi e-mail:
6.2.1 Gửi e-mail dạng HTML:
Đặt vấn đề:
Việc soạn thảo trên điện thoại di động có nhiều hạn chế cho nên hiện không có nhiều ứng dụng gửi mail trên thị trường hỗ trợ tính năng này. Dựa trên tư tưởng của gửi mail dạng template, ứng dụng sẽ hỗ trợ người dùng gửi mail dạng HTML. Tính năng này rất hữu ít khi người dùng muốn gửi mail kèm theo một thông tin có định dạng đặc biệt như thông tin địa chỉ, ...
Hướng giải quyết:
Cho phép người dùng chèn nội dung từ một file bên ngoài (có thể chứa các thẻ HTML). Trong giai đoạn đóng gói message để gửi đi, kiểm tra xem nội dung có định dạng HTML. Nếu có ta sẽ tạo ra một message dạng multipart/alternative và chèn part text/html vào.
Chương 6: các kĩ thuật xử lý trong ứng dụng
73
6.2.2 Gửi mail cho các địa chỉ khác nhau theo một mẫu E-mail cụ thể:
Khi người dùng sử dụng mẫu E-mail, trong quá trình gởi E-mail chương trình sẽ tự thay đổi nội dung mẫu E-mail để phù hợp với nội dung của từng địa chỉ E-mail nhận.
Hình 6.1 - Quá trình chuyển đổi mẫu E-mail khi gởi mail tới một người dùng
Người dùng có thể thêm, xóa, sửa các mẫu E-mail trong chương trình để sử dụng. Khi sử dụng một mẫu E-mail, chương trình sẽ tự phân tích cấu trúc mẫu E-mail và danh sách địa chỉ người nhận để sửa nội dung E-mail phù hợp với từng người nhận cụ thể.
6.3 Các giải pháp về vấn đề giả lập Push e-mail:
Đặt vấn đề:
Đối với nhiều người, nhu cầu nhận E-mail ngay lập tức khi có E-mail mới là một nhu cầu hết sức cần thiết. Nhất là đối với các nhà doanh nghiệp, người sử dụng sàn giao dịch chứng khoán.v.v. nhu cầu này lại càng rõ rệt.
Đối với các thiết bị hỗ trợ Push mail, nhu cầu này dễ dàng được đáp ứng. Nhưng đối với một số thiết bị không hỗ trợ Push mail, hoặc Server E-mail không hỗ trợ Push mail, giải pháp đặt ra là làm sao để có thể push mail đối với các thiết bị hay server này.
BlackBerry là một thiết bị có hỗ trợ Push E-mail mạnh mẽ và tiện dụng. Nhưng đối với một số nhà phát hành dịch vụ mạng không hỗ trợ dịch vụ Push E-mail, nhu cầu Push E-mail của người dùng sử dụng các dịch vụ mạng này vẫn rất lớn. Quan trọng là làm sao để có thể xây dựng chế độ giả lập Push E-mail một cách tiện lợi cho người dùng.
Hướng giải quyết:
Giải pháp xây dựng giả lập Push E-mail sử dụng ở đây là sử dụng Pull E-mail. Người dùng có nhu cầu lấy E-mail mới sẽ thiết lập một cấu hình E-mail cần lấy E-
Chương 6: các kĩ thuật xử lý trong ứng dụng
74
mail, thiết lập thời gian giữa những lần lấy E-mail để chương trình có thể tự động lấy E-mail và hiển thị cho người dùng.
Sau một khoảng thời gian xác định, chương trình sẽ gởi yêu cầu đến server mà cấu hình E-mail đã thiết lập từ trước. Lấy thông tin E-mail mới về và hiển thị cho người dùng. Quá trình này lặp đi lặp lại đến khi người dùng thoát chương trình hoặc không có nhu cầu sử dụng tính năng này nữa.
Hình 6.2 - Quá trình tự động nhận E-mail của chương trình
Sau một khoảng thời gian chương trình lại gởi yêu cầu tới Server để nhận thông tin về E-mail mới.
o Nếu có E-mail mới, chương trình sẽ hiển thị thông báo cho người dùng.
o Nếu người dùng chọn đọc, chương trình sẽ lấy E-mail mới về hiển thị cho người dùng và tiếp tục vòng lặp.
o Nếu người dùng chọn không, chương trình sẽ lặp lại vòng lặp nhận E-mail.
o Nếu không có E-mail mới, chương trình sẽ lặp lại vòng lặp nhận E-mail. Người dùng thiết lập cấu hình
E-mail và thời gian nhận
Chương trình áp dụng thiết lập E-mail và bắt đầu bộ đếm giờ
Chương trình gởi yêu cầu đến Server
Hiển thị thông báo E-mail mới cho người dùng
Hiển thị danh sách E- mail mới cho người dùng Người dùng chọn đọc E- mail Có E-mail mới Lặp đi lặp lại
Chương 6: các kĩ thuật xử lý trong ứng dụng
75
6.4 Các giải pháp về vấn đề xây dựng ứng dụng Push e-mail thực sự:
Pull E-mail là một giải pháp không tốt: Pull E-mail là một giải pháp cơ bản để các thiết bị email kết nối tới server và truy xuất các messages. Điểm tốt của cách này là người dùng có thể quản lý việc truy cập server, chỉ truy cập khi cần kiểm tra e-mail. Với nhu cầu tự động thông báo có e-mail mới, một cách giải quyết khác là giả lập push mail – ứng dụng sẽ kết nối tới server để kiểm tra sau những khoảng thời gian định kì. Tuy nhiên điểm hạn chế của phương pháp này là:
- Truy cập mạng thường xuyên để kiểm tra e-mail sẽ tốn nhiều tài nguyên thiết bị và tiền bạc của người dùng.
- E-mail mới nhận về thực chất không ngay lập tức như push mail, tùy thuộc vào thời gian định kì được thiết lập.
Giải pháp : IMAP IDLE
- IMAP là lựa chọn hoàn hảo để xây dựng một ứng dụng Push E-mail cho các thiết bị di động. Bằng việc sử dụng lệnh IDLE, e-mail mới sẽ được thông báo ngay lập tức.
- Cách thức hoạt động của lệnh IDLE: IMAP hoạt động trên Client sẽ phát sinh các lệnh gửi cho server, server sẽ đáp lại 2 thông tin sau:
1. Một trả lời cho yêu cầu từ Client 2. Thông tin có bất kì message nào?
Điều này có nghĩa là Client phải luôn kết nối với Server trong quá trình thực hiện lệnh. Server sẽ trả lời cho Client khi có message mới. Nhưng có những khó khăn khi thực hiện cách trên trên thiết bị di động:
1. Vấn đề timeout: Kết nối thường timeout sau 30 phút chưa kể đến việc timneout khi sử dụng cơ chế NAT Gateway. Có thể khắc phục bằng cách gửi lệnh NOOP sau khoảng 15 phút để kích hoạt lại kết nối hiện có.
2. Mất địa chỉ IP: Với các thiết bị di động IP thay đổi thường xuyên do đó kết nối cũng dễ mất đi và phải kết nối lại.
Với những khó khăn trên đã thúc đẩy đến việc xây dựng một hệ thống Push E- mail để giải quyết các khó khăn trên, đó là xây dựng một Push E-mail Server. Đó là xây dựng một server chuyên vai nhiệm vụ kết nối với các Mail Server để kiểm tra mail mới và thông báo lại cho các thiết bị di động. Việc xây dựng một hệ thống thế này tuy tốn nhiều chi phí nhưng đáp ứng tốt nhu cầu Push E-mail hiện nay.
Chương 6: các kĩ thuật xử lý trong ứng dụng
76
Hình 6.3 - Mô hình hệ thông PUSH E-MAIL.
- Xây dựng một ứng dụng server (Push Mail Server) có chức năng: Cho người dùng đăng kí tài khoản.
Cho người dùng đăng kí dịch vụ push mail bằng các tài khoản mail của các server hiện có.
Ghi chú: Việc đăng kí có thể bằng điện thoại hoặc bằng PC. Truy cập vào các mail server bằng tài khoản người dùng đăng kí. Thông báo cho client khi có mail mới.
- Xây dựng ứng dụng client có chức năng:
Truy cập vào mail server để lấy mail về. Thao tác trên các mail.
Cách thức hoạt động:
- B1: Người dùng sử dụng thiết bị di động hoặc PC truy cập vào website của hệ thống để đăng kí tài khoản người dùng. Tài khoản này dùng để đăng nhập mỗi khi Client có nhu cầu sửa đổi thông tin.
Chương 6: các kĩ thuật xử lý trong ứng dụng
77 - B2: Đăng nhập bằng tài khoản vừa đăng kí. - B3: Chọn chức năng đăng kí dịch vụ Push mail.
- B4: Nhập thông tin, thiết lập cấu hình (có thể thay đổi cấu hình) Các thông tin chính gồm:
Tài khoản mail (Yahoo, Gmail, Hotmail, ...) Thông tin mail server
Số điện thoại dùng để gửi tin nhắn báo hiệu có e-mail mới. Chế độ PUSH hiện tại (ON/OFF)
Mã pin và IMEI của máy để server quản lý. - B4: Server giao tiếp với các mail server để kiểm tra:
Với mỗi tài khoản đăng kí, nếu chế độ PUSH là ON sẽ sử dụng thông tin để đăng nhập vào mail server. Vì Push Server có tốc độ xử lý nhanh nên việc chuyển đổi và xử lý nhiều tải khoản coi như là liên tục và song song.
Dùng lệnh IDLE để kiểm tra mail mới: Lệnh IDLE của IMAP có 1 đặc điểm nổi bật là server sẽ không có trả lời cho tới khi có mail mới. (Các kĩ thuật duy trì kết nối)
Khi có mail mới, push server gửi 1 tin SMS cho số điện thoại của client