Tải bản đầy đủ (.docx) (17 trang)

Tìm hiểu giao thức và thiết kế ứng dụng gửi thư điện tử

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 (712.48 KB, 17 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA ĐIỆN TỬ

BÁO CÁO ĐỀ TÀI
ĐỀ TÀI:

Tìm hiểu giao thức
và thiết kế ứng dụng gửi thư điện tử
Giảng viên hướng dẫn : TS. Bồ Quốc Bảo
LỚP: Truyền thông mạng máy tính 1
Sinh viên thực hiện:
Nguyễn Thế Cường – 1141150052
Phùng Quang Huy – 1141150009
Nguyễn Khắc Mạnh – 1141150012
Vũ Anh Quyền – 1141150030


Mục Lục
Lời cảm ơn........................................................................................2
Chương I: Cơ Sở Lý Thuyết ..........................................................3
1.1
1.2
1.3
1.4
1.5
1.6

Lý do chọn đề tài ............................................................................................3
Cơ sở lập trình ................................................................................................3
Giới thiệu về Python .......................................................................................3


Giới thiệu về Client/Server..............................................................................4
Giới thiệu về TCP/IP.......................................................................................5
Giới thiệu về HTML và BOOTSTRAP...........................................................6
Chương II: Quy trình và lưu đồ thuật toán .........................................6
2.1 Yêu cầu đề tài..................................................................................................6
2.2 Các thư viện và class được sử dụng trong chương trình ..................................7
2.3 Quy trình ........................................................................................................7
2.4 Lưu đồ thuật tốn ............................................................................................8
Chương III: Viết chương trình....................................................................9
3.1 Phân tích chức năng ........................................................................................9
3.2 Thiết kế..........................................................................................................10
Chương IV: Kết quả ......................................................................................13
4.1 Kết quả...........................................................................................................13
4.2 Hướng dẫn sử dụng chương trình .................................................................14

Tài Liệu Tham Khảo ....................................................................16

2


LỜI CẢM ƠN
Trong thời gian làm bài tập lớn “Tìm hiểu giao thức và thiết kế ứng dụng gửi
thư điện tử”, chúng em đã nhận được nhiều sự giúp đỡ, đóng góp ý kiến và chỉ bảo
nhiệt tình của thầy cô.
Em xin gửi lời cảm ơn chân thành đến TS. Bồ Quốc Bảo, giảng viên bộ mơn Lập
Trình Mạng – Trường Đại học Công Nghiệp Hà Nội người đã tận tình hướng dẫn,
chỉ bảo chúng em trong suốt quá trình làm bài tập lớn.
Em cũng xin chân thành cảm ơn các thầy cô giáo trong Khoa Điện Tử đã dạy dỗ
cho em kiến thức về các môn đại cương cũng như các mơn chun ngành, giúp em
có được cơ sở lý thuyết vững vàng và tạo điều kiện giúp đỡ em trong suốt quá trình

học tập.
Trong quá trình trình bày khó tránh khỏi sai sót, rất mong các thầy, cơ bỏ qua.
Đồng thời do trình độ lý luận cũng như kinh nghiệm 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, cơ để em học thêm được nhiều kinh nghiệm và sẽ hoàn thành tốt hơn
trong những bài báo cáo sau.
Chúng em xin chân thành cảm ơn!

3


Chương I: Cơ Sở Lý Thuyết
1.1 Lý do chọn đề tài
Hiện nay mạng Internet toàn cầu đã phát triển rất mạnh, đáp ứng rất tốt các nhu
cầu về thông tin khoa học, giải trí, liên lạc, mua bán, quảng cáo v.v... của con người.
Internet đã trở thành một thành phần không thể thiếu với cuộc sống hiện đại. Về bản
chất, Internet là một hệ thống mạng, liên kết các máy tính trên tồn thế giới lại theo
những chuẩn chung của nó. Với phạm vi nhỏ hơn nhưng cũng rất tương tự, có
những mạng khác đó là WAN, LAN.., mỗi mơ hình đó đều được ứng dụng rất nhiều
tiện ích khác nhau.
Với mục tiêu để cho các sinh viên ra trường với một kiến thức tốt về mạng, về lập
trình ứng dụng trên mạng để có thể làm được nhiều việc khác nhau, bộ mơn Lập
Trình Mạng ra đời. Vì vậy, để áp dụng kiến thức đã học và muốn làm ra một ứng
dụng có thể áp dụng trong thực tế chúng em đã tìm được đề tài với tên “Tìm hiểu
giao thức và thiết kế ứng dụng gửi thư điện tử
1.2 Cơ sở lập trình
Ứng dụng hoạt động dựa vào giao thức IP/TCP để truyền dữ liệu giữa hai máy
khác nhau, cụ thể ở đây là một máy server để cung cấp dịch vụ và nhiều máy client
sử dụng dịch vụ do máy server cung cấp để cho người dùng sử dụng.
Ngơn ngữ lập trình ở đây là ngơn ngữ Python (Phiên bản 3.7) vì Python là ngơn ngữ

có thể được sử dụng để viết ứng dụng chạy trên hầu hết các thiết bị (ở đây ta quan
tâm tới thiết bị có hỗ trợ mạng). Trọng điểm, có mấy khả năng nổi trội do Python
cung cấp mà ta có thể sử dụng là :
- Lập trình đa tuyến trình (Cùng 1 ứng dụng nhưng có thể chạy nhiều tiến trình
song song với nhau thay vì cứ phải tiến trình này đợi tiến trình kia kết thúc
mới có thể thực hiện)
- Python là một nền tảng có thể chạy trên nhiều loại thiết bị với nhiều hệ điều
hành khác nhau nên có phạm vi ứng dụng rất rộng rãi.
- Lập trình mạng. Lớp quan trọng nhất mà ta sử dụng là lớp Socket và
ServerSocket.
1.3

Giới thiệu về Python

4


Python là một ngơn ngữ lập trình bậc cao, thơng dịch, hướng đối tượng, đa mục
đích và cũng là một ngơn ngữ lập trình động.
Cú pháp của Python là khá dễ dàng để học và ngôn ngữ này cũng mạnh mẽ và linh
hoạt không kém các ngôn ngữ khác trong việc phát triển các ứng dụng. Python hỗ
trợ mẫu đa lập trình, bao gồm lập trình hướng đối tượng, lập trình hàm và mệnh
lệnh hoặc là các phong cách lập trình theo thủ tục.
Python khơng chỉ làm việc trên lĩnh vực đặc biệt như lập trình web và đó là tại
sao ngơn ngữ này là đa mục đích bởi vì nó có thể được sử dụng với web, enterprise,
3D CAD, …
Bạn không cần sử dụng các kiểu dữ liệu để khai báo biến bởi vì kiểu của nó là
động, vì thế bạn có thể viết a=15 để khai báo một giá trị nguyên trong một biến.
Với Python, việc phát triển ứng dụng và debug trở nên nhanh hơn bởi vì khơng cần
đến bước biên dịch và chu trình edit-test-debug của Python là rất nhanh.

Dưới đây là một số đặc điểm chính của Python:
⁺ Dễ dàng để sử dụng: Python là một ngôn ngữ bậc cao rất dễ dàng để sử dụng.
Python có một số lượng từ khóa ít hơn, cấu trúc của Python đơn giản hơn và
cú pháp của Python được định nghĩa khá rõ ràng, … Tất cả các điều này là
Python thực sự trở thành một ngôn ngữ thân thiện với lập trình viên.
⁺ Bạn có thể đọc code của Python khá dễ dàng. Phần code của Python được
định nghĩa khá rõ ràng và rành mạch.
⁺ Python có một thư viện chuẩn khá rộng lớn. Thư viện này dễ dàng tương
thích và tích hợp với UNIX, Windows, và Macintosh.
⁺ Python là một ngơn ngữ thơng dịch. Trình thơng dịch thực thi code theo từng
dịng (và bạn khơng cần phải biên dịch ra file chạy), điều này giúp cho quá
trình debug trở nên dễ dàng hơn và đây cũng là yếu tố khá quan trọng giúp
Python thu hút được nhiều người học và trở nên khá phổ biến.
⁺ Python cũng là một ngơn ngữ lập trình hướng đối tượng. Ngồi ra, Python
cịn hỗ trợ các phương thức lập trình theo hàm và theo cấu trúc.
Ngoài các đặc điểm trên, Python còn khá nhiều đặc điểm khác như hỗ trợ lập trình
GUI, mã nguồn mở, có thể tích hợp với các ngơn ngữ lập trình khác, …
1.3 Giới thiệu về Client/Server
Server được hiểu là máy chủ, thường là một hệ thống máy lớn, có bộ xử lý
mạnh, có khả năng hoạt động đáng tin cậy, có khả năng lưu trữ dữ liệu lớn, nó
chuyên quản lý tài nguyên (chủ yếu là cơ sở dữ liệu), cung cấp các dịch vụ mạng
cho các máy khách (client) sử dụng. Bình thường nó chạy suốt thời gian thực và sẵn
sàng chấp nhận các yêu cầu kết nối và các yêu cầu dịch vụ khác từ máy khách.
Client là máy khách, nó thường được sử dụng bởi người dùng cuối. Nó hoạt
động dựa trên việc sử dụng dịch vụ mà máy server cung cấp để thực hiện các công
việc mà người dùng cuối mong muốn.
Quy trình hoạt động của mơ hình này lặp lại 2 quá trình như sau :
- Client gửi yêu cầu lên server.
- Server nhận được yêu cầu thì sẻ xử lý thích hợp và trả lời lại client.


5


Mơ hình Client/Server
1.5 Giới thiệu về TCP/IP
+) Giới thiệu về TCP
Giao thức TCP (Transmission Control Protocol) là giao thức hướng kết nối
(connection-oriented), nó địi hỏi thiết lập kết nối trước khi bắt đầu gửi dữ liệu
và kết thúc kết nối khi việc gửi dữ liệu hoàn tất theo đúng thứ tự: thiết lập kết
nối, truyền dữ liệu và kết thúc kết nối.
+) Giới thiệu về IP.
IP là địa chỉ của một máy tính trên mạng, dựa vào địa chỉ IP giao thức TCP
có thể truyền dữ liệu chính xác từ một máy này qua máy kia thông qua hệ thống
mạng. Ở trên mạng, một máy tính sẻ có một địa chỉ IP khác nhau, từ địa chỉ IP
có thể biết được máy nào trên mạng và ngược lại.
+) Giới thiệu về cổng Port.
Với IP, giao thức TCP chỉ mới có thể truyền dữ liệu chính xác từ máy này
qua máy kia mà chưa thể truyền chính xác đến từng ứng dụng trên máy được.
Hiện nay, các hệ thống máy thông thường hoạt động theo chế độ đa nhiệm,
nghĩa là có nhiều ứng dụng chạy cùng một lúc và trong đó có thể có nhiều ứng
dụng sử dụng dịch vụ mạng. Yêu cầu, khi máy chủ A truyền dữ liệu cho một ứng
dụng u trên máy B thì trên máy B phải đảm bảo dữ liệu đó phải đến được ứng
dụng u, chứ không phải ứng dụng v.
Để thực hiện điều đó thì máy chủ A khi truyền dữ liệu đi thì trên dữ liệu đó
có một thành phần thơng tin giúp máy B xác định được đúng ứng dụng u. Phần
thơng tin đó chính là địa chỉ port trên máy B, nó có thể hiểu là lỗ cắm ảo trên
máy B mà ứng dụng u đã đăng ký để độc quyền sử dụng nhằn nhận dữ liệu từ
máy chủ A.
Trên thực tế, địa chỉ port là một số nguyên 2 byte có giá trị từ 0 đến 65535.
Nó có đặc điểm :


6


-

Giá trị từ 0 đến 1023 là các cổng phổ biến dành cho các ứng dụng thông
dụng như http: 80, mail : 25, ftp : 21, Telnet 23.... Các giá trị cịn lại có thể
được sử dụng linh hoạt.

-

Mỗi cổng trong mỗi thời điểm được sử dụng cho tối đa là 1 ứng dụng. Ví dụ
như một ứng dụng nào đó đã sử dụng cổng 55 thì ứng dụng khác khơng thể
sử dụng cổng 55 đó nữa chừng nào ứng dụng trước đó chưa có đóng cổng 55
lại.

1.6 Giới thiệu về HTML và BOOTSTRAP
+ HTML và BOOSTRAP HTML( Hyper Text Markup Language) ngơn ngữ
lập trình siêu văn bản: là một trong những ngôn ngữ được sử dụng rộng rãi và phổ
biến nhất với đa số những người muốn tạo lập trang web cá nhân hay tổ chức. Có
thể nói HTML chính là xương sống của một trang web. BOOSTRAP: Bootstrap là
một framework cho phép thiết kế website reponsive nhanh hơn và dễ dàng hơn
+ Bootstrap là bao gồm các HTML templates, CSS templates và Javascript tao
ra những cái cơ bản có sẵn như: typography, forms, buttons, tables, navigation,
modals, image carousels và nhiều thứ khác. Trong bootstrap có thêm các plugin
Javascript trong nó. Giúp cho việc thiết kế reponsive của bạn dễ dàng hơn và nhanh
chóng hơn. Lịch sử Bootstrap Bootstrap là dược phát triển bởi Mark Otto và Jacob
Thornton tại Twitter. Nó được xuất bản như là một mã nguồn mở vào tháng 8 năm
2011 trên GitHub. Tính ra đến thời điểm mình viết bài viết này nó cũng đã phát

triển được 3 năm rồi. Bản bootstrap mới nhất bây giờ là bootstrap 3.

Chương II: Quy trình và lưu đồ thuật tốn
2.1 u cầu đề tài
Thiết kế chương trình và giao điện để mọi người có thể gửi thư điện tử cho một
hay nhiều người một cách dễ dàng cho nhau bao gồm gửi ảnh, file và các tệp . Các
thư gửi được sẽ được thông báo là đã gửi thành công .
2.2 Các thư viện và class được sử dụng trong chương trình
+ Thư viện CGI

7




CGI (là viết tắt của Common Gateway Interface) là một tập hợp các chuẩn
mà định nghĩa cách thông tin được trao đổi giữa Web Server và một Custom
Script.



Trong ứng dụng của chúng em thì thư viện CGI dùng để lấy dữ liệu từ phía
client về server để xử lí

+ Thư viện smtplib và email.mime
2 thư viện trên là những thư viện hỗ trợ cho việc gửi email.
Email.mime dùng để tạo một đối tượng email
Giao thức gửi thư đơn giản (SMTP) là một giao thức xử lý việc gửi e-mail và
định tuyến e-mail giữa các máy chủ thư.
Python cung cấp mô-đun smtplib, định nghĩa một đối tượng phiên máy khách

SMTP có thể được sử dụng để gửi thư đến bất kỳ máy Internet nào có trình nền
trình nghe SMTP hoặc ESMTP.
+ Thư viện os
Dùng để thao tác với file, thư mục
+ Thư viện http.server
Để sử dụng do_GET và do_PORT ta phải kế thừa từ class
BaseHTTPRequestHandler
HTTPServer

((host,

port),

phương

thức

được

kế

thừa

từ

BaseHTTPRequestHandler) để khi chạy chương trình nó sẽ chạy trên địa chỉ với
host và port đã cho
+ class encoders (import từ thư viện email)
Dùng để mã hóa các tệp tin mà người dùng muốn gửi sang dạng base64 sau đó được
gửi tới người nhận


8


2.3 Quy trình

Bước 1 : Tìm hiểu về send mail sử dụng ngôn ngữ python
Bước 2 : Kết hợp send mail với Web Server
Bước 3 : Tạo giao diện người dùng ( HTML + Bootrap) và tích hợp vào bước

2.2 Lưu đồ thuật tốn

LƯU ĐỒ THUẬT TỐN CỦA CHƯƠNG TRÌNH
Begin

Nhập dữ liệu cho thẻ input

Click SEND

Đúng kiểu dữ liệu input

9


Gửi dữ liệu về server

Gửi thành công

Hiển thị trang
sendfs.html


Hiển thị trang
sendss.html

End

Chương III: Viết chương trình
3.1 Phân tích chương trình
B1 : Để gửi mail sử dụng python chúng ta cần import thư viện hỗ trợ gửi mail
(smtplib) và các class (MIMEText, MIMEMultipart, MIMEBase)
Đầu tiên là hàm create_email_message
create_email_message(from_address, to_address, subject, msg_body, files=None)
Các tham số truyền vào :
-

from_address : địa chỉ Email của người gửi
to_address : địa chỉ Email của người nhận
subject : tiêu đề của thư
msg_body : nội dung thư
files : gửi các file đính kèm (nếu có)

10


Đầu ra : là một đối tượng MIMEMultipart đã chứa các thông tin cần thiết để gửi
mail
B2 : Kết hợp send mail với Web Server
class Serv(BaseHTTPRequestHandler):
def do_GET(self):
# code

def do_POST(self):
# code
Import class hỗ trợ cho Web Server (HTTPServer, BaseHTTPRequestHandler) từ
thư viện http.server , Import cgi (hỗ trợ lấy data từ các input bên phía Client trả về)
-

Tạo một class có tên Serv dùng để kế thừa các phương thức như do_GET,

-

do_POST từ class BaseHTTPRequestHandler
do_GET có nhiệm vụ trả ra các view về phía client để người dùng nhập dữ

-

liệu và gửi về cho server
do_POST sẽ nhận các dữ liệu từ client để xử lý thông qua phương thức
FieldStorage của thư viện cgi

B3 : Tạo giao diện người dùng sử dụng HTML + Bootstrap
3.2 Thiết kế
from http.server import HTTPServer, BaseHTTPRequestHandler
import cgi
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os
file_dir = "D:\\local"

host = 'localhost'
port = 8080
def create_email_message(from_address, to_address, subject, msg_body,
files=None, html=None):
msg = MIMEMultipart()
msg['From'] = from_address
11


msg['To'] = ",".join(to_address)
msg['Subject'] = subject
msg.attach(MIMEText(msg_body, 'plain'))
if html is not None:
msg.attach(MIMEText(html, 'html'))
if files is not None:
for file in files:
try:
attachment = open(file, 'rb')
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
file_name_sended = file.split("\\")[-1]
part.add_header('Content-Disposition', "attachment; filename= " +
file_name_sended)
msg.attach(part)
except Exception as ex:
print("could not attache file")
print(ex)
return msg
def handler_send_mail(self, form, lst_email, msg):

try:
with smtplib.SMTP('smtp.gmail.com', port=587) as smtp_server:
smtp_server.ehlo()
smtp_server.starttls()
smtp_server.login(str(form['Email'].value), str(form['Password'].value))
smtp_server.sendmail(str(form['Email'].value), lst_email, msg.as_string())
print('send mail Success !!')
self.path = '/sendss.html'
file_to_open = open(self.path[1:]).read()
self.send_response(200)
self.wfile.write(bytes(file_to_open, 'utf-8'))
except Exception as e:
print(e)
self.path = '/sendfs.html'
file_to_open = open(self.path[1:]).read()
self.send_response(200)
self.wfile.write(bytes(file_to_open, 'utf-8'))
er = "

Error : %s

" % str(e)
self.wfile.write(bytes(er, "UTF-8"))
print('send mail Fail !')
def send_multiple_files(fileitem, lst_file_name):
fn = os.path.basename(fileitem.filename)
if fileitem.filename:
12


open(file_dir + fn, 'wb').write(fileitem.file.read())
lst_file_name.append(file_dir + fn)
print(" ONE - FILE " + fn + " upload success !\n")
else:

print("upload fail file "+fn+" !\n")
class Serv(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.path = '/index.html'
try:
file_to_open = open(self.path[1:]).read()
self.send_response(200)
except:
print("exception !!")
file_to_open = "File not found"
self.send_response(404)
self.end_headers()
self.wfile.write(bytes(file_to_open, 'utf-8'))
def do_POST(self):
if self.path == '/index.html':
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': self.headers['Content-Type']}
)
self.send_response(200)
self.end_headers()
lst_email = str(form['sendto'].value).split(",")
fileitem = form['filename']
lst_file_name = []
if str(fileitem) != "FieldStorage('filename', '', b'')":
print("khac rong")
if str(type(fileitem)) == "<class 'cgi.FieldStorage'>":

print("1 value !")
send_multiple_files(fileitem, lst_file_name)
else:
print("nhieu gia tri")
for file in fileitem:
send_multiple_files(file, lst_file_name)
for s in lst_file_name:
13


print("url : " + s)
else:
print("rong")
msg = create_email_message(
from_address=str(form['Email'].value),
to_address=lst_email,
subject=str(form['Subject'].value),
msg_body=str(form['message'].value),
files=lst_file_name
)
print(lst_email)
handler_send_mail(self, form, lst_email, msg)
return
httpd = HTTPServer((host, port), Serv)
httpd.serve_forever()

Chương IV: Kết quả
4.1 Kết quả

14



4.2 Hướng dẫn sử dụng chương trình
Run chương trình

15


Truy cập địa chỉ localhost:8080

16


Tài khoản và mật khẩu
email gửi thư

List email nhận thư

Nội dung chủ đề và các file cần gửi đi
Reset : để chọn lại các mục về trắng
Send : bắt đầu gửi thư

Thư được gửi thành công

17


Thư gửi bị lỗi

Trong trường hợp thư gửi bị lỗi cần kiểm tra email người gửi đúng hay sai


Tài Liệu Tham Khảo
[1] B. Q. Bảo, Python rất đơn giản, 2019.
[2] " [Online].
[3] "www.toidicode.com," [Online].
[4] " [Online].
[5] " [Online].

18



×