Hướng dẫn sử dụng thư điện tử
LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT LỜI GIỚI THIỆU Trang chủ | Mục lục T ™&˜ hư điện tử (Mail) dịch vụ internet rấtù phổ biến Cùng với phát triển không ngừng hệ thống mạng máy tính rộng khắp toàn cầu, việc sử dụng dịch vụ Mail không xa lạ người sử dụng Dịch vụ Mail giúp người trao đổi thông tin với cách nhanh chóng, tiện lợi, có tính kinh tế cao Số lượng thư điện tử hàng ngày gởi Internet lên đến hàng vạn, hàng triệu,… nhiều Thư tín điện tử không đơn ghi chép cá nhân gởi từ người dùng đến người dùng khác mạng, mà dùng bạn gửi cho loại tài liệu như: văn bản, báo cáo, chương trình máy tính, … vàø nhiều thông tin khác Lợi ích là: cho phép người cách xa làm việc chung với dự án, dự án nghiên cứu lớn đòi hỏi cần phải có nhiều người tham gia, người tham gia vào dự án không nằm quốc gia, họ thuộc nhiều vùng khác giới, họ chưa biết mặt Thay trao đổi với qua đường bưu điện bình thường, người ta sử dụng Internet Nó cho phép liên lạc nhanh hơn, thuận tiện hơn, chi phí thấp nhiều so với trao đổi thư từ qua đường bưu điện bình thường Đối với thực tế nước ta, nước phát triển, việc gia nhập vào Internet thực vài năm gần Nhu cầu sử dụng Mail để gởi nhận thông tin với giới bên lớn Tuy nhiên, chi phí cho mục đích lớn so với nước khác Do đó, công ty có tầm cỡ nhỏ trung bình, việc trang bị cho thành viên công ty Account Mail riêng dùng để gởi nhận Mail với bên không cần thiết lãng phí Gần đây, xuất nhiều chương trình cần sử dụng Account Mail mà cho phép nhiều người gởi nhận Mail giống người sử dụng Account riêng Việc sử dụng chương trình mang lại lợi ích lớn cho công ty có qui mô vừa nhỏ Nó làm giảm chi phí cách đáng kể cho công ty Do thay phải trang bị cho thành viên công ty Account Internet Mail để thành viên gởi nhận Mail với giới bên người ta cần sử dụng Account Mail mà thực mục đích Tuy nhiên, chương trình phần lớn viết để sử dụng hệ điều hành Window, bao gồm : Window 9x, Windown NT… , hệ điều hành có giao diện thân thiện dể sử dụng hãng Microsoft Gần đây, SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT xuất hệ điều hành Linux, biến thể hệ điều hành Unix, hệ điều hành thường sử cho máy Server tính ổn định bảo mật cao Hệ điều hành Unix không phổ biến hệ điều Window khó học có giao diện không thân thiện Nhưng Linux với tính ổn định bảo mật cao vốn có thừa hưởng từ hệ điều hành Unix gần đây, hổ trợ hãng: RedHat, OpenLinux, … có giao diện dễ sử dụng thân thiện không Window Việc nghiên cứu sử dụng Linux điều cần thiết Từ quan điểm này, chúng em nghiên cứu xây dựng chương trình Shared Mail Đây chương trình thực thi hệ điều hành Linux, mà sử dụng Account Mail phép nhiều người gởi nhận Mail Do tiếp xúc với Linux ngôn ngữ C ,thư viện lập trình C Linux, đồng thời phải tìm hiểu nghi thức TCP/IP, giao thức SMTP, POP3 cách vận dụng chúng vào chương trình, mặt khác gặp nhiều cố trình nghiên cứu mạng kinh nghiệm lập trình non nên chương trình chúng em khó tránh sai sót, nhiều hạn chế Rất mong góp ý dẫn dắt Q thầy cô bạn để chương trình ngày hoàn thiện SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT PHẦN I TÌM HI ỂU CÁC GIAO THỨC TRUYỀN NHẬN MAIL ∆∆∆∆ CHƯƠNG I : CÁC KHÁI NIỆM CƠ BẢN CHƯƠNG II : GIAO THỨC SMTP CHƯƠNG II : GIAO THỨC POP3 SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT CHƯƠNG I: CÁC KHÁI NIỆM CƠ BẢN Giao thức giao tiếp (protocols) qui tắc, luật lệ mà trình truyền nhận thông tin mạng phải tuân theo cách triệt để Các cấp nghi thức chia thành nhiều cấp (layer), cấp nghi thức giải nhiệm vụ cụ thể trình truyền nhận thông tin I GIỚI THIỆU VỀ HỆ THỐNG OSI: OSI (Open Systems Interconnection reference Model) hệ thống nghi thức dùng phổ biến nay, bao gồm bảy cấp nghi thức: Physical, Data Link, Network, Transport, Session, Presentation, Application - Physical Layer: cung cấp kết nối vật lý computer network Bao gồm chuẩn sử dụng Truyền nhận theo bit - Data Link Layer: lớp thực việc đóng gói (pakages) mở gói (unpakages) liệu truyền Nó chuyển đổi thông tin thành frame Một frame bao gồm nhiều bit có header - Network Layer: xác định đường nhanh (routing) thông tin mạng, bao gồm nối kết định hướng (connection – oriented) nối kết không định hướng (connectionless) - Transport Layer: truyền nhận liệu theo gói đánh số - Session Layer: mức cao cấp transport - Presentation Layer: đảm bảo cho việc truyền nhận tin cậy hiệu quả, không bị thay đổi trình truyền qua mạn g - Application Layer: cung cấp giao tiếp với trình ứng dụng mà user sử dụng: electronic mail, file transfer, … Khi trình máy muốn giao tiếp với trình máy khác, phải gởi thông tin qua bảy cấp nghi thức giao tiếp máy Mỗi cấp nghi thức xử lý thêm vào thông tin cần thiết Sau cấp Physical truyền thông tin qua máy Máy nhận thông tin xử lý bảy cấp nghi thức cấp nghi thức hiểu thông tin cấp thông qua việc đọc header Cuối có thông tin ban đầu máy gởi Việc truyền nhận thông tin qua bảy lớp không thực dụng cho đòi hỏi phải tốn nhớ cho phần header thời gian CPU dùng để xử lý overhead Do hệ thống phân bố, người ta sử dụng phần cấp nghi thức đưa mô hình dựa cấp nghi thức này, giao thức TCP/IP SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP II GVHD : NGUYỄN CAO ĐẠT SƠ LƯC VỀ GIAO THỨC TCP/IP VÀ MÔ HÌNH CLI ENT/SERVER: GI AO THƯ ÙC TCP /I P: Giao thức TCP/IP tập hợp chuẩn mà mô tả cách thức máy tính mạng liên lạc với cách thức liệu truyền qua máy tính kết nối với TCP/IP giao thức thường gọi giao thức Internet TCP/IP cho phép người lập trình ứng dụng thiết lập liên lạc hai trình ứng dụng bên hệ thống Đây kiểu truyền thông Peer-ToPeer (ngang cấp) Các trình ứng dụng ngang cấp thực việc truyền thông máy hay máy khác TCP/IP xác định chi tiết liệu truyền ứng dụng không xác định rõ ràng trình ứng dụng ngang cấp tương tác với TCP/IP có đặc điểm sau làm cho phát triển phổ dụng: - Độc lập với cách nối mạng - Độc lập với phần cứng mạng - Các nghi thức theo chuẩn hệ mở - Có cách đánh địa phổ dụng - Cung cấp dịch vụ sử dụng rộng rãi như: Email, Ftp, Telnet, … - Là sở để xây dựng ứng dụng theo mô hình Client/Server MÔ HÌNH PHÂN LỚP TCP/IP: Application Layer Transport Layer Internet Layer Host-to-Host Layer SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP - - - - GVHD : NGUYỄN CAO ĐẠT Application Layer: lớp chứa ứng dụng mà sử dụng network như: ftp, web browser, … Lớp Application mô hình TCP/IP tương đương với lớp Application Presentation mô hình OSI Transport Layer: lớp cung cấp phân phối liệu end-to-end Tương đương với lớp hai lớp Session Transport mô hình OSI Internet Layer: lớp định nghóa datagram việc routing datagram Datagram packet tạo giao thức IP Datagram chức đựng thông tin địa đích, liệu điều khiển khác Tương đương với hai lớp Network Datalink mô hình OSI Physical Layer: TCP/IP dùng chuẩn có để truyền liệu MÔ HÌNH CLIENT/SERVER: Việc sử dụng mạng nhằm mục đích chia tài nguyên máy tính mạng với Ở đây, cần phân biệt rõ khái niệm Client khái niệm Server - Thuật ngữ Server dùng để chương trình mà cung cấp dịch vụ đạt tới thông qu network Các Server nhận yêu cầu đến từ mạng, thực việc phục vụ trả lại kết - Thuật ngữ Client dùng để chương trình ứng dụng mà gởi yêu cầu đến Server chờ kết trả Request Client Server Reply Network Mô hình Client/Server Các chương trình Client Server thường thực thi máy khác Mỗi chương trình Server đáp ứng cho nhiều chương trình Client nhiều máy tính khác lúc GI AO TI ẾP SOCKET: Socket chế truy xuất file mà cung cấp endpoint (điểm cuối) cho việc liên lạc Giống việc truy xuất file, chương trình ứng dụng yêu cầu hệ điều hành tạo socket cần thiết Hệ thống trả lại số diễn tả cho socket tạo gọi socket descriptor Sự khác file descriptor socket descriptor file descriptor hệ điều hành phải liên kết với file hay thiết bị đó, socket descriptor cần phải liên kết với địa tạo Có loại socket mô tả sau: - Stream socket: cung cấp dòng liệu hai hướng (bidirectional), tin cậy, tuần tự, không trùng lặp liệu SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT A datagram socket: cung cấp dòng liệu hai hướng mà không đảm bảo tính tuần tự, độ tin cậy, hay trùng lặp - A raw socket: cung cấp chế truy xuất giao thức truyền thông lớp mà hỗ trợ cho socket Dưới sáu chức mà socket API cung cấp cho chúng ta: - open: mở socket - send: gởi liệu đến socket - receive: nhận liệu từ socket - status: chứa thông tin trạng thái socket - close: đóng kết nối - abort: hủy bỏ tác vụ thực đóng kết nối - II I GIỚI THIỆU HỆ THỐNG VÀ DỊCH VỤ EMAIL: Email phương tiện truyền thông tiện lợi nhanh chóng, rẽ tiền, sử dụng rộng rãi Internet Khi nhắc đến Internet người ta không nói đến Email Sau đây, xét đến số khái niệm mạng Email CÁC THÀNH PHẦN CỦA MỘT HỆ THỐNG EMA IL: Một hệ thống Email bao gồm phần sau: - Người gởi người nhận - Phần giao tiếp với hệ thống Email, chương trình Email mà sử dụng Hệ thống mạng Email gồm có: - Một vùng đệm dùng để chứa message trước gởi - Một chương trình client - Một chương trình Server - Các MailBox dùng để chứa thư nhận Trong đa số hệ thống mạng Email nay, công cụ giao tiếp user với hệ thống Email thường gắn với chương trình Client MailBox địa hộp thư user, nơi chứa đựng liệu Email CÁC THÀNH PHẦN CỦA MỘT HỆ THỐNG INTERN ET MA IL: User Agent (UA) thay cho chương trình Email phận MTA thay cho trình Server, Client Người sử dụng tương tác với chương trình User Agent, mà thay cho bạn việc tương tác với kho chứa liệu Email (hay MTA) User Agent che chắn cho bạn khỏi phải tương tác với mớ hệ thống Email khác Cũng tương tự MTA che chắn hệ thống Email tương tác với quan đại diện người sử dụng (UA) hay MTA khác Điều giúp cho hệ thống Email trở nên thân thiện, gần gũi với người sử dụng - mục đích chương trình Mail khác SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT IV CẤU TRÚC CỦA MỘT BỨC MAIL: tạo Về bản, Mail bao gồm phần chính: Phần phong bì: Mô tả thông tin người gởi người nhận Do hệ thống Phần tiêu đề (header): chứa đựng thông tin người gởi, người nhận, chủ đề Mail, địa hồi âm v.v Các thông tin này, số người sử dụng cung cấp gởi Mail, số khác chương trình Mail thên vào, số lại Hệ thống điền thêm Phần nội dung (body): chứa đựng nội dung Mail, nội dung tạo trình soạn thảo Editor chương trình Mail Sau chi tiết phần: PHẦN PHONG BÌ ( ENVELOP E): Phần MTA tạo sử dụng, chứa thông tin để chuyển nhận email địa nơi nhận, địa nơi gửi Hay nói cách khác, giao thức SMTP quy định thông tin phong bì, hệ thống Email cần thông tin để chuyển liệu từ máy tính sang máy tính khác PHẦN TI ÊU ĐỀ ( HEADER): Phần cung cấp thông tin tổng quát Email người nhận, người gửi, ngày nhận Cấu tạo gồm nhiều trường (field) cấu trúc trường dòng văn ASCII chuẩn bit sau: : Sau số trường thông dụng ý nghóa : - Date: ngày nhận mail - From: người gởi - To: người nhận - Cc: người nhận copy mail - Bcc: người nhận copy mail, người người nhận thư - Return-path: chứa thông tin để người nhận trả lời lại (thường địa người gởi) - Subject: chủ đề nội dung Email Các trường trường chuẩn giao thức SMTP quy định, phần header có thêm số trường khác chương trình Email tạo nhằm quản lý email mà chúng tạo Các trường bắt đầu ký tự X- thông tin theo sau giống ta thấy trường chuẩn PHẦN NỘI DUNG ( BODY): Để phân biệt phần tiêu đề phần nội dung Mail, người ta qui ước đặt ranh giới dòng trắng (chuỗi ký tự "\r\n") Kết thúc phần nội dung chuỗi ký tự kết thúc Mail: "\r\n.\r\n" Như nội dung Mail nằm khoảng dòng trắng ký tự kết thúc Mail, phần nội SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT dung Mail không phép tồn chuỗi ký tự kết thúc Mail Mặt khác môi trường truyền thông mạng Internet nên ký tự cấu thành phần body Mail phải ký tự ASCII chuẩn SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT CHƯƠNG II: GIAO THỨC SMTP ]]] GIỚI THIỆU: I Mục đích giao thức SMTP truyền mail cách tin cậy hiệu Giao thức SMTP không phụ thuộc vào hệ thống đặc biệt yêu cầu trật tự liệu truyền kênh truyền đảm bảo tính tin cậy II MÔ HÌNH CỦA GIAO THỨC SMTP: File system SMTP Command/Replies and Mail Reciever SMTP User Sender - SMTP Giao thức SMTP thiết kế dựa vào mô hình giao tiếp sau: có yêu cầu từ user dịch vụ mail, sender-SMTP thiết lập kênh truyền hai chiều tới reciever-SMTP Reciever- SMTP đích cuối đích trung gian nhận mail Các lệnh giao thức SMTP sender-SMTP gởi tới reciever-SMTP reciever-SMTP gởi đáp ứng trở lại cho senderSMTP File system Mô hình giao thức SMTP II I ĐẶC TẢ CHO SMTP: CÁC LỆNH CỦA SMTP: a Ýnghó a l ệnh: Những lệnh SMTP định nghóa truyền mail hay chức hệ thống mail yêu cầu user Những lệnh SMTP chuỗi ký tự kết thúc Bản thân mã lệnh ký tự chữ (alphabetic) kết thúc có tham số theo sau Cú pháp mailbox phải tuân theo qui ước receiver SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 10 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT /*address of this computer*/ char clientname[MAXHOSTNAMELEN + 1]; /*name of client*/ char clientaddr[15]; /*address of this client*/ unsigned short port; char sender[256]; /*user send this mail*/ char receiver[MAX_USER][256]; /*list of local reciever*/ int num_recv; /*number of local receiver*/ char userfar[MAX_USER][256]; /*list of non_local receiver*/ int num_userfar; /*number of non_local receiver*/ }smtp_info; CAÙCH HOA ÏT Đ ỘNG CỦA CHƯƠNG TR ÌNH SMTPD: Khi chương trình SMTPD thực thi, đầu tiên, khởi tạo khối smtp_info cách gọi hàm: smtp = (smtp_info *)malloc(sizeof (smtp_info)); Sau khởi tạo khối smtp_info xong, tiếp đến, lưu lại tên máy địa IP mà chương trình SMTPD chạy vào biến smtp>myhostname smtp->myaddr Sau hoàn thành xong tác vụ này, SMTPD khởi tạo socket chờ yêu cầu kết nối từ máy client Nếu có yêu cầu kết nối từ client, lưu lại địa IP máy client smtp->clientaddr thực việc tìm kiếm tên máy client gethostbyaddr(), có, lưu lại tên máy smtp->clientname Sau đó, SMTPD tạo hai stream dùng cho việc trao đổi liệu với đầu vào lưu giữ smtp->ifile (với FILE *smtp->ifile) đầu lưu giữ smtp->ofile (với int smtp->ofile), kết hợp với socket Sau kết nối thành công, SMTPD gởi lại cho client thông báo: 220 smtp->myhostname Simple Mail Transfer Service Ready Sau đó, bắt đầu vào vòng lặp chờ nhận yêu cầu từ client gởi đến thực while (1) { readlh(smtp->ifile, inbuf, SIZBUF); memcpy(last_state, current_state, sizeof(smtp_state_set)); chop(inbuf); smtp_parse_cmd(inbuf, current_state); } SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 57 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT Khi có yêu cầu từ phía client gởi qua, SMTPD lưu giữ vào biến inbuf, sau gọi hàm smtp_parse_cmd(inbuf, current_state) để phân tích yêu cầu xử lý Như biết, lệnh giao thức SMTP (Simple Mail Transfer Protocol) thường có độ dài ký tự Do đó, gọi lên thực thi, hàm smtp_parse_cmd() lấy ký tự inbuf để kiểm tra xem lệnh để thực theo yêu cầu client Trong trường hợp lệnh bị sai SMTPD không hổ trợ lệnh thông báo lại cho client biết để xử lý Khi client gởi lệnh “helo” SMTPD trả cho client chuoåi: “250 smtp->myhostname Hello smtp->clientname [ smtp->clientaddr ], please to meet you.” Để báo cho client biết phiên thực vừa thành công, yêu cầu client gởi lệnh theo trình tự nghi thức Phần code mô tả trình thực nhiệm vụ naøy: if ((strcasecmp(verb, "HELO") == 0) || (cmd_ok(EHLO, state) && (strcasecmp(verb, "EHLO") == 0))) { /*kiểm tra xem lệnh “helo” gởi hay chưa */ if (!cmd_ok(HELO, state)) { sprintf(outbuf, "503 Duplicate HELO/EHLO\n"); writeline(smtp->ofile, outbuf); state_change(state, HELO, FAILURE); return; } SPANBLANK(buf); /*kiểm tra xem có phần liệu theo sau lệnh helo hay không*/ if (*buf == '\0') { sprintf(outbuf, "501 %s requires domain address\n",verb); writeline(smtp->ofile, outbuf); state_change(state, HELO, FAILURE); return; } sendinghost = strdup(buf); if (sendinghost == NULL) exit(-1); if (!strcasecmp(verb, "HELO")) { sprintf(outbuf, "250 %s Hello %s [%s], pleased to meet you\n", smtp->myhostname, smtp->clientname, smtp->clientaddr); writeline(smtp->ofile, outbuf); SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 58 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ÑAÏT } else { sprintf(outbuf, "250-%s Hello %s [%s], pleased to meet you\n", smtp->myhostname, smtp->clientname, smtp->clientaddr); writeline(smtp->ofile, outbuf); } state_change(state, HELO, SUCCESS); } Khi client gởi tiếp lệnh “mail from: sender@domain “, thông số sender@domain dùng làm “Return-path” mail trường hợp người nhận thuộc hệ thống Nếu người nhận không thuộc hệ thống (bức mail gởi bên chương trình thực việc ánh xạ từ sender@domain thành fullname_of_sender < mail_address > để làm “Returnpath” cho mail, với fullname_of_sender tên đầy đủ user hệ thống chúng ta, mail_address địa mail nhà cung cấp dịch vụ mail cấp cho Nếu thực lệnh thành công, SMTPD gởi lại cho client thông báo: “250 sender@domain Sender Ok” Trong trường hợp ngược lại, SMTPD gởi thông báo lỗi lại cho client để client xử lý Phần code mô tả trình thực nhiệm vụ này: if (strcasecmp(verb, "MAIL") == 0) { char *name; if (!cmd_ok(MAIL, state)) { /*kiểm tra xem có lệnh “helo” chưa ?*/ if (cmd_ok(HELO, state)) { sprintf(outbuf, "503 Need HELO before MAIL\n"); writeline(smtp->ofile, outbuf); state_change(state, MAIL, FAILURE); } /*kieåm tra xem client gởi lệnh “mail” chưa ?*/ else { sprintf(outbuf, "503 Sender already specified\n"); writeline(smtp->ofile, outbuf); state_change(state, MAIL, ERROR); } return; SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 59 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT } /*kiểm tra xem sau chuổi “mail” có phải chuổi “from” không ?*/ SPANBLANK(buf); if (strncasecmp(buf, "FROM:", 5) != 0) { sprintf(outbuf, "501 Syntax error in parameters or arguments\n"); writeline(smtp->ofile, outbuf); state_change(state, MAIL, ERROR); return; } buf += 5; SPANBLANK(buf); /*xử lý phần địa nhận được*/ return_path = del_bracket(buf); if (strstr(return_path, smtp->myhostname) || strstr(return_path, "localhost")) { name = username(return_path); strcpy(smtp->sender, name); free(name); } else strcpy(smtp->sender, return_path); } sprintf(outbuf, "250 %s Sender ok\n", buf); writeline(smtp->ofile, outbuf); state_change(state, MAIL, SUCCESS); Kế tiếp, client gởi lệnh “rcpt to: receiver@domain” Vì thư gởi cho nhiều người nên phần địa người nhận kiểm tra lưu giữ lại Nếu người nhận hệ thống phần địa lưu giữ lại dãy smtp->receiver (đối với người nhận cục bộ, ta gởi tên user thôi, không cần thêm dấu “@” tên domain nó) Và người nhận không hệ thống, tức gởi bên địa người nhận lưu giữ dãy smtp->userfar Trong qúa trình kiểm tra người nhận, có lỗi xảy ra, thông báo lỗi gởi cho client Trong trường hợp ngược lại, chuổi “250 receiver@domain Receiver Ok” gởi lại cho client Phần code mô tả trình thực nhiệm vụ này: if (strcasecmp(verb, "RCPT") == 0) { SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 60 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT char *victim, *name; struct passwd *pwd; int i, yes_user; /*kiểm tra xem client gởi lệnh “mail” chưa*/ if (!cmd_ok(RCPT, state)) { sprintf(outbuf, "503 Need MAIL before RCPT\n"); writeline(smtp->ofile, outbuf); state_change(state, RCPT, ERROR); return; } /*kieåm tra xem sau chuổi “rcpt” có phải chuổi “to:” hay khoâng ?*/ SPANBLANK(buf); if ((strlen(buf) < 3) || strncasecmp(buf, "TO:", 3) != 0) { sprintf(outbuf, "501 Syntax error in parameters or arguments\n"); writeline(smtp->ofile, outbuf); state_change(state, RCPT, ERROR); return; } buf += 3; SPANBLANK(buf); /*trường hợp dấu “@”, người nhận cục bộ, lưu giữ lại vào dãy smtp->receiver*/ victim = del_bracket(buf); if (!strchr(victim, '@')) { if (smtp->num_recv < MAX_USER) { i = 0; yes_user = 0; while (i < smtp->num_recv) { if (!strcmp(pwd->pw_name, smtp->receiver[i])) { yes_user = 1; break; } else i++; } if (!yes_user) { strcpy(smtp->receiver[smtp->num_recv], victim); SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 61 LUẬN VĂN TỐT NGHIỆP } GVHD : NGUYỄN CAO ĐẠT smtp->num_recv++; } } else { name = username(victim); /*trường hợp có dấu “@”, kiểm tra xem user có nằm hệ thống hay không ?*/ if ((pwd = getpwnam(name)) && ((strstr(victim, smtp-> myhostname)) || (strstr(victim, "localhost")))) { if (smtp->num_recv < MAX_USER) { i = 0; yes_user = 0; while (i < smtp->num_recv) { if (!strcmp(pwd->pw_name, smtp->receiver[i])) { yes_user = 1; break; } else i++; } if (!yes_user) { strcpy(smtp->receiver[smtp->num_recv], pwd-> pw_name); smtp->num_recv++; } } } else /*goi cho user o ben ngoai he thong*/ { if (smtp->num_userfar < MAX_USER) { i = 0; yes_user = 0; while (i < smtp->num_userfar) { if (!strcmp(pwd->pw_name, smtp->userfar[i])) { yes_user = 1; SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 62 LUẬN VĂN TỐT NGHIỆP } GVHD : NGUYỄN CAO ÑAÏT break; } else i++; if (!yes_user) { strcpy(smtp->userfar[smtp->num_userfar], pw_name); smtp->num_userfar++; } } } pwd-> } } sprintf(outbuf, "250 %s Ricipient ok\n", victim); writeline(smtp->ofile, outbuf); state_change(state, RCPT, SUCCESS); Tieáp đến, client gởi lệnh “data” sau đó, gởi nội dung mail Phần liệu không qua xử lý hàm smtp_parse_cmd(), phần nội dung mail, lệnh SMTPD nhận phần liệu lưu giữ vào file tạm Dữ liệu kết thúc chuỗi “.\r\n” Phần code mô tả trình thực nhiệm vụ này: if ((!test_state(SNARF_DATA, last_state)) && (test_state(SNARF_DATA, current_state))) { tempfile = (char *)malloc(80*sizeof(char)); strcpy(tempfile, TMPFILE); if ((f_tmp = fdopen(mkstemp(tempfile), "w+t")) == NULL) { /*trường hợp mở file không thành công*/ clear_state(SNARF_DATA, current_state); clear_state(OK_RCPT, current_state); clear_state(OK_MAIL, current_state); } else { readlh(smtp->ifile, inbuf, SIZBUF); while (inbuf[0] != '.') { SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 63 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT fixcrlf(inbuf, 0); fputs(inbuf, f_tmp); readlh(smtp->ifile, inbuf, SIZBUF); } } fclose(f_tmp); } Đối với người nhận cục thư chuyển đến mailbox người nhận sau client gởi lệnh “data” liệu qua Còn người nhận không cục thư chuyển đến hộp thư outbox “/var/spool/sharedmail/outbox” để gởi Khi client gởi lệnh “quit”, SMTPD gởi lại cho client chuổi: “221 smtp->hostname Service closing transmission channel” kết nối đóng lại SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 64 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT CÁC LƯU ĐỒ Lưu đồ lệnh HELO Client gởi lệnh “helo” chưa ? yes no Lưu lại domain sender return(message(250, )) ( Sender send “MAIL FROM:” ) return(message(503, )) Lưu đồ lệnh QUIT return(message(221, )) SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 65 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT Lưu đồ lệnh MAIL FROM Đã có lệnh HELO chưa ? no yes Đã có lệnh MAIL chưa ? yes no Return(message(503, )) Lưu lại phần địa người gởi Return(message(250, )) Lưu đồ lệnh RCPT TO Đã có lệnh MAIL chưa ? no yes Đã có lệnh DATA chưa ? yes no Người nhận có hệ thống ? Return(message(503, )) yes no Lưu lại phần địa người danh sách smtp->receiver Return(message(250, )) Lưu lại phần địa người danh sách smtp->userfar Return(message(250, )) SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 66 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT Lưu đồ lệnh DATA với người nhận cục Đã có lệnh RCPT chưa ? no yes Return(message(354, )) (end with .) Return(message(503, )) Mỡ file tạm để chứa message từ client gởi qua Có người nhận Mỡ hộp thư người nhận lock lại no yes Chuyển thư tới người nhận tương ứng no Hết người nhận chưa ? yes Return(message(250, )) Chuyển thư thành công SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Return(quit()) Trang 67 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT Lưu đồ lệnh DATA với người nhận bên Đã có lệnh RCPT chöa ? no yes Return(message(354, )) (end with .) Return(message(503, )) Mỡ file tạm để chứa message từ client gởi qua Có người nhận Mở outbox lock lại no yes Chuyển thư người nhận từ xa tới outbox no Hết người nhận chưa ? yes Return(message(250, )) Chuyển thư thành công SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Return(quit()) Trang 68 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT Khởi tạo thông tin cần thiết Khởi tạo khối smtp_info Lấy tên Host máy Server no yes Lấy địa IP máy Client no yes Tạo hai Stream cho Input, no yes Return (+OK) SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Return (-1) Trang 69 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT Quá trình thực lệnh Khởi tạo thông tin cần thiết Return (message(250, +0K)) Lấy message từ Input no yes Phân tích liệu nhận để lấy lệnh cần thực Lệnh nhận Smtpd Return (message(550, -ERR)) Đóng kết nối thoát no yes Thực lệnh tương ứng Thực lệnh thành công no yes Return(message(250, +OK)) SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Return(message( , ERR)) Trang 70 LUẬN VĂN TỐT NGHIỆP GVHD : NGUYỄN CAO ĐẠT PHẦN I V: NHẬN XÉT VÀ HƯỚNG PHÁT TRIỂN MỘT SỐ KHẢ NĂNG CỦA C HƯƠNG TRÌ NH: - Chương trình thực tác vụ cho phép nhiều người gởi nhận Mail mà sử dụng Account Mail cấp nhà cung cấp dịch vụ - Mail user cục gởi cho gởi trực tiếp tới mailbox người - Mail user gởi hệ thống lưu giữ lại mailbox riêng Kết nối với nhà cung cấp dịch vụ thông qua modem vào thời điểm định trước Khi có kết nối mail gởi - Cho phép Administrator cấu hình hệ thống từ xa thông qua Webmin HƯỚNG PHÁT TRI ỂN CỦA CHƯƠNG TRÌNH: Tuy chương trình giải số vấn đề đặt ra, chương trình nhiều vấn đề phát triển lên như: - Xử lý thêm dạng địa phép người sử dụng uyển chuyển việc gởi nhận Mail - Nên thực tác vụ lọc Mail nhận Mail từ Server để phòng chống Spam - Cho phép làm việc số chuẩn Mail khác Trang chủ | Mục lục SVTH : Trần Ngọc Sơn & Hoàng Đức Quang Trang 71 ... CHƯƠNG II: KẾT NỐI INTERNET SỬ DỤNG GIAO THỨC PPP PPP (Point to Point Protocol) sử dụng để kết nối hệ thống Linux với Server từ xa thông qua cổng nối tiếp (com), thư? ??ng sử dụng modem SE TTI NG UP... nối hai máy thông qua modem, người sử dụng không thấy shell login PPP xử lý dùm Cả HLDC pppd có nhiều thông số lựa chọn để sử dụng Một vài thông số không sử dụng chúng ta, quan trọng thực kết... xác dù nhỏ vào hệ thống thông qua đường line ppp, sử dụng line ppp để hệ thống khác Để tránh tình trạng này, chế authentiction sử dụng PPP sử dụng hai chế authentiction :Password Authentication