Tải bản đầy đủ (.pdf) (32 trang)

IMAP EMAIL CLIENT program dev (Lập trình mạng với python)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (688.51 KB, 32 trang )

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
❖

BÁO CÁO MÔN HỌC

LẬP TRÌNH MẠNG

IMAP EMAIL CLIENT
Giáo viên hướng dẫn

:

ThS. Đặng Thanh Bình

Sinh viên thực hiện

:

14110054 Nguyễn Trường Hận
14110001 Nguyễn Tuấn Anh
14110073 Trần Phan Khánh Huân

TP. HỒ CHÍ MINH, THÁNG 12 NĂM 2017


Báo cáo môn học Lập trình mạng

IPMAP EMAIL CLIENT

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN


...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
Tp. Hồ Chí Minh, ngày… tháng … năm ……
Giáo viên hướng dẫn

i


Báo cáo môn học Lập trình mạng

IPMAP EMAIL CLIENT

LỜI CẢM ƠN
Trên thực tế không có sự thành công nào mà không gắn liền với những sự hỗ trợ,

giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp của người khác. Trong suốt thời gian
từ khi bắt đầu học và làm báo cáo môn học đến nay, chúng em đã nhận được rất nhiều
sự quan tâm, giúp đỡ và hướng dẫn của thầy. Chúng em xin chân thành cảm ơn thầy
Đặng Thanh Bình giàng viên môn “Lập trình mạng” khoa Công nghệ thông tin đã tận
tâm hướng dẫn chúng em qua từng buổi học trên lớp cũng như những buổi nói chuyện,
thảo luận về lĩnh vực sáng tạo trong báo cáo môn học. Nếu không có những lời hướng
dẫn, dạy bảo của thầy thì chúng em nghĩ bài báo cáo này của chúng em rất khó có thể
hoàn thiện được. Một lần nữa, em xin chân thành cảm ơn thầy. Bài báo cáo được thực
hiện trong khoảng thời gian gần 4 tuần. Bước đầu đi vào thực tế, tìm hiểu về lĩnh vực
sáng tạo trong nghiên cứu khoa học, kiến thức của chúng em còn hạn chế và còn nhiều
bỡ ngỡ.
Trong quá trình làm bài báo cáo cuối kì , khó tránh khỏi sai sót, rất mong thầy bỏ
qua. Đồng thời do trình độ cũng như kinh nghiệm thực tiễn còn hạn chế nên bài báo cáo
không thể tránh khỏi những thiếu sót, chúng em rất mong nhận được ý kiến đóng góp
thầy để em học thêm được nhiều kinh nghiệm và sẽ hoàn thành tốt hơn bài báo cáo tốt
nghiệp sắp tới.
Sau cùng, em xin kính chúc quý thầy có thật dồi dào sức khỏe, niềm tin để tiếp tục
thực hiện sứ mệnh cao đẹp của mình là truyền đạt kiến thức cho thế hệ mai sau.

TP. Hồ Chí Minh, ngày 20 tháng 12 năm 2017
Sinh viên thực hiện

Nguyễn Tuấn Anh
Trần Phan Khánh Huân
Nguyễn Trường Hận

ii


Báo cáo môn học Lập trình mạng


IPMAP EMAIL CLIENT

LỜI NÓI ĐẦU
Ngày nay, sự bùng nổ và phát triển của công nghệ thông tin và mạng internet trên
toàn thế giới, việc trao đổi thông tin đã trở nên dễ dàng hơn. Một trong những cách để
trao đổi thông tin trên internet không thể không nhắc tới vì những tiện ích và lợi ích mà
nó mang lại đó là thư điện tử hay còn gọi là e-mail (electronic mail). Thư điện tử
(e-mail) là một hệ thống truyền nhận thư từ qua internet hay các mạng máy tính
(computer network). E-mail có những lợi ích đáng kể so với cách viết thư truyền thống
bằng giấy và mực. Một thông điệp, một tin nhắn, lời chúc mừng hay văn bản,… có thể
được gửi tại bất kỳ nơi nào trên toàn thế giới một cách dễ dàng và nhanh chóng gần như
ngay lập tức. E-mail chẳng những có thể truyền được chữ, nó còn có thể truyền được
các dạng thông tin khác như hình ảnh, âm thanh, phim, và đặc biệt các phần mềm thư
điện tử kiểu mới còn có thể hiện thị các e-mail dạng sống động tương thích với kiểu tệp
html.
Đối với các doanh nghiệp, e-mail lại càng trở nên quan trọng hơn trong những
mẫu tin quảng cáo gửi tới nhiều khách hàng, các bản hợp đồng gửi tới những đối tác
trong nước hay nước ngoài, hay các thông báo cho các nhân viên trong công ty…, với
khả năng chuyển giao nhanh chóng gần như ngay lập tức, không khoảng cách, và chi
phí rẻ thì e-mail là một sự lựa chọn không thể thiếu cho các doanh nghiệp.
Do đó, trong báo cáo bài tập lớn môn lập trình mạng, chúng em viết về một ứng
dụng mạng “IMAP EMAIL CLIENT” đơn giản với các chức năng soạn mail mới và gửi
đi (có đính kèm), hiển thị mail đến, đọc nội dung mail đến.

iii


Báo cáo môn học Lập trình mạng


IPMAP EMAIL CLIENT

DANH MỤC TỪ VIẾT TẮT

IMAP: Internet Message Access Protocol
SMTP: Simple Mail Transfer Protocol
MUA: Mail User Agent
POP: Post Office Protocol

iv


Báo cáo môn học Lập trình mạng

IPMAP EMAIL CLIENT

DANH MỤC HÌNH ẢNH
Hình 1: Cơ chế hoạt động của thư điện tử (E-mail) ............................................... 2
Hình 2: Các trường của email ................................................................................ 4
Hình 3: Giao diện đăng nhập ................................................................................ 19
Hình 4: Giao diện viết email mới ......................................................................... 19
Hình 5: Giao diện hộp thư đến ............................................................................. 20
Hình 6: Giao diện xem thư ................................................................................... 20
Hình 7: Giao diện đính kém file vào mail ............................................................ 21

v


Báo cáo môn học Lập trình mạng


IPMAP EMAIL CLIENT

DANH MỤC BẢNG BIỂU
Bảng 1: Quy ước sử dụng các số cổng TCP .......................................................... 7

vi


Báo cáo môn học Lập trình mạng

IPMAP EMAIL CLIENT

MỤC LỤC
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN ........................................................ i
LỜI CẢM ƠN ............................................................................................................ ii
LỜI NÓI ĐẦU .......................................................................................................... iii
DANH MỤC TỪ VIẾT TẮT .................................................................................... iv
DANH MỤC HÌNH ẢNH ..........................................................................................v
DANH MỤC BẢNG BIỂU ...................................................................................... vi
MỤC LỤC

............................................................................................................ vii

Chương 1:

TỔNG QUAN VỀ EMAIL ...................................................................1

1.1.

Khái niệm về thư điện tử (Email) ........................................................1


1.2.

Lợi ích của thư điện tử (e-mail) so với thư truyền thống ....................1

1.3.

Cơ chế hoạt động của thư điện tử .......................................................2

1.4.

Kiến trúc của thư điện tử .....................................................................4

Chương 2:

TÌM HIỂU VỀ IMAP EMAIl CLIENT ................................................6

2.1.

Giới thiệu về giao thức IMAP .............................................................6

2.2.

Giới thiệu về Email client....................................................................6

2.3.

Ưu điểm và khuyết điểm của IMAP EMAIL CLIENT .......................7
Ưu điểm ..........................................................................................7
Khuyết điểm ...................................................................................7


Chương 3:
3.1.

XÂY DỰNG CHƯƠNG TRÌNH IMAP EMAIL CLIENT ..................9
Code .....................................................................................................9
Khai báo các thư viện cần thiết ......................................................9
Khai báo class Gmail ......................................................................9
Hàm send_message trong class Gmail ...........................................9
Hàm get_inbox trong class Gmail ................................................10
Hàm decode_base64 trong class Gmail ........................................11
Hàm Show_Sign_In_Window trong class Gmail ........................11
Hàm Show_List_Form trong class Gmail ....................................12
Hàm Show_Send_Email_Form trong class Gmail .......................12
vii


Báo cáo môn học Lập trình mạng

IPMAP EMAIL CLIENT

Hàm Show_Get_Inbox_Form trong class Gmail .........................13
Hàm TaoDoiTuong_Inbox trong class Gmail ............................15
Hàm TaoDoiTuong_Send trong class Gmail .............................15
Hàm TaoDoiTuong_Sign_In trong class Gmail .........................15
Các hàm thông báo trong class Gmail ........................................16
Hàm click_attach_file_button trong class Gmail .......................16
Các Hàm xử lý button event .......................................................16
Hàm Subject_click trong class Gmail ........................................17
Hàm close_windows trong class Gmail .....................................17

Class inbox_info .........................................................................17
Class Inbox_Info.........................................................................17
Class Send_Email_Info ..............................................................18
Gọi hàm ......................................................................................18
3.2.

Giao diện ...........................................................................................19
Đăng nhập .....................................................................................19
Giao diện viết mail mới ................................................................19
Xem hộp thư đến ..........................................................................20
Xem thư ........................................................................................20
Đính kèm file vào mail .................................................................21

Chương 4:

KẾT LUẬN .........................................................................................22

TÀI LIỆU THAM KHẢO ....................................................................................... viii

viii


Báo cáo môn học Lập trình mạng

Chương 1:

IMAP EMAIL CLIENT

TỔNG QUAN VỀ EMAIL


1.1. Khái niệm về thư điện tử (Email)
E-mail hay thư điện tử là một phương tiện truyền đạt thông tin rất nhanh. Một mẫu
thông tin (thư từ) có thể được gửi đi ở dạng mã hóa hay dạng thông thường và được
chuyển qua các mạng máy tính đặc biệt là mạng internet. Nó có thể chuyển mẫu thông
tin từ một máy nguồn tới một hay rất nhiều máy nhận trong cùng một lúc.
Ngày nay, e-mail không những có thể truyền được các ký tự, mà còn có thể truyền
được các dạng thông tin khác như hình ảnh, âm thanh, phim và đặc biệt các phần mềm
thư điện tử kiểu mới còn có thể hiện thị các e-mail dạng sống động tương thích với kiểu
tệp html.
1.2. Lợi ích của thư điện tử (e-mail) so với thư truyền thống
Thay vì viết thư bằng giấy mực và bút thì người gửi chỉ cần gõ chữ từ bàn phím
của máy tính và biết dùng một phần mềm thư điện tử.
Lá thư được gửi trên hệ thống bưu chính là vật liệu không cần máy nhận hay máy
gửi. Trong đó, nếu gửi thư điện tử, chỉ có các tín hiệu điện mã hóa nội dung bức thư
điện tử được truyền đi đến máy nhận. Do đó, chỉ nội dung hay cách trình bày lá thư điện
tử là được bảo toàn. Trong khi đó, dùng đường bưu điện người ta có thể gửi đi các vật
liều hàm chứa thêm nội dung hay ý nghĩa khác. Điều này có thể rất quan trọng đối với
nhiều người.
Vận tốc truyền thư điện tử bất kỳ lúc nào cũng có thể mở phần mềm thư điện tử ra
đọc nên tiện lợi hơn là việc phải bỏ thư ở các thùng thư. Đồng thời, vì mỗi người dùng
thư đều phải nhập mật khẩu vào máy nên thư điện tử sẽ khó bị người ở chung đọc lén
so với thư gửi bưu điện. Nhưng ngược lại, các tay tin tặc xa lạ có thể xâm nhập vào hệ
thống thư điện tử các nhân nếu như các mật mã hay các hệ thống an toàn phần mềm bị
bẻ gãy.
Khối lượng gửi và nhận thư điện tử có thể nhiều hơn thư bưu điện rất nhiều lần.
Thư điện tử không thể bị hư hại vật lý. Thư điện tử có thể bị nhiễm virus, các mã
độc hại.
Khả năng chuyển tiếp thư nhanh chóng.

1



Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

Hộp thư là nơi cất giữ các thư từ với địa chỉ xác định. Tương tự, trong hệ thống
thư điện tử, thì hộp thư này tương đương với phần dữ liệu chứa nội dung các e-mail
cộng với địa chỉ của người chủ thư điện tử. Điểm khác biệt ở đây là hộp thư điện tử sẽ
có nhiều chức năng hơn là việc xóa bỏ các thư cũ.
Mỗi người có thế có một hay nhiều địa chỉ E-mail (và phải được đăng ký qua một
hệ thống nào đó). Mỗi hộp thư sẽ có một địa chỉ phân biệt không bao giờ trùng với địa
chỉ E-mail khác.
1.3. Cơ chế hoạt động của thư điện tử
E-mail là dịch vụ rất phổ biến và thông dụng trong mạng Internet và hầu như không
thể thiếu được trong Internet hiện nay. Tuy nhiên không phải hầu nhưn là dịch vụ “từ
đầu- đến cuối ”(end to end). Nghĩa là dịch vụ này không đòi hỏi hai máy tính gửi và
nhận thư phải nối trực tiếp với nhau để thực hiện việc chuyển thư. Nó là dịch vụ kiểu
lưu và chuyển tiếp (store-and-forward) thư được chuyển từ máy này sang máy khác cho
tới khi máy đích nhận được. Người nhận cũng chỉ thực hiện một số thao tác đơn giản để
lấy thư, đọc thư và nếu cần thì cho in ra. Cách liên lạc này thuận tiện hơn nhiều so với
gửi thư thông thường qua bức điện hay Fax, lại rẻ và nhanh hơn. Cách thực hiện việc
chuyển thư không cần thiết phải kết nối trực tiếp với nhau để chuyển thư, thư có thể
được chuyển từ máy này đến máy khác cho tới máy đích… Giao thức truyền thống sử
dụng cho hệ thống thư điện tử của Internet là SMTP (Simple Mail Transfer Protocol).

Hình 1: Cơ chế hoạt động của thư điện tử (E-mail)

Giao thức liên lạc: mặc dù gửi thử trên Internet sử dụng nhiều giao thức khác nhau,
nhưng giao thức SMTP được dùng trong việc vận chuyển mail giữa các trạm. Giao thức

này đặc tả trong 2 chuẩn là trong RFC 822(định nghĩa cấu trúc của thư) và RFC 821(đặc
2


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

tả giao thức trao đổi giữa hai mạng) ngoài ra trong RFC 821 sẽ nói rõ các qui luật và
cách thức hoạt động của giao thức. Là một giao thức cơ bản để chuyển thư giữa các máy
Client, SMTP có bộ gửi thư, một bộ nhận thư, và một tập hợp lệnh dùng để gửi thư từ
người gửi đến người nhận. Giao thức SMTP hoạt động theo mô hình khách/chủ
(Client/Server) với một tập lệnh đơn giản, trình khách (SMTP mail Client) sẽ bắt tay với
máy chủ (SMTP mail Server ) gửi các yêu cầu tiếp nhận mail. Trình đọc nội dung mail
do trình khác gửi đến và lưu vào một thư mục nhất định tương ứng với từng user trên
máy chủ.
Cứ mỗi trạm E-mail thường bao gồm ít nhất hai dịch vụ : POP3 có nhiệm vụ
nhận/trả thư từ/tới E-mail client và dịch vụ SMTP có nhiệm vụ nhận/phân phối thư
từ/đến POP3 đồng thời trao đổi thư với các trạm E-mail trung gian. Ngoài ra trạm Email này có thể bổ sung thêm một số dịch vụ khác như ESMTP, IMAP, dịch vụ MX
Record của dịch vụ DNS hay dịch vụ chuyển tiếp mail. IMAP (INTERNET MESSAGE
ACCESS PROTOCOL – VERSION 4revl) thực chất là giao thức mới bổ sung và mở
rộng hơn của giao thức POP3 còn thiếu. IMAP cho phép đọc, xóa, gửi, di chuyển mail
ngay trên máy chủ. Điều này rất thuận tiện cho người nhận mail phải thường xuyên di
chuyển mail từ máy này sang máy khác trong quá trình làm việc. Tuy nhiên chi phí để
cài đặt một trạm E-mail có giao thức IMAP là cao hơn so với giao thức POP3.
Mỗi người dùng (client) đều phải kết nối với một E-mail Server gần nhất (đóng
vai trò bưu cục địa phương) phải có một tên (E-mail account) trên một trạm E-mail và
sử dụng chương trình E-mail client (ví dụ: hongnhung, macdinh123,…). Sau khi soạn
thảo xong thư và đề rõ địa chỉ đích (người nhận) rồi gửi thư tới E-mail Server của mình.
E-mail Server này có nhiệm vụ sẽ tự động kiểm tra và định hướng chuyển thư tới đích

hoặc chuyển thư tới một E-mail Server trung gian khác. Thư chuyển tới E-mail Server
của người nhận và được lưu trữ ở đó. Đến khi người nhận thiết lập tới một cuốc kết nối
tới E-mail Server đó thì thư sẽ chuyển về máy người nhận, nếu không thì thư vẫn tiếp
tục giữ lại ở server đảm bảo không bị mất.
Phần khác của thư điện tử là cho phép người sử dụng đính kèm (attachments)
theo thư một tập tin bất kỳ (có thể dạng nhị phân chẳng hạn ).
Như vậy để gửi/nhận thư người sử dụng chỉ cần quan tầm tới cách sử dụng
chương trình E-mail Client. Hiện nay có nhiều chương trình E-mail Client như Microsoft

3


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

Outlook Express, Eudora Pro, Peagasus mail, … và một dịch vụ E-mail Client rất phổ
biến bây giờ là Webmail.
1.4. Kiến trúc của thư điện tử
Về cơ bản, một bức thư Mail gồm 3 phần chính:
-

Phần phong bì (Envelope): Mô tả thông tin về người gửi và người nhận.
Phần này do các MTA tạo ra và sử dụng , nó chứa các thông tin để chuyển
nhận email như địa chỉ người nhận, địa chỉ nơi gửi. Hay nói cách khác,
giao thức SMTP sẽ quy định thông tin của phong bì, các hệ thống E-mail
cần những thông tin này để chuyền dữ liệu từ một máy tính này sang một
máy tính khác.

-


Phần tiều đề (header): chứa đựng các thông tin về người gửi, người nhận,
chủ đề bức Mail, địa chỉ hồi âm,v.v… Các thông tin này, một số được
người sử dụng cung cấp khi gửi mail, một số khác được chương trình Mail
thêm vào, và số còn lại do Hệ thống điền thêm.
+ Phần này cung cấp những thông tin tổng quát về Email như người
nhận, người gửi, ngày giờ nhận,…
+ Cấu tạo gồm nhiều trường (field) cấu trúc mỗi trường là một dòng văn
bản ASCII chuẩn 7 bit như sau:
<tên trường>:<nội dung của trường>
+ Sau đây là một số trường thông dụng và ý nghĩa của nó:

Hình 2: Các trường của email

Các trường trên là các trường chuẩn do giao thức SMTP quy định,
ngoài ra trong phần header cũng có thể thêm một số trường khác do
chương trình Email tạo ra nhằm quản lý các email mà chúng tạo ra.
4


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

Các trường này được bắt đầu bằng ký tự X- và thông tin theo sau là
cũng giống như ta thấy trên một trường chuẩn
+ Phần nội dung (body): chứa đựng nội dung của bức Mail, là nội dung
được tạo ra bởi trình soạn thảo Editor của chương trình Email. Để phân
biệt phần tiêu đề với phần nội dung của bức Mail, người ta quy ước
đặt ranh giới là một dòng trắng (chuỗi ký tự ``\r\n``). Kết thúc của

phần nội dung là chuỗi ký tự kết thúc Mail: ``\r\n.\r\n``. Như vậy nội
dung bức Mail nằm trong khoảng giữa dòng trắng đầu tiên và ký tự kết
thúc Mail. Mặt khác do môi trường truyền thông là mạng Internet nên
các ký tự cấu thành phần body của bức Mail cũng phải là các ký tự
ASCII chuẩn.

5


Báo cáo môn học Lập trình mạng

Chương 2:

IMAP EMAIL CLIENT

TÌM HIỂU VỀ IMAP EMAIl CLIENT

2.1. Giới thiệu về giao thức IMAP
IMAP (tiếng Anh: Internet Message Access Protocol) là thế hệ mới của giao thức
POP (Post Office Protocol). Nói một cách đơn giản, IMAP đặt sự kiểm soát email trên
mail server trong khi nhiệm vụ của POP là tải toàn bộ thông điệp email về client server
yêu cầu. Cụ thể, IMAP cung cấp truy cập email theo ba chế độ khác nhau: offline (ngoại
tuyến), online (trực tuyến) và disconnected (ngắt kết nối).
Truy cập chế độ offline IMAP giống như POP, các thông điệp email được truyền
đến máy client server, xóa khỏi mail server và mối liên kết bị ngắt. Sau đó người dùng
đọc, trả lời, làm các việc khác ở chế độ ngoại tuyến, và nếu muốn gửi thư mới đi họ phải
kết nối lại.
Truy cập chế độ online là chế độ IMAP truy cập mà người dùng đọc và làm việc
với thông điệp email trong khi vẫn giữ đang kết nối với mail server (kết nối mở). Các
thông điệp này vẫn nằm ở mail server cho đến khi nào người dùng quyết định xóa nó đi.

Chúng đều được gắn nhãn hiệu cho biết loại để "đọc" hay "trả lời".
Trong chế độ disconnected, IMAP cho phép người dùng lưu tạm thông điệp ở
client server và làm việc với chúng, sau đó cập nhật trở lại vào mail server ở lần kết nối
kế tiếp. Chế độ này hữu ích cho những ai dùng laptop hay truy cập mạng bằng liên kết
quay số điện thoại, đồng thời không muốn bỏ phí những lợi điểm của kho chứa thư ở
mail server.. [3]
2.2. Giới thiệu về Email client
Email client (từ kỹ thuật là Mail User Agent (MUA), trong tiếng Việt là trình duyệt
mail) là một phần mềm máy tính được dùng để truy cập và quản lý email của người
dùng.
Các mail client phổ biến bao gồm Microsoft Outlook, IBM Lotus Notes, Mozilla
Thunderbird,, Evolution và Apple Inc.'s Mail.[4]
Một ứng dụng web cung cấp các dịch vụ quản lý tin nhắn, các thành phần, và các
tính năng nhận mail đôi khi cũng được em là một trình duyệt mail, nhưng thường được
gọi là webmail. Các webmail phổ biến gồm Gmail, Lycos Mail, Mail.com, Outlook.com
và Yahoo! Mail.
6


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

Email servers và clients theo quy ước sử dụng các số cổng TCP trong bảng sau.
Đối với MSA, IMAP and POP3, các bảng báo cáo cũng lầcc nhãn mà một mail client
sử dụng để truy vấn các bản ghi SRV và khám phá cả các tên máy chủ và số cổng của
các dịch vụ tương ứng.
Giao thức

Cách sử dụng


Văn bản trần Chird ùng các Chỉ dùng các
hay các phiên phiên văn bản phiên mã hóa
mã hóa

POP3

IMAP4

SMTP

Thư đến

Thư đến

Thư đi

trần

110

995

_pop3._tcp

_pop3s._tcp

143

993


_imap._tcp

_imaps._tcp

25

465

(Chưa

chính thức)
MSA

Thư đi

HTTP

Webmail

587
80

443

Bảng 1: Quy ước sử dụng các số cổng TCP

2.3. Ưu điểm và khuyết điểm của IMAP EMAIL CLIENT
Ưu điểm
• Cho phép đồng bộ dữ liệu email từ máy chủ dịch vụ đến các thiết bị khác

nhau và không tải email về thiết bị đầu cuối của người dùng.
• Cấu hình giao thức đơn giản, nhiều mail client hỗ trợ giao thức imap
• Truy cập được từ nhiều địa điểm khác nhau.
• Cần kết nối internet để truy cập mail.
• Xem nhanh hơn khi chỉ có các tiêu đề mail được tải về đến khi nội dung
được yêu cầu rõ ràng. [2]
• Mail được dự phòng tự động trên server.
• Tiết kiệm không gian lưu trữ cục bộ.
• Cho phép lưu hành mail cục bộ. [2]
Khuyết điểm

7


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

• Yêu cầu truy cập liên tục trong suốt quá trình làm việc với các email. Do
việc trữ tin nhắn trên server từ đó dẫn đến việc vượt quá giới hạn không
gian lưu trữ cho phép.[1]
• Độ bảo mật thấp
• Client cần phài duy trì một kết nối TCP/IP cho máy chủ IMAP để được
thông báo về sự xuất hiện của thư mới. Thông báo thư đến được thực hiện
thông qua băng tần tín hiệu, góp phần tăng thêm sự phức tạp trong việc sử
lý giao thức IMAP bên máy client.

8



Báo cáo môn học Lập trình mạng

Chương 3:

IMAP EMAIL CLIENT

XÂY DỰNG CHƯƠNG TRÌNH IMAP EMAIL CLIENT

3.1. Code
Khai báo các thư viện cần thiết
Import email
import imaplib
import ctypes
import smtplib
import getpass
import re
import base64
import string
import sys
from Tkinter import *
import tkFileDialog
import tkMessageBox
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate

Khai báo class Gmail
class Gmail:
server_outgoing = 'smtp.gmail.com'

server_incoming = 'imap.gmail.com'
port_outgoing_tls = 587
port_incoming_ssl = 993
my_email = ''
password_my_email = ''
subject = ''
content = ''
to_email = ''
is_attach_file = 0
Inboxes = list()

Hàm send_message trong class Gmail
def send_message(self):
session_out = smtplib.SMTP(self.server_outgoing, self.port_outgoing_tls)
session_out.ehlo()
session_out.starttls()
session_out.ehlo
session_out.login(self.my_email, self.password_my_email)
msg = MIMEMultipart()
msg['From'] = self.my_email
msg['To'] = self.to_email
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = self.subject.encode('utf-8')
msg.attach(MIMEText(self.content.encode('utf-8')))
if self.is_attach_file:
part = MIMEApplication(open(self.file_path, "rb").read())
file_name = self.file_path.split('/')

9



Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

file_name = file_name[len(file_name) - 1]
part.add_header('Content-Disposition', 'attachment',
filename=file_name)
msg.attach(part)
session_out.sendmail(
self.my_email,
self.to_email,
msg.as_string())

Hàm get_inbox trong class Gmail
def get_inbox(self):
session_in = imaplib.IMAP4_SSL(self.server_incoming,
self.port_incoming_ssl)
session_in.login(self.my_email, self.password_my_email)
session_in.select('INBOX')
(code, messages) = session_in.search(None, "ALL")
n = 0
if code == 'OK':
sys.stdout.write("Loading ")
sys.stdout.flush()
for i in messages[0].split():
n = n + 1
sys.stdout.write('. ')
sys.stdout.flush()
typ, data = session_in.fetch(i, '(RFC822)')

for response_part in data:
if isinstance(response_part, tuple):
original = email.message_from_string(response_part[1])
fr = original['From']
e_from = re.findall("<(\S+@\S+)>", fr)
temp = re.findall('(.*)\s', fr).__str__()
temp2 = temp[12:len(temp) - 6]
name_from = self.decode_base64(temp2)
su = original['Subject']
if '=?UTF-8' in su[:10]:
temp3 = su[10:len(su) - 2]
subject = self.decode_base64(temp3)
else:
subject = su
time = original['Date']
try:
test = e_from[0]
email_from = test
except:
email_from = fr

10


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

content = ""
if original.is_multipart():

for part in original.walk():
ctype = part.get_content_type()
cdispo = str(part.get('Content-Disposition'))
if ctype == 'text/plain' and 'attachment' not in
cdispo:
content = part.get_payload(decode=True)
break
else:
content = original.get_payload(decode=True)
if data == 'eject':
ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door
open", None, 0, None)
typ, data = session_in.store(i, '+FLAGS', '\\Seen')
Inbox = dict()
Inbox['index'] = i
Inbox['email_from'] = email_from
Inbox['name_from'] = name_from
Inbox['subject'] = subject
Inbox['time'] = time
Inbox['content'] = content
self.Inboxes.append(Inbox)
print '\n'

Hàm decode_base64 trong class Gmail
def decode_base64(selft, data):
missing_padding = len(data) % 4
if missing_padding != 0:
data += b'=' * (4 - missing_padding)
return base64.decodestring(data)


Hàm Show_Sign_In_Window trong class Gmail
def Show_Sign_In_Window(self):
self.sign_in_window = Tk()
self.sign_in_window.title("Welcome to My Email Client")
self.sign_in_window.resizable(False, False)
self.sign_in_window.geometry("400x70+500+250")
width_of_buttons = 12
width_of_labels = 12
width_of_entries = 50
btnSignIn = Button(self.sign_in_window, text="SIGN IN",
width=width_of_buttons,
command=lambda:
self.TaoDoiTuong_Sign_In(self.entEmail_of_sign_in_form.get(),
self.entPassword_of_sign_in_form.get()))
btnSignIn.grid(row=3, column=1)
btnExit = Button(self.sign_in_window, text="EXIT", width=width_of_buttons,

11


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

command=lambda: self.close_window(self.sign_in_window))
btnExit.grid(row=3, column=2)
labEmail = Label(self.sign_in_window, text="Email", width=width_of_labels)
labEmail.grid(row=1, column=0)
labPassword = Label(self.sign_in_window, text="Password",
width=width_of_labels)

labPassword.grid(row=2, column=0)
self.entEmail_of_sign_in_form = Entry(self.sign_in_window,
width=width_of_entries)
self.entEmail_of_sign_in_form.bind('<Return>', self.enter_press)
self.entEmail_of_sign_in_form.grid(row=1, column=1, columnspan=3)
self.entPassword_of_sign_in_form = Entry(self.sign_in_window, show='*',
width=width_of_entries)
self.entPassword_of_sign_in_form.bind('<Return>', self.enter_press)
self.entPassword_of_sign_in_form.grid(row=2, column=1, columnspan=3)
self.sign_in_window.mainloop()

Hàm Show_List_Form trong class Gmail
def Show_List_Form(self):
self.list_form = Tk()
self.list_form.title("Welcome to My Email Client")
self.list_form.resizable(False, False)
self.list_form.geometry("320x70+500+250")
frame1= Frame(self.list_form)
frame1.pack(fill=X)
labWelcome = Label(frame1, text="WELCOME
labWelcome.pack()

" + self.my_email + ' !')

frame2=Frame(self.list_form)
frame2.pack(fill=X)
btnNewEmail = Button(frame2, text='New Email', width=20)
btnNewEmail.bind('<Button-1>', self.click_new_email_button_of_list_form)
btnNewEmail.pack(side=LEFT, padx=5, pady=10)
btnInbox = Button(frame2, text='Inbox', width=20)

btnInbox.bind('<Button-1>', self.click_inbox_button)
btnInbox.pack(side=LEFT, padx=5, pady=10)
self.list_form.mainloop()

Hàm Show_Send_Email_Form trong class Gmail
def Show_Send_Email_Form(self):
self.send_email_window = Tk()
self.send_email_window.title("Send Email")
self.send_email_window.resizable(False, False)
self.send_email_window.geometry("723x490+350+100")
width_of_buttons = 12
width_of_labels = 10
width_of_textboxes = 100

12


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

# Define buttons
btnSend = Button(self.send_email_window, text="Send", width=8,
command=lambda: self.TaoDoiTuong_Send(entTo.get(),
entSubject.get(),
txtContent.get('1.0', END)))
btnSend.grid(row=0, column=0, rowspan=1)
btnBack = Button(self.send_email_window, text="Back", width=8)
btnBack.bind('<Button-1>', self.click_back_button_of_send_email_form)
btnBack.grid(row=2, column=0, rowspan=1)

# Define Labels
labTo = Label(self.send_email_window, text="To...")
labTo.grid(row=0, column=1)
labCc = Label(self.send_email_window, text="Cc...")
labCc.grid(row=1, column=1)
labSubject = Label(self.send_email_window, text="Subject")
labSubject.grid(row=2, column=1)
# Define Entry Boxes - single-line text field
entTo = Entry(self.send_email_window, width=width_of_textboxes)
entTo.insert(END, self.to_email)
self.to_email = '' #reset
entTo.grid(row=0, column=2)
entCc = Entry(self.send_email_window, width=width_of_textboxes)
entCc.grid(row=1, column=2)
entSubject = Entry(self.send_email_window, width=width_of_textboxes)
entSubject.grid(row=2, column=2)
# Define Text Boxes - text in multiple lines
txtContent = Text(self.send_email_window, width=90)
txtContent.grid(row=3, column=0, columnspan=3)
btnAttachFile = Button(self.send_email_window, text="Attach File")
btnAttachFile.bind('<Button-1>', self.click_attach_file_button)
btnAttachFile.grid(row=4, column=0)
self.label_of_attach_file = StringVar()
labFilePath = Label(self.send_email_window,
textvariable=self.label_of_attach_file)
labFilePath.grid(row=4, column=1, columnspan=2)
self.send_email_window.mainloop()

Hàm Show_Get_Inbox_Form trong class Gmail
def Show_Get_Inbox_Form(self):

self.get_inbox()
self.inbox_form = Tk()
self.inbox_form.title("Inbox")
self.inbox_form.resizable(False, False)
self.inbox_form.geometry("650x200+350+50")

13


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

frame1 = Frame(self.inbox_form)
frame1.pack(fill=X)
labName = Label(frame1, text="Name", width=6)
labName.pack(side=LEFT, padx=5, pady=5)
labSubject = Label(frame1, text="Subject", width=65)
labSubject.pack(side=LEFT, padx=5, pady=5)
labTime = Label(frame1, text="Time", width=6)
labTime.pack(side=LEFT, padx=5, pady=5)
frame2 = Frame(self.inbox_form)
frame2.pack(fill=X)
LbName = Listbox(frame2, borderwidth=0)
# Dao nguoc thu tu trong danh sach mail Inbox
self.Inboxes.reverse()
i = 1
while i <= len(self.Inboxes):
if self.Inboxes[int(i) - 1]['name_from'] == '':
LbName.insert(END, "(NO NAME)")

else:
LbName.insert(END, self.Inboxes[int(i) - 1]['name_from'])
i += 1
LbName.bind('<<ListboxSelect>>', self.Subject_click)
LbName.pack(side=LEFT, padx=0, pady=5)
LbSubject = Listbox(frame2, width=60, borderwidth=0)
i = 1
while i <= len(self.Inboxes):
if self.Inboxes[int(i) - 1]['subject'] == '':
LbSubject.insert(END, "(NO SUBJECT)")
else:
LbSubject.insert(END, self.Inboxes[int(i) - 1]['subject'])
i += 1
LbSubject.bind('<<ListboxSelect>>', self.Subject_click)
LbSubject.pack(side=LEFT, padx=0, pady=5)
LbTime = Listbox(frame2, width=30, borderwidth=0)
i = 1
while i <= len(self.Inboxes):
if self.Inboxes[int(i) - 1]['time'] == '':
LbTime.insert(END, "(NO TIME)")
else:
LbTime.insert(END, self.Inboxes[int(i) - 1]['time'])
i += 1
LbTime.pack(side=LEFT, padx=0, pady=5)
frame3 = Frame(self.inbox_form)
frame3.pack(fill=X)
self.txtContent_of_inbox_form = Text(frame3, height=15)
self.txtContent_of_inbox_form.pack(side=LEFT, fill=X, pady=5, padx=5)
frame4 = Frame(self.inbox_form)
frame4.pack(fill=X)


14


Báo cáo môn học Lập trình mạng

IMAP EMAIL CLIENT

btnClose = Button(frame4, text="Exit", command=lambda:
self.close_window(self.inbox_form))
btnClose.pack(side=RIGHT, padx=5, pady=5)
btnBack = Button(frame4, text="Back")
btnBack.bind('<Button-1>', self.click_back_button_of_inbox_form)
btnBack.pack(side=RIGHT, padx=5, pady=5)
btnReply = Button(frame4, text="Reply")
btnReply.bind('<Button-1>', self.click_reply_button)
btnReply.pack(side=RIGHT, padx=5, pady=5)
btnNewEmail = Button(frame4, text="New Email")
btnNewEmail.bind('<Button-1>', self.click_new_email_button_of_inbox_form)
btnNewEmail.pack(side=RIGHT, padx=5, pady=5)
self.inbox_form.mainloop()

Hàm TaoDoiTuong_Inbox trong class Gmail
def TaoDoiTuong_Inbox(self, email_from, name_from, subject, time, content):
self.doituong_inbox = Inbox_Info(email_from, name_from, subject, time,
content)
self.doituong_inbox.Print_Info()

Hàm TaoDoiTuong_Send trong class Gmail
def TaoDoiTuong_Send(self, entTo, entSubject, txtContent):

self.doituong_send = Send_Email_Info(entTo, entSubject, txtContent)
self.to_email = self.doituong_send.entTo
self.subject = self.doituong_send.entSubject
self.content = self.doituong_send.txtContent
try:
self.send_message()
self.send_email_succesfull_message_box()
self.to_email = '' # reset
self.is_attach_file = 0
self.close_window(self.send_email_window)
self.Show_List_Form()
except:
self.send_email_error_message_box()

Hàm TaoDoiTuong_Sign_In trong class Gmail
def TaoDoiTuong_Sign_In(self, entEmail, entPassword):
first_time = 1
self.doituong_sign_in = Sign_In_Info(entEmail, entPassword)
check_login = imaplib.IMAP4_SSL(self.server_incoming,
self.port_incoming_ssl)
try:
check_login.login(self.doituong_sign_in.username,
self.doituong_sign_in.password)
self.my_email = self.doituong_sign_in.username
self.password_my_email = self.doituong_sign_in.password

15


Báo cáo môn học Lập trình mạng


IMAP EMAIL CLIENT

self.sign_in_succesfull_message_box()
self.close_window(self.sign_in_window)
self.Show_List_Form()
except:
self.sign_in_error_message_box()

Các hàm thông báo trong class Gmail
def send_email_error_message_box(self):
tkMessageBox.showerror("ERROR", "Gui email that bai !")
def send_email_succesfull_message_box(self):
tkMessageBox.showinfo("SUCCESSFULLY", "Gui email thanh cong !")
def sign_in_error_message_box(self):
tkMessageBox.showerror("ERROR", "Dang nhap that bai !")
def sign_in_succesfull_message_box(self):
tkMessageBox.showinfo("SUCCESSFULLY", "Dang nhap thanh cong !")
def attach_file_succesfull_message_box(self):
tkMessageBox.showinfo("SUCCESSFULLY", "Dinh kem file thanh cong !")
def attach_file_error_message_box(self):
tkMessageBox.showerror("ERROR", "Dinh kem file that bai !")
def enter_press(self, event):
self.TaoDoiTuong_Sign_In(self.entEmail_of_sign_in_form.get(),
self.entPassword_of_sign_in_form.get())

Hàm click_attach_file_button trong class Gmail
def click_attach_file_button(self, event):
ftypes = [("text files", "*.txt"), ("jpeg files", "*.jpg"), ('Python
files', '*.py'), ('All files', '*')]

try:
self.file_path = tkFileDialog.askopenfilename(initialdir="/",
title="Select file", filetypes=ftypes)
self.is_attach_file = 1
self.label_of_attach_file.set(self.file_path)
self.attach_file_succesfull_message_box()
except:
self.attach_file_error_message_box()
self.is_attach_file = 0

Các Hàm xử lý button event
def click_reply_button(self, event):
self.close_window(self.inbox_form)
self.to_email = self.Inboxes[self.selection_of_listbox[0]]['email_from']
self.Show_Send_Email_Form()
def click_inbox_button(self, event):
self.close_window(self.list_form)
self.Show_Get_Inbox_Form()
def click_back_button_of_inbox_form(self, event):
self.close_window(self.inbox_form)
self.Show_List_Form()

16


×