Mail adresi uzunluk sınırı sorulduğunda akla tek bir sayı gelir, ama doğru cevap üç ayrı sınırdan oluşur: yerel bölümün sınırı, alan adının sınırı ve ikisinin toplamı. Bu üç sınırı birbirinden ayırmadan yapılan doğrulamalar, geçerli adresleri reddeden ya da geçersiz adresleri kabul eden hatalara yol açar. Bu yazıda sınırların nereden geldiğini, neden bayt cinsinden ölçüldüğünü ve standartta serbest olan bazı biçimlerin pratikte neden kabul edilmediğini bulacaksınız.
Adres hangi parçalardan oluşur?
Bir e-posta adresi iki parçadan oluşur ve bu ayrım bütün sınır tartışmasının temelidir. Adresin solundaki kısım yerel bölümdür; kişiyi ya da kutuyu tanımlar. Sağındaki kısım alan adıdır; postanın hangi sunucuya yönlendirileceğini belirtir. İkisini ayıran işaret, adresteki son ayıraçtır.
Bu ayrımın pratik sonucu şudur: posta gönderen bir sunucu, adresi teslim etmek için yalnızca alan adına bakar. Alan adının posta kabul edip etmediğini, o alan adına ait kayıtlardan öğrenir. Yerel bölümün nasıl yazıldığı teslim kararını etkilemez; alıcı sunucu kendi kurallarına göre yerel bölümü yorumlar. Yani “adres geçerli mi” sorusunun cevabı, biçim kuralları ile teslim kuralları arasında ikiye ayrılır.
Sınırlar neden bayt cinsinden ölçülür?
Çünkü teknik sınırlar karakter sayısını değil, aktarılan verinin boyutunu esas alır. Yerel bölüm için kabul edilen üst sınır 64 bayttır, alan adı için 255 bayt, adresin tamamı için ise açılı ve kapanış işaretleri dâhil 256 bayttır. Bu değerler adresin biçimini tanımlayan standartlarda yer alır ve sağlayıcıdan bağımsızdır.
Bayt ölçüsü, ASCII dışı karakterlerin devreye girdiği anda önem kazanır. Tek baytla temsil edilen harfler bir birim yer kaplarken, ASCII dışı bir harf birden fazla bayt tüketir. Bu yüzden yalnızca karakter sayan bir doğrulama, iki farklı adresi aynı uzunlukta sanabilir. Sınırı uygularken ölçüyü karakter yerine bayt üzerinden yapmak, standartla uyumlu davranmanın en basit yoludur. Aynı nedenle, kullanıcıya gösterilen karakter sayacı ile arka planda denetlenen uzunluk birbirini tutmayabilir; sayaç bilgilendirme amaçlıdır, karar ise bayt ölçüsüne göre verilir.
Standart neye izin verir, sağlayıcı neyi kabul eder?
Standartların izin verdiği her biçim, gerçek hayatta kabul görmez. Bu farkı bilmemek, iki taraflı hatalara yol açar:
| Biçim | Standart | Yaygın sağlayıcı davranışı |
|---|---|---|
| Tırnak içine alınmış yerel bölüm | İzin verilir | Çoğu form reddeder |
| Yerel bölüm içinde ayraç ve açıklama | İzin verilir | Neredeyse hiç kabul edilmez |
| Alan adı yerine köşeli parantezli sayısal adres | İzin verilir | Kayıt formlarında reddedilir |
| ASCII dışı harf içeren adres | Giderek yaygınlaşır | Çoğu sistem henüz kabul etmez |
| Tek karakterli yerel bölüm | İzin verilir | Bazı hizmetler en az iki veya üç karakter ister |
Tablodaki son satır, sınırların yalnızca üst tarafta olmadığını gösterir; alt sınırlar da sağlayıcı kararıdır. Bir hizmetin kendi doğrulaması, standarttan daha dar olabilir. Bu bir hata değildir; ancak hizmet bu daralmayı kullanıcıya söylemezse, kullanıcı adresinin neden reddedildiğini anlayamaz.
Uzunluk neden pratikte sorun olur?
Sınırların çoğu günlük kullanımda görünmez; çünkü insanların yazdığı adresler sınırlara yaklaşmaz. Sorun, adresi insan değil bir sistem ürettiğinde ortaya çıkar. Deneme senaryolarında kullanılan adresler, uygulama tarafından otomatik oluşturulan uzun ön ekler, kayıt tarihini ya da test kimliğini taşıyan ekler: hepsi adresi şişirir.
Uzunluk aşıldığında belirti genellikle doğrudan değildir. Form adresi kabul eder, ama kayıt sırasında bir alan sessizce kesilir; kesilen adres artık başka bir adrestir ve doğrulama postası hiç gelmez. Kimi zaman ise posta gönderilir, alıcı sunucu adresi reddeder ve kullanıcı yalnızca postanın gelmediğini görür. Bu tür arızaları ayıklamak zordur; çünkü hata mesajı uygulamanın değil, sonraki adımın ürünüdür.
Uzunluğun bir başka görünmez etkisi, kesme noktasının yeridir. Uzun bir adres bir alana sığmadığında sistem onu baştan keser, ortadan değil; bu yüzden adres hâlâ bir alan adına benzer, ama artık var olmayan bir alana işaret eder. Gözle bakıldığında bozuk görünmediği için hata kayıtlarda değil, teslim zincirinin sonunda ortaya çıkar. Alan adını bozmadan yerel bölümü kısaltmak da mümkün değildir; adres iki parçasıyla birlikte anlamlıdır ve tek bir karakteri değiştiğinde başka bir kutuya işaret eder. Bu yüzden uzunluğu denetlerken kararı, alan adının bütünlüğünü koruyacak biçimde vermek gerekir.
Hangi karakterler beklenmedik hatalara yol açar?
Adresin biçimini doğrulayan bir kod yazarken en sık yapılan hata, karakter kümesini gereğinden dar tanımlamaktır. Yalnızca harf, sayı ve birkaç işareti kabul eden bir kural, standartta geçerli olan bazı adresleri reddeder. Buna karşılık çok gevşek bir kural, alan adı kısmında hatalı bir adresin geçmesine izin verir.
Uygulamada şu ayrımı yapmak yeterlidir: yerel bölümde izin verilen küme geniştir, alan adında ise küme dardır. Alan adı, noktalarla ayrılmış etiketlerden oluşur ve her etiket belirli kurallara uyar; boşluk, alt çizgi ya da iki nokta üst üste gibi karakterler alan adında yer alamaz. Yerel bölümde ise nokta art arda gelmemek koşuluyla kullanılabilir. Bu iki kümeyi karıştıran doğrulama, hem gereksiz reddetme hem de hatalı kabul üretir.
Geliştiriciler için: doğrulama ve veri saklama
İlk kural, doğrulamayı iki aşamaya ayırmaktır: biçim denetimi ve teslim edilebilirlik. Biçim denetimi, adresin parçalarına ayrılıp ayrılamadığını ve sınırlara uyduğunu kontrol eder. Teslim edilebilirlik ise alan adının posta kabul ettiğini gösteren kayıtların varlığına bakar. İkisini tek adımda birleştirmek, hata mesajlarını belirsizleştirir; kullanıcı biçimi mi yoksa alan adını mı düzeltmesi gerektiğini bilemez.
İkinci kural, saklama alanını sınırın üstünde tutmaktır. Adresin tamamı için standartta tanımlı üst sınır bellidir; veritabanı sütununu bu sınıra göre dar tanımlamak, ileride ASCII dışı adresleri ya da ek bilgi taşıyan adresleri keser. Kesme işareti sessizce çalıştığı için hata en kötü biçimde ortaya çıkar: kayıt başarılı görünür ama adres bozulmuştur. Alanı bir miktar geniş bırakmak, sınırı uygulama katmanında denetlemek çok daha güvenlidir.
Üçüncü kural, doğrulamayı testlerle sabitlemektir. Sınırın hemen altında, tam sınırda ve sınırın üstünde olan adresler için ayrı testler yazılmalıdır. Ayrıca alan adı bozuk, yerel bölümü boş ve ayıraç içermeyen girdiler de denenmelidir. Bu testler, doğrulama kuralı değiştiğinde neyin bozulduğunu gösterir. Kendi formunuzu denerken uzun ve sıra dışı adreslere ihtiyaç duyarsanız geçici e-posta aracı kısa ömürlü bir adres üretmenizi sağlar; doğrulama akışının tamamını görmek için mail doğrulama akışı testi yazısına, adresin hangi parçalardan oluştuğunun ayrıntısı için tek kullanımlık mail adresi nedir yazısına bakabilirsiniz.
Sonraki adımlar
İlk adım, sınırları üç ayrı değer olarak ele almak ve her birini bayt üzerinden ölçmektir. İkinci adım, biçim denetimi ile teslim edilebilirlik denetimini ayırmak ve kullanıcıya hangisinde takıldığını söylemektir. Üçüncü adım, sınırın çevresindeki değerleri test hâline getirmektir; çünkü sınırların doğru uygulandığını gösteren tek kanıt, sınırın hemen iki yanındaki davranıştır.
Bu metindeki örnek biçimlerin tümü kurgudur ve yalnızca yazım denemesi içindir; gerçek bir kişiyi ya da kurumu temsil etmez.