← RFC Reference

RFC 2231: Mở rộng Giá trị Tham số MIME

Current Standard MIME — Multipurpose Internet Mail Extensions Published March 2026
ELI5: Các tệp đính kèm email có tên tệp, và tên tệp có thể chứa các ký tự không phải tiếng Anh hoặc rất dài. MIME ban đầu chỉ có thể xử lý các giá trị ASCII thuần túy trong tiêu đề. RFC 2231 thêm ba tính năng: hỗ trợ các ký tự không phải ASCII (như tên tệp tiếng Nhật hoặc tiếng Ả Rập), gắn thẻ ngôn ngữ và chia nhỏ các giá trị dài trên nhiều dòng.

Tại Sao Điều Này Tồn Tại

Các tham số MIME xuất hiện trong các tiêu đề như Content-TypeContent-Disposition. Trường hợp sử dụng phổ biến nhất là tham số filename cho các tệp đính kèm:

Content-Disposition: attachment; filename="report.pdf"

Điều này hoạt động tốt cho các tên tệp ASCII. Nhưng nếu là tệp có tên 報告書.pdf (tiếng Nhật có nghĩa là "báo cáo") hoặc tên tệp có 200 ký tự thì sao? Đặc tả MIME gốc (RFC 2045) không có cơ chế nào cho điều này. RFC 2231 giải quyết ba vấn đề:

Cách Hoạt Động

Mã Hóa Bộ Ký Tự và Ngôn Ngữ

Để bao gồm các ký tự không phải ASCII, thêm dấu hoa thị vào tên tham số và sử dụng định dạng charset'language'encoded-value:

Content-Disposition: attachment;
    filename*=UTF-8''%E5%A0%B1%E5%91%8A%E6%9B%B8.pdf
             ^^^^^^^  ^^  ^^^^^^^^^^^^^^^^^^^^^^^^
             charset  lang  percent-encoded value
                     (empty = no language tag)

Giá trị %E5%A0%B1%E5%91%8A%E6%9B%B8 là các byte UTF-8 cho "報告書" được mã hóa phần trăm. Thẻ ngôn ngữ giữa các dấu ngoặc kép đơn là tùy chọn (thường bỏ trống).

Tiếp Tục Cho Các Giá Trị Dài

Khi giá trị tham số quá dài cho một dòng tiêu đề duy nhất, hãy chia nó bằng cách tiếp tục được đánh số:

Content-Type: application/pdf;
    filename*0="very-long-document-name-that-exceeds-the";
    filename*1="-reasonable-line-length-limit-for-headers.pdf"

Các phần được tập hợp lại theo thứ tự số: *0, *1, *2, v.v.

Kết Hợp: Tiếp Tục Với Bộ Ký Tự

Đối với các giá trị không phải ASCII dài, kết hợp cả hai tính năng. Chỉ phân đoạn đầu tiên bao gồm bộ ký tự và ngôn ngữ; các phân đoạn tiếp theo chỉ là các giá trị được mã hóa:

Content-Disposition: attachment;
    filename*0*=UTF-8''%E3%81%93%E3%82%8C%E3%81%AF%E9%95%B7;
    filename*1*=%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB;
    filename*2*=%E5%90%8C%E3%83%A1.pdf
          ^^^^
          number + asterisk = encoded continuation

Chi Tiết Kỹ Thuật Chính

Cú Pháp Tên Tham Số

Biểu Mẫu Ý Nghĩa Ví Dụ
filename Giá trị ASCII thuần túy filename="report.pdf"
filename* Giá trị được mã hóa (charset'lang'value) filename*=UTF-8''%E5%A0%B1.pdf
filename*0 Phần tiếp tục 0, ASCII thuần túy filename*0="very-long-"
filename*0* Phần tiếp tục 0, được mã hóa filename*0*=UTF-8''%E5%A0%B1

Quy Tắc Mã Hóa

Tương Tác Với RFC 2047

RFC 2047 cung cấp các encoded-words (=?UTF-8?B?...?=) cho văn bản không phải ASCII trong tiêu đề. Tuy nhiên, RFC 2047 rõ ràng nêu rằng các encoded-words KHÔNG được xuất hiện bên trong các chuỗi được trích dẫn hoặc giá trị tham số. RFC 2231 là cơ chế chính xác cho các tham số MIME. Mặc dù có quy tắc này, nhiều ứng dụng thư sử dụng mã hóa RFC 2047 trong các tham số filename anyway, vì vậy các trình phân tích cú pháp mạnh mẽ phải xử lý cả hai.

Những Sai Lầm Phổ Biến

Tác Động Khả Năng Gửi

Related RFCs