Đối với các doanh nghiệp, email 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ì email 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
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 : 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ó thành cơng mà không gắn liền với hỗ trợ, giúp đỡ dù hay nhiều, dù trực tiếp hay gián tiếp người khác Trong suốt thời gian từ bắt đầu học làm báo cáo môn học đến nay, chúng em nhận nhiều quan tâm, giúp đỡ hướng dẫn 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 buổi học lớp buổi nói chuyện, thảo luận lĩnh vực sáng tạo báo cáo môn học Nếu khơng có lời hướng dẫn, dạy bảo thầy chúng em nghĩ báo cáo chúng em khó hồn thiện Một lần nữa, em xin chân thành cảm ơn thầy Bài báo cáo thực khoảng thời gian gần tuần Bước đầu vào thực tế, tìm hiểu lĩnh vực sáng tạo nghiên cứu khoa học, kiến thức chúng em hạn chế nhiều bỡ ngỡ Trong trình làm báo cáo cuối kì , khó tránh khỏi sai sót, mong thầy bỏ qua Đồng thời trình độ kinh nghiệm thực tiễn hạn chế nên báo cáo khơng thể tránh khỏi thiếu sót, chúng em mong nhận ý kiến đóng góp thầy để em học thêm nhiều kinh nghiệm hoàn thành tốt báo cáo tốt nghiệp tới Sau cùng, em xin kính chúc q thầy có thật dồi sức khỏe, niềm tin để tiếp tục thực sứ mệnh cao đẹp truyền đạt kiến thức cho hệ mai sau TP Hồ Chí Minh, ngày 20 tháng 12 năm 2017 Sinh viên thực 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, bùng nổ phát triển công nghệ thông tin mạng internet tồn giới, việc trao đổi thơng tin trở nên dễ dàng Một cách để trao đổi thông tin internet không nhắc tới vì tiện ích lợi ích mà mang lại thư điện tử hay gọi e-mail (electronic mail) Thư điện tử (e-mail) hệ thống truyền nhận thư từ qua internet hay mạng máy tính (computer network) E-mail có lợi ích đáng kể so với cách viết thư truyền thống giấy mực Một thông điệp, tin nhắn, lời chúc mừng hay văn bản,… gửi nơi toàn giới cách dễ dàng nhanh chóng gần E-mail truyền chữ, truyền dạng thơng tin khác hình ảnh, âm thanh, phim, đặc biệt phần mềm thư điện tử kiểu thị e-mail dạng sống động tương thích với kiểu tệp html Đối với doanh nghiệp, e-mail lại trở nên quan trọng mẫu tin quảng cáo gửi tới nhiều khách hàng, hợp đồng gửi tới đối tác nước hay nước ngồi, hay thơng báo cho nhân viên cơng ty…, với khả chuyển giao nhanh chóng gần lập tức, khơng khoảng cách, chi phí rẻ thì e-mail lựa chọn thiếu cho doanh nghiệp Do đó, báo cáo tập lớn môn lập trình mạng, chúng em viết ứng dụng mạng “IMAP EMAIL CLIENT” đơn giản với chức soạn mail gử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 thư điện tử (E-mail) Hình 2: Các trường email Hình 3: Giao diện đăng nhập 19 Hình 4: Giao diện viết email 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 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 số cổng TCP 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 Khái niệm thư điện tử (Email) 1.2 Lợi ích thư điện tử (e-mail) so với thư truyền thống 1.3 Cơ chế hoạt động thư điện tử .2 1.4 Kiến trúc thư điện tử .4 Chương 2: TÌM HIỂU VỀ IMAP EMAIl CLIENT 2.1 Giới thiệu giao thức IMAP .6 2.2 Giới thiệu Email client 2.3 Ưu điểm khuyết điểm IMAP EMAIL CLIENT .7 Ưu điểm Khuyết điểm Chương 3: 3.1 XÂY DỰNG CHƯƠNG TRÌNH IMAP EMAIL CLIENT Code .9 Khai báo thư viện cần thiết Khai báo class Gmail Hàm send_message class Gmail Hàm get_inbox class Gmail 10 Hàm decode_base64 class Gmail 11 Hàm Show_Sign_In_Window class Gmail 11 Hàm Show_List_Form class Gmail 12 Hàm Show_Send_Email_Form 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 class Gmail 13 Hàm TaoDoiTuong_Inbox class Gmail 15 Hàm TaoDoiTuong_Send class Gmail .15 Hàm TaoDoiTuong_Sign_In class Gmail 15 Các hàm thông báo class Gmail 16 Hàm click_attach_file_button class Gmail .16 Các Hàm xử lý button event .16 Hàm Subject_click class Gmail 17 Hàm close_windows 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 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 thư điện tử (Email) E-mail hay thư điện tử phương tiện truyền đạt thông tin nhanh Một mẫu thông tin (thư từ) gửi dạng mã hóa hay dạng thơng thường chuyển qua mạng máy tính đặc biệt mạng internet Nó chuyển mẫu thơng tin từ máy nguồn tới hay nhiều máy nhận lúc Ngày nay, e-mail khơng truyền ký tự, mà truyền dạng thông tin khác hình ảnh, âm thanh, phim đặc biệt phần mềm thư điện tử kiểu thị e-mail dạng sống động tương thích với kiểu tệp html 1.2 Lợi ích thư điện tử (e-mail) so với thư truyền thống Thay viết thư giấy mực bút thì người gửi cần gõ chữ từ bàn phím máy tính biết dùng phần mềm thư điện tử Lá thư gửi hệ thống bưu vật liệu không cần máy nhận hay máy gửi Trong đó, gửi thư điện tử, có tín hiệu điện mã hóa nội dung thư điện tử truyền đến máy nhận Do đó, nội dung hay cách trình bày thư điện tử bảo tồn Trong đó, dùng đường bưu điện người ta gửi vật liều hàm chứa thêm nội dung hay ý nghĩa khác Điều quan trọng nhiều người Vận tốc truyền thư điện tử lúc mở phần mềm thư điện tử đọc nên tiện lợi việc phải bỏ thư thùng thư Đồng thời, người dùng thư phải nhập mật vào máy nên thư điện tử khó bị người chung đọc so với thư gửi bưu điện Nhưng ngược lại, tay tin tặc xa lạ xâm nhập vào hệ thống thư điện tử nhân mật mã hay hệ thống an toàn phần mềm bị bẻ gãy Khối lượng gửi nhận thư điện tử nhiều thư bưu điện nhiều lần Thư điện tử bị hư hại vật lý Thư điện tử bị nhiễm virus, mã độc hại Khả chuyển tiếp thư nhanh chóng 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 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 = Inboxes = list() Hàm send_message 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('/') 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 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 = if code == 'OK': sys.stdout.write("Loading ") sys.stdout.flush() for i in messages[0].split(): n = n + 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("", 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 class Gmail def decode_base64(selft, data): missing_padding = len(data) % if missing_padding != 0: data += b'=' * (4 - missing_padding) return base64.decodestring(data) Hàm Show_Sign_In_Window 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('', 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('', 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 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('', 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('', self.click_inbox_button) btnInbox.pack(side=LEFT, padx=5, pady=10) self.list_form.mainloop() Hàm Show_Send_Email_Form 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('', 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('', 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 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 danh sach mail Inbox self.Inboxes.reverse() i = while i