HTML5 form doğrulama neden nokta içermeyen e-postalara izin veriyor?


113

Bazı HTML5 form doğrulamasını göstermek için çok basit bir model yazıyorum. Ancak, e-posta doğrulamasının adreste bir noktayı kontrol etmediğini ve söz konusu noktayı takip eden karakterleri kontrol etmediğini fark ettim.

Diğer bir deyişle, "john @ doe" açıkça geçerli bir e-posta adresi olmadığında geçerli kabul edilir; "doe" bir alan adı değildir.

E-posta alanımı şu şekilde kodluyorum:

<input type="email" required />

Bu yeterli değil mi?

Ne demek istediğimi görmek için bu kemanı kontrol edin .

Not: Bunun yerine bir RegEx kalıbı aracılığıyla bunu nasıl başaracağımı biliyorum. Bunun yerine birisinin e-posta türünü kullanmaktan nasıl kurtulabileceğini merak ediyorum.


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Evet, doekesinlikle bir alan adı olabilir (düşünün localhost) ve bu adres teknik olarak spesifikasyona göre geçerlidir.
2013

2
@admdrew Heh ... e-posta sunucusundan bir E-posta gönderiyorsanız ve "friend @ localhost" yazmaya karar verirseniz bu ilginç bir durum olurdu
Katana314

@ Katana314 - heh, evet. Çoğu (iyi yapılandırılmış) posta sunucusu, beklenen bir etki alanıyla eşleşmeyen adreslere gönderilen iletileri reddeder, bu nedenle genel olarak localhostadreslerle ilgili bir sorun yoktur .
admdrew

Yanıtlar:


84

Çünkü a @ b geçerli bir e-posta adresi (örneğin, localhost geçerli bir etki alanıdır). Bkz. Http://en.wikipedia.org/wiki/Email_address#Examples

Ayrıca, giriş doğrulamasını her zaman sunucuda yapmanız gerektiğini unutmayın. İstemci tarafı doğrulama, yalnızca kullanıcıya geri bildirim vermek için olmalı ve kolayca atlanabileceği için güvenilmemelidir.


7
Teşekkürler. Herhangi bir şirketin bu kullanıma hazır e-posta doğrulamasından nasıl yararlanabileceğini anlamıyorum. Facebook, birinin a @ b adresiyle kaydolmasına izin vermez. Yine de bilgi için teşekkürler. (Cevabınızı
olumsuz oylamadım

6
Facebook gibi herkese açık erişime sahip web sitelerinin olması durumunda, hiçbir faydası yoktur. Ancak dahili web sitelerini düşünün. Joe @ support'a yazmak isteyebilirsiniz. Ama aynı zamanda minimum kullanım olduğunu düşünüyorum. Bununla birlikte, web tarayıcıları, en yaygın durumlara değil, standartlara (yani RFC'ler) dayalı olarak uygulanmalıdır.
Ali Alavi

9
En son ne zaman birisi localhost'a ne zaman e-posta gönderdiğini merak ediyorum!
Matthew Lock

2
Bir yan not olarak çalışan en kısa e-posta adreslerinden biri ( recordsetter.com/world-record/shortest-email-address/4327 )au@ua
Kyborek

132

Teorik olarak "." Olmadan bir adresiniz olabilir. içinde.

Teknik olarak şu gibi şeyler:

user@com
user@localserver
user@[IPv6:2001:db8::1]

Tüm e-postalar geçerlidir.

Bu nedenle standart HTML5 doğrulaması, yaygın olmayanlar dahil tüm geçerli E-postalara izin verir.

Okunması kolay bazı açıklamalar için (Standartları okumak yerine): http://en.wikipedia.org/wiki/Email_address#Examples


1
Kabul edildi, bu, "çözüm" değil, "neden" sorusunu yanıtlıyor. Nedenini de merak ettim. Artık "düzeltmemem gerektiğini" biliyorum.
Eleanor Zimmermann

İlk türe bir örnek, uzEkim 2018 itibariyle doğrudan bir IP'ye işaret eden etki alanıdır. Bir yaparsanız nslookup uz, işaret eder 91.212.89.8, bu nedenle bu etki alanında da e-posta olması mümkün olmalıdır.
PulseJet

36

Bunu girişe eklemeyi deneyin

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

Vaktini boşa harcamak


2
Pek çok yeni alan mevcut olduğunda (muhasebeciler [11], uluslararası [13] vb.) Ve potansiyel maksimum uzunluk 63 olduğunda, normal ifade modelinin uzunluk değeri {2, 63} olmalıdır.
unasAquila

42
-1. İlk olarak, bunun neye izin verdiğini veya neyi kısıtladığını veya neden birinin bu kuralları istediğini açıklamaya çalışmadınız bile. İkinci olarak, standartları (ben örneğin, standartları okuyup grokked gelmiş gibi yapar, ancak görmezsiniz izin çok daha kısıtlayıcı olan en.wikipedia.org/wiki/Email_address#Internationalization veya Stack üzerinde birçok e-posta doğrulama soruları Garip e-posta adresi örnekleri için taşma). Neden yaptın? Biri e-postası olarak alışılmadık bir şey giriyorsa, kabul edin - muhtemelen sizden daha iyi biliyordur.
Mark Amery

7
Aslında, hata yapma ihtimalinin yüksek olduğunu söyleyebilirim. Oldukça alışılmadık bir e-posta adresleri olabilir / olabilir, ancak çoğu zaman doğrulamayı geçmeyi durdurur ve kontrol etmek için kullanıcı.
Geoff Kendall

1
Bu, dizenin başından itibaren eşleşmeye başlaması gerektiğini ve aynı zamanda büyük ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
harfleri

13

RFC 822 , bölüm 6, güçlendirilmiş Backus Naur Form (BNF) bir adresin şartname veriyor:

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

Bu belirtimi kullanmak a@bgeçerli bir adrestir.

GÜNCELLEME

Trejkaz'ın yorumuna cevap vermek için aşağıdaki tanımları ekliyorum. SPACE'e izin verildiğini görüyoruz, ancak yalnızca tırnaklı dizede.

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  

OTOH, RFC 822, Chrome'un en azından izin vermediği yerel kısımda boşluklar koymama da izin veriyor, bu nedenle RFC'yi referans olarak kullandıklarından emin değilim. (
Olmaları gerekse

8

Bu MDN sayfasında, e-postayı doğrulamak için normal ifade tarayıcılarının kullanması gereken gösterilir:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

Alan adında en az bir nokta gerektirecek şekilde bu normal ifadeyi biraz değiştirebilirsiniz: *Normal ifadenin sonundaki yıldızı artı olarak değiştirin +. Ardından, patternöznitelik olarak bu normal ifadeyi kullanın :

<input type="email" pattern="^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"></input>

3

E-posta alanının düzenini özelleştirebilirsiniz:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />


2

Burada, normal ifade kalıbını kullanarak bunu html5 ile nasıl yapabileceğiniz anlatılmaktadır. Ayrıca görüntülenecek özel bir mesaj da ekleyebilirsiniz.

<form>
  <input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
  <button type="submit">Click Me</button>
</form>


-5

Bu kalıp benim için her zaman işe yarar.

Metin küçük harf olmalıdır, pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"ancak çoğu e-postayı aşağı yukarı kapsadığını düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.