Giới hạn của địa chỉ email là chuyện tưởng đơn giản nhưng lại gây tranh cãi mỗi khi có người viết bộ kiểm tra định dạng cho biểu mẫu đăng ký. Tiêu chuẩn quốc tế cho phép nhiều thứ hơn hầu hết dịch vụ chấp nhận, nên một địa chỉ hợp lệ theo tiêu chuẩn vẫn có thể bị từ chối trong thực tế. Bài này nói rõ hai phần của một địa chỉ, các con số độ dài mà tiêu chuẩn quy định, và cách xử lý phần khác biệt giữa tiêu chuẩn với thực tế.
Một địa chỉ thư gồm những phần nào?
Một địa chỉ được chia làm hai phần bởi ký tự a còng. Phần đứng trước gọi là phần tên hộp thư, phần đứng sau là tên miền. Phần tên hộp thư do nhà cung cấp dịch vụ thư quyết định, và mỗi nơi có quy tắc riêng: có nơi cho phép dấu chấm, dấu cộng, gạch dưới; có nơi chỉ cho chữ và số.
Phần tên miền thì do hệ thống tên miền quyết định, và nó là phần quyết định đường đi của lá thư. Để thư tới được, tên miền phải tồn tại và phải có bản ghi chỉ định máy chủ nhận thư. Nếu phần tên hộp thư sai, thư bị trả lại ngay khi vào tới máy chủ đích; nếu tên miền sai, thư không tìm được đường đi.
Chính vì hai phần do hai hệ thống khác nhau quản lý, các giới hạn về độ dài cũng được đặt riêng cho từng phần, và sau đó mới có một giới hạn cho cả địa chỉ. Đó là lý do bạn sẽ gặp ba con số khác nhau chứ không phải một.
Tiêu chuẩn quốc tế quy định độ dài ra sao?
Tiêu chuẩn công khai của IETF, ví dụ đặc tả định dạng thư điện tử, đặt ra ba giới hạn. Phần tên hộp thư tối đa là 64 byte. Phần tên miền tối đa là 255 byte. Và cả địa chỉ, tính cả cặp dấu nhọn bao quanh trong trường hợp địa chỉ xuất hiện trong thư, tối đa là 256 byte.
Cần chú ý đơn vị là byte chứ không phải ký tự. Với tiếng Việt có dấu, một ký tự có thể chiếm nhiều hơn một byte, nên một địa chỉ trông ngắn về số ký tự vẫn có thể vượt giới hạn về số byte. Đây là chi tiết hay bị bỏ qua khi người ta đặt giới hạn độ dài trong biểu mẫu.
Ngoài ra, con số thực tế mà nhiều dịch vụ áp dụng cho toàn bộ địa chỉ thường thấp hơn 256, phổ biến là khoảng 254 ký tự. Cần nói rõ đây là một thông lệ kỹ thuật chứ không phải giá trị của tiêu chuẩn; đừng trích dẫn nó như thể tiêu chuẩn quy định như vậy.
Vì sao nhiều dịch vụ nhận hẹp hơn tiêu chuẩn?
Lý do thứ nhất là an toàn. Địa chỉ thư xuất hiện ở rất nhiều chỗ: trong cơ sở dữ liệu, trong nhật ký, trong tiêu đề thư, trong các giao diện lập trình. Mỗi chỗ có một giới hạn riêng, và nếu bạn cho phép địa chỉ dài tối đa, bạn sẽ sớm gặp một chỗ nào đó cắt bớt hoặc từ chối. Nhiều nhóm chọn giới hạn chặt hơn để tránh cả lớp lỗi này.
Lý do thứ hai là chống lạm dụng. Một địa chỉ dài bất thường thường là dấu hiệu của dữ liệu do máy sinh ra hoặc của một nỗ lực làm tràn bộ đệm ở đâu đó. Giới hạn chặt là một cách phòng thủ rẻ tiền.
Lý do thứ ba là sự đơn giản. Phần lớn người dùng thật có địa chỉ ngắn, nên việc hỗ trợ mọi khả năng của tiêu chuẩn là công sức bỏ ra cho một nhóm rất nhỏ người dùng, trong khi lại mở ra nhiều trường hợp biên phải xử lý.
Hệ quả là bạn cần phân biệt hai câu hỏi khác nhau. Câu hỏi thứ nhất: địa chỉ này có hợp lệ theo tiêu chuẩn không. Câu hỏi thứ hai: dịch vụ này có chấp nhận nó không. Hai câu trả lời có thể trái ngược nhau, và cả hai đều đúng trong phạm vi của mình.
Những cách viết hợp lệ nhưng vẫn bị từ chối
Tiêu chuẩn cho phép một số cách viết mà hầu hết dịch vụ thực tế không nhận. Phần tên hộp thư có thể được đặt trong dấu nháy kép, cho phép chứa cả ký tự đặc biệt và khoảng trắng. Địa chỉ cũng có thể kèm phần chú thích trong ngoặc đơn, và phần chú thích này không được tính là một phần của địa chỉ.
Ở phía tên miền, tiêu chuẩn cho phép viết địa chỉ máy chủ trực tiếp trong ngoặc vuông thay vì dùng tên miền. Và với phần mở rộng dành cho tên miền quốc tế hóa, tên miền có thể chứa ký tự không thuộc bảng chữ cái Latinh.
Tất cả những cách viết trên đều đúng theo tiêu chuẩn, nhưng phần lớn dịch vụ sẽ từ chối. Vấn đề không phải là dịch vụ làm sai, mà là họ chọn một tập con thực dụng. Khi bạn viết bộ kiểm tra cho biểu mẫu của mình, hãy quyết định bạn muốn nằm ở đâu giữa hai thái cực: rộng theo tiêu chuẩn nhưng phải chấp nhận nhiều đầu vào lạ, hay hẹp theo thực dụng nhưng phải từ chối một số người dùng thật.
Điều không nên làm là viết một biểu thức kiểm tra quá chặt rồi tuyên bố rằng những địa chỉ khác là sai. Một địa chỉ đúng theo tiêu chuẩn bị từ chối là một người dùng không đăng ký được, và đó là thiệt hại thật.
Thử một địa chỉ dài trên trang này
Nếu bạn đang cần một địa chỉ dài, hoặc có dấu, hoặc chứa ký tự bất thường để thử biểu mẫu của mình, công cụ email tạm thời của trang này cho phép bạn đặt tiền tố theo ý muốn trên một tên miền có sẵn. Đó là cách nhanh để xem biểu mẫu của bạn cư xử thế nào với những đầu vào mà bạn không gặp trong dữ liệu bình thường.
Hộp thư tạo ở đây chỉ dùng cho kiểm thử định dạng và cho việc nhận một lá thư xác minh, không phải danh tính thật của bạn và không nên dùng cho tài khoản cần giữ. Nếu bạn đang gặp trường hợp biểu mẫu từ chối một địa chỉ mà bạn cho là hợp lệ, bài vì sao trang web chặn email tạm thời giải thích một nhóm nguyên nhân khác.
Phần dành cho nhà phát triển
Đây là chỗ mà một quyết định nhỏ trong bộ kiểm tra dữ liệu có thể gây thiệt hại trên diện rộng. Vài điểm nên chốt:
- Đừng dùng một biểu thức kiểm tra quá chặt để từ chối địa chỉ. Nếu bạn chỉ cần phát hiện lỗi gõ rõ ràng, một phép kiểm tra đơn giản là đủ; dùng phép kiểm tra chặt chỉ làm tăng số người dùng bị chặn oan.
- Đặt giới hạn độ dài theo byte cho phần tên hộp thư, theo tiêu chuẩn, thay vì chặn cả địa chỉ ở một con số tùy ý. Và ghi rõ trong mã vì sao con số đó là con số đó.
- Xử lý địa chỉ có dấu một cách có chủ đích. Nếu sản phẩm của bạn chưa hỗ trợ, hãy từ chối bằng một thông báo giải thích được, đừng để lỗi xảy ra ở tầng lưu trữ.
- Chuyển tên miền về dạng chữ thường khi so sánh, vì phần tên miền không phân biệt chữ hoa chữ thường. Với phần tên hộp thư thì cẩn thận hơn, vì về nguyên tắc nó có phân biệt, dù nhiều dịch vụ thực tế không phân biệt.
- Cắt khoảng trắng ở hai đầu trước khi kiểm tra, vì thao tác sao chép và dán rất hay mang theo khoảng trắng hoặc ký tự xuống dòng.
- Đừng chuẩn hóa địa chỉ bằng cách xóa dấu chấm hoặc bỏ phần sau dấu cộng, trừ khi bạn chắc chắn nhà cung cấp dịch vụ thư của người dùng cũng làm như vậy. Hai địa chỉ khác nhau có thể là hai hộp thư khác nhau.
- Kiểm thử các trường hợp biên ngay trong bộ kiểm thử tự động: địa chỉ dài sát giới hạn, địa chỉ có dấu, địa chỉ có dấu cộng, địa chỉ có khoảng trắng ở hai đầu. Nếu bạn chưa có hộp thư để thử, bài kiểm thử luồng xác minh email liệt kê những trường hợp đáng phủ.
Một điều nữa: khi bạn chọn giới hạn hẹp hơn tiêu chuẩn, hãy ghi lại quyết định đó ở nơi cả nhóm đọc được. Nếu không, sẽ có người tới sau nới nó ra, rồi có người khác siết nó lại, và biểu mẫu sẽ đổi hành vi theo từng lần phát hành.
Bước tiếp theo
Hãy lấy ba địa chỉ thật khó — một địa chỉ dài sát giới hạn, một địa chỉ có dấu, một địa chỉ có dấu cộng — và chạy thử trên biểu mẫu của bạn xem chúng đi qua được tới đâu. Nếu bạn cần tạo nhanh một địa chỉ để thử, mở công cụ email tạm thời và đặt tiền tố theo đúng hình dạng bạn muốn kiểm tra.