15 March, 2020

#30: Tìm hiểu giao thức truyền email

#30: Tìm hiểu giao thức truyền email
Available in:
 Vietnamese
Reading time: 5 min.
Table of content

    Chuyện là, trong nhà thì cả mình và chị ruột đều đi du học. Mình và chị thường hay liên lạc với mẹ qua facebook, nhưng khi liên lạc với bố thì tất cả đều qua email. Lần thì mình chúc mừng sinh nhật bố qua email, lần thì bố hỏi thăm chuyện đau răng qua email. Có lúc mình thấy cái email là một cái gì đó thật đắc lực trong thế kỷ 21 này, cho dù thực tế thì giao thức truyền email đã tồn tại được 38 năm rồi!

    Trùng hợp, anh Nguyễn Kim Sơn, sư phụ của mình, đợt cuối năm ngoái có ra mắt một sản phẩm mang tên SimpleLogin. Sản phẩm cho phép tạo ra các mail “ảo” để tránh bị lộ email thực khi đăng ký các dịch vụ khác nhau. Thông qua anh, và qua source code của sản phẩm, mình cũng tìm hiểu thêm được nhiều thứ khác hay về giao thức email. Hãy ủng hộ sản phẩm bằng cách “Star” trên github của dự án nhé: https://github.com/simple-login/app

    MỤC LỤC
    Phần 1: Giao thức SMTP
    …… Giới thiệu
    …… Điều gì xảy ra khi gửi một email?
    …… Ví dụ gửi một email
    …… Cấu trúc nội dung email
    Phần 2: Thử lập một server nhận và lưu email (sắp có)
    Phần 3: Chống giả mạo email bằng DKIM và SPF (sắp có)

    Giới thiệu

    Giao thức được dùng trong việc gửi – nhận email là SMTP, viết tắt của Simple Mail Transfer Protocol. Giao thức này được hình thành từ những năm 1970, tức là từ thuở sơ khai của Internet, và được đưa thành chuẩn vào năm 1982 trong tài liệu RFC 821.

    Có một điều thú vị là, do SMTP ra đời từ khá sớm, nên có những thứ nghe khá “kỳ quặc”, “thừa thãi”. Thậm chí có những vấn đề về bảo mật xoay quanh, mà về sau người ta phải tạo ra các chuẩn mới để “vá”. Tuy nhiên, SMTP vẫn giữ nguyên sau từng đấy năm, trường tồn với thời gian.

    SMTP hoạt động trên giao thức TCP, ở cổng số 25. Nếu bạn chưa biết TCP là gì thì hiểu đơn giản, nó là một dạng giao thức để 2 máy tính trên Internet có thể “chat” với nhau. Và bọn máy tính nó cũng sẽ “chat” bằng ngôn ngữ gần giống kiểu 2 người nhắn tin nhắn tin với nhau thôi (khá kỳ lạ phải không nào?)

    Điều gì xảy ra khi gửi một email?

    Đại khái ví dụ như bạn gửi email từ yahoo qua gmail, thì thằng yahoo sẽ tạo 1 kết nối TCP tới thằng gmail, rồi bắt đầu “nói chuyện” với thằng gmail rằng “tao tên là blah, tao có mail cho mày nè,… xong rồi nhé, bye”

    Và để 2 server “nói chuyện” với nhau như cái ví dụ trên, SMTP định nghĩa một vài “lệnh” có thể sử dụng:

    HELO: lệnh chào hỏi (thật, nó có thật đấy)
    MAIL FROM: thông báo email được gửi từ đâu
    RCPT TO: thông báo email gửi tới đâu
    DATA: thông báo bắt đầu gửi dữ liệu nội dung của email
    QUIT: ngắt kết nối

    Ví dụ gửi một email

    Giờ giả sử bạn gửi một email từ Yahoo tới Gmail, đầu tiên thằng yahoo sẽ tạo một kết nối TCP để 2 thằng “hội thoại” với nhau. Chúng nó sẽ “nói chuyện” giống như thế này:

    (màu tím là thằng Yahoo nói, màu đỏ là thằng Gmail nói. Đây là một đoạn giao tiếp giả định, không chính xác 100% so với thực tế)

    220 gmail.com ESMTP Postfix
    (Ý nó bảo: Tao là gmail.com. Chào mừng homie đã đến nhà tao.)
    
    HELO yahoo.com
    (Chào homie, tao là yahoo.com)
    
    250 gmail.com, I am glad to meet you
    (Tao là gmail.com. Rất vui được gặp mày)
    
    MAIL FROM:<[email protected]>
    (Tao có mail cho mày này)
    
    250 Ok
    (OK tao nghe)
    
    RCPT TO:<[email protected]>
    (Mail này gửi đến [email protected])
    
    250 Ok
    (OK tao nghe)
    
    DATA
    (Giờ tao đọc nội dung thư nhé)
    
    354 End data with <CR><LF>.<CR><LF>
    (OK tao nghe. Khi nào hết thì đánh dấu "chấm" để báo tao nhé homie)
    
    From: "Girl Hà Đông" <[email protected]>
    To: "Boy Hà Nội" <[email protected]>
    Date: Tue, 15 Jan 2008 16:02:43 -0500
    Subject: Đây là cái tiêu đề email
    
    Xin chào boy HN. Đây là nội dung email tôi muốn gửi cho bạn.
    .
    
    250 Ok: queued as 12345
    (OK tao đã nhận)
    
    QUIT
    
    221 Bye
    

    Cấu trúc nội dung email

    Như vậy ở ví dụ trên, bạn sẽ để ý thấy rằng, phần nội dung chính của email (sau lệnh DATA) mới thực sự chứa nội dung thật của email. Nó cũng có cả From, To, nghe hơi thừa phải không nhỉ? (vì rõ ràng đã ghi trên lệnh MAIL FROMRCPT TO rồi mà!)

    Thực tế các thứ ghi trên lệnh MAIL FROMRCPT TO giống như kiểu bạn viết lên phong bì thư (nó được gọi là SMTP envelope), còn những gì trong DATA thì giống như cái tờ giấy bên trong phong bì thư vậy (được chia làm 2 phần riêng biệt: message headermessage body)

    Như vậy bạn sẽ tự hỏi tiếp rằng sau khi nhận, thì email được lưu vào đâu, và lấy email mình đã nhận như thế nào?

    Thực tế, mục đích chính của giao thức SMTP chỉ dùng để trao đổi email. Còn việc lưu, khi server nhận đc email, nó có thể lưu thành file, lưu vào database,… tùy. Và khi bạn muốn “check mail”, các email trên server sẽ được truyền về máy bạn qua giao diện web (như gmail.com) hay giao thức POP3/IMAP chẳng hạn.

    Trong phần tiếp theo, mình sẽ viết 1 đoạn code ngắn, thực hiện các lệnh SMTP để gửi đi một email. Các bạn hãy nhớ đón xem nhé!

    Want to receive latest articles from my blog?