Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
904,72 KB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO ĐỒ ÁN CƠ SỞ NGÀNH MẠNG PHẦN I: NGUYÊN LÝ HỆ ĐIỀU HÀNH ĐỀ TÀI : Kỹ thuật lập trình Hook Xây dựng ứng dụng bắt phím Keylogger PHẦN II: LẬP TRÌNH MẠNG ĐỀ TÀI : Xây dựng ứng dụng quản lý thu chi SVTH: HỒ NGUYỄN TRÚC VY MSSV: 102140201 LỚP: 14TCLC1 NHÓM: 14 CBHD: PGS.TS NGUYỄN TẤN KHÔI Đà Nẵng, tháng 12/2018 LỜI MỞ ĐẦU Thông qua môn đồ án lần này, cách vận dụng kiến thức lý thuyết học cộng với hướng dẫn GVHD tự tìm tịi tham khảo để cụ thể kiến thức thành sản phẩm, với sinh viên ngành Cơng Nghệ Thông Tin năm thứ năm chúng em đồ án Cơ sở ngành mạng đồ án quan trọng Đồ án gồm hai phần Hệ Điều Hành phần Mạng Để hoàn thành đồ án lần em xin gửi lời cảm ơn đến giúp đỡ thầy cô khoa, đặc biệt Thầy Nguyễn Tấn Khôi – người trực tiếp hướng dẫn em thực hiện, cảm ơn tận tình bảo giải đáp thắc mắc thầy Xin chân thành cảm ơn ! Đà Nẵng, tháng 12 năm 2018 Sinh viên Hồ Nguyễn Trúc Vy NHẬN XÉT CỦA GIẢNG VIÊN PHẦN I: NGUYÊN LÝ HỆ ĐIỀU HÀNH Tìm hiểu kỹ thuật lập trình Hook Xây dựng ứng dụng bắt phím Keylogger GIỚI THIỆU TỔNG QUAN ĐỀ TÀI Nội dung đề tài Sử dụng kỹ thuật Hook để nhận bắt bàn phím người dùng thực thao tác gõ bàn phím Khi người dùng gõ vào phím bàn phím, phím lưu lại vào file Mục tiêu Tìm hiểu chế hoạt động kỹ thuật Hook, áp dụng kỹ thuật vào trường hợp cần thiết xây dựng ứng dụng Môi trường áp dụng Chương trình mơ viết ngơn ngữ C# chạy hệ điều hành windows để thấy chế hoạt động CHƯƠNG CƠ SỞ LÝ THUYẾT 1.1 Lập trình Windows 1.1.1 Thơng điệp hàng đợi thơng điệp Windows có loại hàng đợi thông điệp: Hàng đợi hệ thống (system queue) hàng đợi ứng dụng (application queue) Hàng đợi hệ thống hàng đợi dùng chung cho tồn hệ thống, tiến trình chạy chia sẻ hàng đợi Nhiệm vụ hàng đợi hệ thống ghi lại kiện phần cứng (chuột, bàn phím, ) chúng Mỗi kiện nhanh chóng chuyển thành thơng điệp, sau Windows lấy thơng điệp từ hàng đợi hệ thống để xem xét chuyển thơng điệp đến chương trình ứng dụng tương ứng Những thông điệp chuyển đến ứng dụng, chúng tạo thành hàng đợi ứng dụng 1.1.2 Lập trình kiện Mỗi ứng dụng có hàng đợi ứng dụng khác Một ứng dụng nhận thông điệp từ hàng đợi ứng dụng cách gọi hàm GetMessage, sau lại gọi tiếp TranslateMessage để dịch thơng điệp, cuối gọi hàm DispatchMessage để trả lại thông điệp cho Windows Việc lấy thông điệp lặp lặp lại, tạo thành vịng lặp thơng điệp Vịng lặp kết thúc hàm GetMessage trả giá trị thơng điệp có định danh WM_QUIT (0x0012) Thông thường, chặn để xử lý thơng điệp có liên quan đến chức ứng dụng, thơng điệp khác giao cho hàm xử lý mặc định làm việc (hàm DefWindowsProc) 1.2 Hook Windows Hook chế lập trình kiện, cho phép ứng dụng cài đặt hàm giám sát vào trình lưu chuyển thơng điệp Hay nói cách khác hook chế cho phép chặn kiện (chuột, bàn phím, thông điệp) trước chúng gửi tới hàng đợi ứng dụng Các hàm thực số thao tác kiện, vài trường hợp định nghĩa lại hủy bỏ kiện mà chặn Một điểm quan trọng cần lưu ý hàm gọi Windows khơng phải ứng dụng Windows hỗ trợ nhiều loại hook khác nhau, loại nhắm đến việc chặn bắt loại thơng điệp cụ thể Ví dụ, ứng dụng sử dụng WH_KEYBOARD để giám sát di chuyển thơng điệp bàn phím hệ thống Một loại hook khác WH_MOUSE cho phép theo dõi thông điệp liên quan đến hoạt động chuột 1.3 Phân loại Hook - Hook cục (Thread hook hay Local hook): hàm giám sát cài đặt vào sau hàng đợi thông điệp ứng dụng (Thread message Queue hay Application Queue), kiểm sốt thơng điệp tiến trình hay ứng dụng cụ thể xác định lúc cài đặt thủ tục hook - Hook toàn cục (Global hook): hàm giám sát cài đặt vào sau hàng đợi thông điệp hệ thống, kiểm sốt tồn tiến trình hệ thống 1.4 Thủ tục Hook – Chuỗi Hook 1.4.1 Thủ tục Hook Là thủ tục cài đặt để xử lý cho loại hook Thủ tục gọi hệ điều hành, hàm CallBack Dạng chung hook Function : LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam); Trong : - nCode: tham số thường gọi “hook code”, thủ tục Hook sử dụng giá trị để định cách thức xử lý kiện Việc xử lý với kiện hoàn tồn phụ thuộc vào người lập trình Giá trị hook code tùy thuộc vào loại hook cụ thể, loại hook có tập hợp giá trị hook code đặc trưng riêng Khi Windows truyền cho hàm giát rị hook code âm, thủ tục không xử lý kiện mà phải gọi hàm CallNextHookEx với tham số mà HĐH truyền cho Sau đó, phải trả giá trị trả hàm CallNextHookEx - wParam, lParam: Đây thông tin cần thiết cho thủ tục hook trình xử lý kiện Các giá trị có ý nghĩa khác tuỳ thuộc vào loại hook Ví dụ : thủ tục gắn với hook WH_KEYBOARD nhận mã phím ảo (Virtual-Key Code) từ wParam, đồng thời có từ lParam thơng tin mơ tả trạng thái bàn phím kiện gõ phím xảy - Mỗi loại hook cần có cách xử lý khác xây dựng thủ tục hook - Có thể cài đặt nhiều thủ tục hook cách dùng hàm SetWindowsHook hay SetWindowsHookEx - Thủ tục hook cài sau ln nằm vị trí chuỗi hook 1.4.2 Chuỗi Hook - Là dãy thủ tục hook liên kết theo thứ tự ưu tiên thực giảm dần - Hệ thống có khả hỗ trợ nhiều loại hook khác nhau, loại quy định cách thức truy nhập khác Hệ thống trì chuỗi hook riêng biệt cho loại hook - Khi có message sinh thuộc loại hook đó, hệ thống đẩy vào hàm hook chuỗi, sau chuyển đến thủ tục hook nhờ xử lý thủ tục hook - Một chuỗi hook danh sách trỏ đặc biệt, trỏ tới hàm CallBack gọi hook procedure (thủ tục hook) Như kiện xuất hiện, hệ thống chuyển kiện tới thủ tục hook tham chiếu bới chuỗi hook theo thứ tự Vì phải thực xong thủ tục gọi thủ tục Hình 1: Sơ đồ hook chain 1.5 Lập trình Hook 1.5.1 Cài đặt thủ tục hook - Một ứng dụng cần phải thực việc Cài đặt thủ tục hook muốn giám sát thông điệp - Hàm SetWindowsHookEx cài đặt thủ tục hook vào điểm bắt đầu chuỗi hook HHOOK SetWindowsHookEx( int hookMsg, HOOKPROC hookProc HINSTANCE hIns, DWORD threadId); Trong đó: + hookMsg: loại hook + hookProc: trỏ đến thủ tục hook Trường hợp Hook toàn cục, thủ tục hook phải lưu DLL; với Thread hook, thủ tục hook chứa thread tương ứng + hIns: handle module chứa thủ tục hook + threadId: ID thread Nếu 0, Hook Global Ví dụ 1: Cài đặt Keyboard hook tồn cục SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstDLL, 0); Ví dụ 2: Cài đặt Keyboard hook cục SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL,GetCurrentThreadId()); 1.5.2 Chuyển thông điệp đến thủ tục hook - Sau thực xong, thủ tục hook gọi hàm CallNextHookEx để chuyển message đến thủ tục hook chuỗi hook LRESULT CallNextHookEx(HHOOK hHook, int code, WPARAM wParam, LPARAM lParam); Trong đó: + Tham số handle hook hành, giá trị lấy từ hàm SetWindowsHookEx cài đặt hook + Ba tham số giá trị mà thủ tục hook truyền cho thủ tục hook chuỗi Hook 1.5.3 Chuyển thông điệp đến thủ tục hook Sử dụng kỹ thuật hook làm giảm khả thực thi hệ thống Do đó, không sử dụng hook nên hủy bỏ hook khỏi hệ thống BOOL UnhookWindowsHooks(HHOOK hHook); CHƯƠNG PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH 2.1 Khởi tạo Chương trình viết ngôn ngữ C# hỗ trợ gọi đến hàm API windows Khi chương trình chạy, người dùng gõ bàn phím cửa sổ phím gõ vào lưu file với đường dẫn: KeyLogger\bin\Debug\Log_*.txt 2.2 Mã nguồn chương trình Khai báo hàng số biến private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; private static string logName = "Log_"; private static string logExtendtion = ".txt"; Import DLL để lấy hàm SetWindowsHookEx , UnhookWindowsHookEx , CallNextHookEx , GetModuleHandle [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); PHẦN II: LẬP TRÌNH MẠNG Xây dựng ứng dụng quản lý thu chi GIỚI THIỆU TỔNG QUAN ĐỀ TÀI Nội dung đề tài Xây dựng ứng dụng trên máy điện thoại quản lý thu chi Chương trình cho phép người dùng nhập, quản lý thu chi theo ngày/tháng; gửi liệu đến email để lưu giữ Mục tiêu Tìm hiểu hoạt động ứng dụng di động, giao thức email: SMTP, POP3, IMAP; áp dụng kỹ thuật vào trường hợp cần thiết xây dựng ứng dụng Môi trường áp dụng Chương trình mơ viết ngơn ngữ Java Trong đồ án môn học này, em sử dụng phần mềm Android Studio để phát triển ứng dụng CHƯƠNG CƠ SỞ LÝ THUYẾT Nhờ phát triển cơng nghệ thơng tin nói chúng Internet nói riêng, nhiều cơng việc, tác vụ người thực cách dễ dàng Trong đó, vấn đề quản lí thơng tin cá nhân hàng ngày lịch sinh hoạt, chi tiêu, sinh hoạt hàng quan tâm Bên cạnh đó, việc sử dụng ứng dụng sử dụng tảng điện thoại giúp tăng cao tính ứng dụng, tiện lợi cập nhật lúc Một vấn đề làm thông tin liệu di động xảy hỏng hóc, hay đơn giản người sử dụng muốn tiếp tục lưu lại thơng tin dùng trước lần cài đặt lại phần mềm Trong đồ án tập trung tìm hiểu ứng dụng di động quản lí thu chi cá nhân theo ngày, lưu, phục hồi liệu thơng qua Email Có giao thức triển khai phổ biến SMTP, IMAP POP3 1.1 SMTP: 1.1.1 Khái quát: SMTP (tiếng Anh: Simple Mail Transfer Protocol - giao thức truyền tải thư tín đơn giản) chuẩn truyền tải thư điện tử qua mạng Internet SMTP định nghĩa RFC 821 (STD 10) chỉnh lý RFC 1123 (STD 3), chương Giao thức dùng ESMTP (extended SMTP - SMTP mở rộng), định nghĩa RFC 2821 Mặc dầu Server phần mềm quản lí thư điện tử sử dụng SMTP để gửi nhận thư, cấp độ người dùng cá nhân, phần mềm Client để nhận gửi thư STMP ứng dụng để gửi thư mà thôi, việc nhận thư thường dùng giao thức khác IMAP hay POP3 SMTP sử dụng port 25 để giao tiếp Mail Server với Cịn Client thường truyền thư đến Server thông qua port 587 Cũng có ngoại lệ số nhà cung cấp dịch vụ dùng port 465 thay tuân theo tiêu chuẩn (port 587) cho mục đích kể Kết nối SMTP đảm bảo an toàn SSL, thường biết đến với tên SMTPS Mặc dầu hệ thống Mail Server hay Web Mail dùng chuẩn riêng họ phép tài khoản truy cập vào hòm thư hệ thống họ, tất sử dụng giao thức SMTP để gửi nhận email từ phạm vi bên ngồi hệ thống 1.1.2 Q trình email di chuyển MTS(Mail Taransfer System) SMTP: Bản thân ứng dụng gửi email đóng vai trị MUA (Mail User Agent) Khi người thực gửi, email chuyển tới MSA (Mail Submit Agent) MTA (Mail Transfer Agent) biên đầu, thường MSA MTA biên đầu chạy máy Email sau tiếp tục chuyển tiếp (relay) thơng qua MTA trường mạng chạm MTA biên cuối MTA có nhiệm vụ thực truy vấn DNS để tìm MX (Mail Exchanger) Server thích hợp dựa tên miền đằng sau dấu @ (vd: @gmail.com) chuyển tiếp tới MX record có kết tìm Email cuối chuyển lưu trữ MDA (Mail Delivery Agent) theo định dạng mailbox Vậy, nhiệm vụ SMTP thực vận chuyển email từ email client (MUA) tới hộp thư người nhận (MDA) Quá trình chuyển email Một chuyển thư đến Mail Server cục bộ, mail người dùng đọc thông qua giao thức IMAP POP3 1.2 POP3: POP3 (Post Office Protocol version 3, RFC 1939) giao thức nhận email, cho phép người dùng tải thư máy, đọc quản lý thư máy cục Thư sau tải xóa khỏi máy chủ lưu trữ dạng dung lượng lưu trữ máy chủ hạn chế POP3 sử dụng port mặc định 110 để thực thủ tục nhận mail Tuy nhiên, sử dụng port 995 để mã hóa kết nối kênh truyền SSL Thủ tục nhận mail POP3 diễn sau: Người dùng thông qua Email Client gửi yêu cầu kết nối tới Email Server (MDA), trinh bắt tay bước diễn để tạo kết nối TCP Email Server yêu cầu xác thực người dùng trước truy cập hộp thư Duyệt tải email máy Người dùng thực đọc, xóa lưu email MDA (lưu ý, thao tác đánh dấu – mark) Kết thúc phiên, toàn yêu cầu chỉnh sửa thực thực thi Email Server chủ động ngắt kết nối, giải phóng tài nguyên Một giao thức khác có chức thay IMAP (Message Access Protocol) 1.3 IMAP: IMAP (Internet Message Access Protocol, RFC 3501) giao thức nhận Email, đời sau POP3, hỗ trợ thêm nhiều tính khắc phục số nhược điểm, phức tạp POP3 Dung lượng lưu trữ khơng cịn vấn đề lớn nên IMAP cho phép thư giữ server, tải nhiều máy đồng hóa liệu với Điều khiến việc thao tác chỉnh sửa biên tập ứng dụng Email áp dụng hòm thư trực tuyến Hòm thư server chia thành nhiều thư mục (hộp thư đến, thư gửi,…) hỗ trợ người dùng tạo thư mục riêng Với Email, IMAP cho phép gắn cờ để theo dõi trạng thái thư tải vể phần tồn IMAP sử dụng port mặc định 143, port cho kênh truyền mã hóa SSL 993 Một phiên làm việc với IMAP tương tự POP3, khác bước Thực duyệt email (theo cấu trúc thư mục trạng thái), tải đọc phần toàn email (bản sao) Mọi chỉnh sửa biên tập (xóa, di chuyển, thay đổi cờ,…) áp dụng sau thực lệnh, miễn chế độ trực tuyến 1.4 So sánh POP3 IMAP: Ưu điểm POP Là giao thức thời đầu, POP tuân theo ý tưởng đơn giản máy khách yêu cầu truy cập mail server việc lưu trữ mail cục tốt Điều dẫn tới ưu điểm sau: Mail lưu cục bộ, tức ln truy cập khơng có kết nối Internet Kết nối Internet dùng để gửi nhận mail Tiết kiệm không gian lưu trữ server Được lựa chọn để lại mail server Hợp nhiều tài khoản email nhiều server vào hộp thư đến Ưu điểm IMAP IMAP tạo phép truy cập từ xa email lưu server đầu xa Ý tưởng cho phép nhiều máy khách hay người dùng quản lý hộp thư đến Vì vậy, dù bạn có đăng nhập từ máy tính nhà hay máy tính cơng ty bạn ln thấy email cấu trúc thư mục chúng lưu server tất thay đổi bạn tạo với cục đồng với server Kết là, IMAP có ưu điểm sau: Mail lưu server đầu xa, tức truy cập từ nhiều địa điểm khác Cần kết nối Internet để truy cập mail Xem nhanh có tiêu đề mail tải đến nội dung yêu cầu rõ ràng Mail dự phòng tự động server Tiết kiệm không gian lưu trữ cục Vẫn cho phép lưu mail cục * Trong hai giao thức mail này, IMAP lựa chọn tốt User cần kiểm tra emails từ nhiều thiết bị, laptop đến máy bàn, đến di động… POP3 tải email từ Server máy tính, sau lại xóa mail Server, muốn kiểm tra email từ máy tính khác có tình trạng hộp thư thiếu không email CHƯƠNG PHÂN TÍCH THIẾT KẾ HỆ THỐNG 2.1 Bài toán yêu cầu: Bài toán: Xây dựng ứng dụng trên máy điện thoại quản lý thu chi Chương trình cho phép người dùng nhập, quản lý thu chi theo ngày/tháng; gửi liệu đến email để lưu giữ Yêu cầu: - Người dùng nhập thông tin khoản thu/chi theo ngày - Thực lưu liệu thông qua phương thức gửi liệu lưu trữ lên email - Thực đồng hóa liệu lần dùng trước liệu bị xóa 2,2 Phân tích hệ thống: 2.2.1 Chức năng: Use case mô tả chức hệ thống Hệ thống có tác nhân người sử dụng phần mềm, gồm chức sau đây: Quản lí thu chi theo ngày: Hiển thị danh sách khoản thu/chi theo ngày, gồm chức nhỏ kèm như: Thêm khoản thu/chi Cập nhật khoản thu/chi Xóa khoản thu/chi khỏi sở liệu Thống kê theo tháng: Sẽ thực việc thống kê tổng khoản thu/chi tháng vẽ sơ đồ thể mối tương quan khoản chi theo loại Gửi email lưu trữ liệu: Hệ thống gửi email người dùng có nội dung khoản thu/chi theo ngày chọn kèm tệp tin chứa sở liệu Phục hồi liệu: Hệ thống nhận email thực đồng hóa liệu để phục hồi liệu bị xóa 2.2.2 Thiết kế hệ thống * Môi trường cài đặt - Hệ điều hành: Window Ngơn ngữ lập trình: Android Cơng cụ: Android Studio Cơ sở liệu: SQLite Thư viện sử dụng: JavaMail 2.2.3 Giao thức gửi mail SMTP: * Các bước thực Quy trình cài đặt phương thức để gửi mail gồm bước sau đây: Bước 1: Cài đặt Properties: thông số khởi tạo Session Bước 2: Tạo đối tượng Session: phiên làm việc với Server Bước 3: Soạn thảo Message Bước 4: Gửi Message * Thông số kết nối Muốn kết nối đến Mail Server cần phải xác định địa chỉ, cổng, phương thức kết nối Mỗi Mail Server có thơng số khác nhau, tìm thấy phần thơng tin Mail Server Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); * Đối tượng Session Session javamail hiểu phiên làm việc Mail Client giao tiếp với Mail Server Khi Mail Client làm việc với Server theo cách khác (các giao thức khác cho mục đích khác nhau) đối tượng Session lưu giữ thông tin phiên làm việc Trong Java, việc tạo đối tượng Session tiến hành sau: session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { //Authenticating the password protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD); } }); Trong đó: Config.EMAIL, Config.PASSWORD tài khoản email cần đăng nhập * Gửi mail Các bước khởi tạo dùng chung phương thức nhận mail Muốn gửi email cần phải có nội dung đầu vào sau: người gửi, mật khẩu, người nhân, subject email, nội dung email, attachment Tồn thơng tin đóng gói vào đối tượng MimeMessage gửi phương thức: Transport.send(message); 2.2.4 Giao thức nhận mail IMAP * Các bước thực Quy trình cài đặt phương thức để nhận mail gồm bước sau đây: Bước 1: Cài đặt Properties: thông số khởi tạo Session Bước 2: Tạo đối tượng Session: phiên làm việc với Server Bước 3: Tạo đối tượng Store, kết nối với Server Bước 4: Lấy Message Bước 5: If Message khác rỗng then Đọc Message * Thông số kết nối Muốn kết nối đến Mail Server cần phải xác định địa chỉ, cổng, phương thức kết nối Mỗi Mail Server có thơng số khác nhau, tìm thấy phần thơng tin Mail Server Properties props = new Properties(); props.setProperty("mail.store.protocol", "imaps"); props.setProperty("mail.imaps.host", "imaps.gmail.com"); props.setProperty("mail.imaps.port", "993"); props.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.imaps.socketFactory.fallback", "false"); * Đối tượng Store Đối tượng Store chứa thông tin kho chứa email phương thức truy cập vào Đối tượng dùng để lưu lấy email Cách khởi tạo: store = session.getStore("imaps"); Trong đó: tham số giao thức truy cập Tham số “imaps” thể dùng giao thức IMAP * Lấy Message chứa tệp liệu Mỗi đối tượng Message chứa thông tin tin nhắn email Với giao thức IMAP, lấy Message folder cụ thể Điều với POP3 khơng thể, POP3 lấy từ hộp thư INBOX Mỗi Mail Server có cách đặt tên mail folder khác Một Message chứa thông tin như: địa gửi, địa nhận, Subject, nội dung mail… Sau lấy Message, việc cần làm chuyển thông tin thành thông tin cụ thể thông qua cài đặt lớp nội dung Mail riêng Nội dung Mail có nhiều dạng khác nên cần phải có phương thức để hiển thị nội dung Ví dụ: đọc kiểu html kiểu text/plain cách giống Ví dụ phương thức đọc nội dung Message: Message[] msgs =inbox.getMessages(); m=(Multipart)msgs[inbox.getMessageCount()-1].getContent(); for(int i=0;i