HTML5 E-posta Doğrulaması


102

"HTML5 ile, kullanıcının girişinin geçerli bir e-posta veya url adresi olup olmadığını kontrol etmek için daha fazla js veya sunucu tarafı koda ihtiyacımız yok" deniyor.

Bir kullanıcı girdikten sonra e-postayı nasıl doğrulayabilirim? ve JS olmadan, kullanıcı e-posta adresinin yanlış bir biçimini girerse bir mesajın nasıl görüntüleneceği.

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

50
Her zaman sunucu tarafında doğrulamanız gerekir. Akıllı bir istemci, herhangi bir istemci tarafı güvenlik önlemini atlayabilir.
Benjamin Gruenbaum

Bu cevap , HTML5 form doğrulamasını ayarlamaya çalışırken yardımcı olabilir. Tabii ki yine de sunucu tarafında doğrulamaya ihtiyacınız olacak.
Joeytje50

2
regex E-posta doğrulaması hiçbir koşulda asla kullanılmamalıdır. Normal ifade denetimlerinin çok fazla kusuru vardır. Bir e-posta adresini "doğrulamanın" en iyi yolu, onları iki kez yazmalarını sağlamak ve kullanıcıya, modelle eşleşmiyorsa geçerli bir e-posta adresi gibi görünmeyeceğine dair bir UYARI veren bir Normal ifade kontrolü yapmaktır ve kullanıcıdan tekrar kontrol etmesini ister. Bu şekilde, eğer gerçekten geçerliyse, ancak normal ifade başarısız oluyorsa (çoğu zaman olduğu gibi), kullanıcı bunun geçerli olduğunu bildiğini ve devam ettiğini kabul edebilir. Çok fazla site normal ifade doğrulamasını kullanıyor ve bu birçok kullanıcı için sinir bozucu.
Soundfx4


Kullanıcıdan aynı e-posta adresini iki kez girmesini istemek gereksizdir. E-posta adreslerini bilmiyorsanız, iki kez yazmalarını istemek oranları artırmaz. E-posta adreslerini biliyorlarsa, iki kez yazmalarını istemek sadece zayıf bir kullanıcı arayüzüdür.
Mikko Rantalainen

Yanıtlar:


120

HTML5'te şunu yapabilirsiniz:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

Ve kullanıcı gönder düğmesine bastığında, otomatik olarak aşağıdaki gibi bir hata mesajı gösterir:

Hata mesajı


3
Buradaki desenin faydası nedir? Türün e-posta olarak belirtilmesi, bunu belirlemek için zaten yerleşik bir model içerir.
Rich Bradshaw

3
@RichBradshaw: Evet, haklısınız. Deseni belirtmeye gerek yok (
OP'den

6
@MichaelDeMutis: requiredÖzniteliği kullanabilirsiniz
Midhun MP

29
e-posta .combir e-postada kontrol edilmez . Yalnızca @ işaretini kontrol eder. Örn. example@gmailFormu girip kaydedebilirim. geçerli bir e-posta adresi olmasa da. Düzgün kontrol etmek için geçici çözüm var mı example@gmail.com?
Ruchika

9
@Liz. example@gmailgeçerli bir e-posta olmayabilir, ancak geçerli bir e-posta adresi biçimidir.
pajaja

47

input type=emailSayfa www.w3.org bir e-posta adresi şu normal ifadeyi eşleşen herhangi dizesi olduğunu sitesi notları:

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

Değerin normal ifade kalıbıyla eşleşmesini zorunlu kılmak için requiredözniteliği ve bir patternözniteliği kullanın.

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

14
Deseni iki '/' ve başlangıç ​​'^' ve bitiş '$' sembolü olmadan eklemelisiniz. Bunlar gibi[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Victor

4
@Victor Üzgünüm ama kısmen yanılıyorsunuz. Bu semboller onlar olmadan önemlidir, desen dizenin her yerinde eşleşmeye başlayacak ve onu işe yaramaz hale getirecektir. Doğru olduğun yer, eğik çizgileri serbest bırakmaktır.
Hexodus

@Victor cevabın benim için çalıştı. OP'nin normal ifadesi, geçerli bir e-posta adresi olsa bile formun gereksinimlerini karşılayan yanlış bir pozitif söz verdi. Belki de normal HTML kullanmıyorum, ancak HTML formunu oluşturmak için React JS kullanıyorum.
Ka Mok

Bunu neredeyse reddettim çünkü doğru cevap DOMNode'daki boole özelliğini kullanmak type="email"ve kontrol etmek valid- temeldeki normal ifadeyi tekrar etmeye gerek yok
Dominic

Bundan bahsettiğiniz için teşekkür ederim.
Stefan Ciprian Hotoleanu

17

/ [a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}İçin kullanmasomemail@email.comsomemail@email.com.vn


4
Bu normal ifade, e-posta adreslerine bir dizi uygunsuz gereklilik getirir - örneğin, bir veya iki harfli kullanıcı adı olan veya tek harfli bir alan adında barındırılan e-posta adreslerini reddeder.
duskwuff -inaktif-

Düzenlendi. Teşekkürler @duskwuff
Van Nguyen

Yine de tek harfli alan adlarını reddediyor.
duskwuff -inaktif-

Bu, 1 harf / sayı alan adlarına izin verir: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
Dümen

Ayrıca, örneğin, postmaster@aigeçerli bir e-posta adresi olduğunu ve bu normal ifadenin bunu da yasaklayacağını unutmayın. (Kaynak: serverfault.com/q/154991/104798 )
Mikko Rantalainen

12
document.getElementById("email").validity.valid

alan boş veya geçerli olduğunda doğru görünüyor. Bunun başka ilginç işaretleri de var:

görüntü açıklamasını buraya girin

Chrome'da test edildi.


8

İşte tüm e-posta girişlerim için kullandığım örnek. Bu örnek ASP.NET'tir, ancak herhangi biri için geçerlidir:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: xxx@xxx.xxx)" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

HTML5, gerekmediğinde kalıbı kullanarak yine de doğrular. Henüz yanlış pozitif olan bir tane bulamadım.

Bu, aşağıdaki HTML olarak oluşturulur:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: xxx@xxx.xxx)" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">

7

Javascript çözümünün peşinde olmadığınızı biliyorum, ancak deneyimlerime göre yalnızca JS kullanılarak yapılabilen özelleştirilmiş doğrulama mesajı gibi bazı şeyler var.

Ayrıca, JS kullanarak, her bir giriş alanını değiştirmek zorunda kalmadan, doğrulamayı sitenizdeki tüm e-posta türü giriş alanlarına dinamik olarak ekleyebilirsiniz.

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})

Lütfen yalnızca bağlantı yanıtlarını göndermeyin. Bağlantının temel kısımlarını cevabınıza
koyun

5

Parti için biraz geç, ancak bu düzenli ifade, istemci tarafında e-posta türü girişini doğrulamama yardımcı oldu. Yine de her zaman sunucu tarafında da doğrulama yapmalıyız.

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

Her türden daha fazla normal ifadeyi burada bulabilirsiniz .


4

TL; DR: % 100 doğru tek yöntem, girilen e-posta adresinde bir yerde @ işaretini kontrol etmek ve ardından verilen e-posta adresine bir doğrulama mesajı göndermektir. E -posta mesajındaki doğrulama talimatlarını takip edebiliyorlarsa , girilen e-posta adresi doğrudur.

Uzun cevap:

David Gilbertson bunun hakkında yazdı yıllar önce :

Sormamız gereken iki soru var:

  1. Kullanıcı mı , bu alana bir e-posta adresi yazması gerektiğini anladı mı?
  2. Kullanıcı kendi e-posta adresini doğru bir şekilde yazdı mı? bu alana yazdı mı?

"E-posta" yazan bir etikete sahip iyi düzenlenmiş bir formunuz varsa ve kullanıcı bir yere bir "@" simgesi girerse, bir e-posta adresi girmeleri gerektiğini anladıklarını söylemek güvenlidir. Kolay.

Ardından, e-posta adreslerini doğru girip girmediklerini belirlemek için bazı doğrulama yapmak istiyoruz.

Mümkün değil.

[...]

Herhangi yanlış yazmanız olacaktır kesinlikle bir neden yanlış e-posta adresine, ama sadece belki bir neden geçersiz e-posta adresi.

[...]

Bir e-posta adresinin 'geçerli' olup olmadığını anlamaya çalışmanın bir anlamı yok. Bir kullanıcı girmek için çok daha muhtemeldir yanlış ve geçerli onlar girmek için olduğundan daha e-posta adresini geçersiz olması .

Başka bir deyişle, herhangi bir tür dize tabanlı doğrulamanın yalnızca sözdiziminin geçersiz olup olmadığını kontrol edebileceğini fark etmek önemlidir. Kullanıcının e-postayı gerçekten görüp göremediğini kontrol edemez (örneğin, kullanıcı zaten kimlik bilgilerini kaybettiğinden, başka birinin adresini yazdığından veya belirli bir kullanım durumu için kişisel e-posta adresi yerine iş e-postasını yazdığından). " Kullanıcıyla verilen e-posta adresini kullanarak iletişim kurabilir miyim " yerine, gerçekte aradığınız soru ne sıklıkla " bu e-posta sözdizimsel olarak geçerli mi"? Dizeyi "içeriyor mu " seçeneğinden daha fazla doğrularsanız , önceki soruyu yanıtlamaya çalışıyorsunuz demektir! Şahsen ben her zaman sadece ikinci soruyla ilgileniyorum.@

Ek olarak, sözdizimsel veya politik olarak geçersiz olabilecek bazı e-posta adresleri çalışır. Örneğin, postmaster@aiTLD'lerin MX kayıtlarına sahip olmaması gerekmesine rağmen teknik olarak çalışır . Ayrıca WHATWG posta listesindeki (HTML5 ilk etapta tasarlanmıştır) e-posta doğrulaması hakkındaki tartışmaya bakın .


2

HTML 5 kullanarak, giriş e-postasını şöyle yapın:

<input type="email"/>

Kullanıcı giriş kutusunun üzerine geldiğinde, geçerli bir e-posta girmelerini isteyen bir araç ipucu görüntüler. Bununla birlikte, Bootstrap formları, kullanıcıya bir e-posta adresi girmesini söyleyen çok daha iyi bir Araç İpucu mesajına sahiptir ve girilen değer geçerli bir e-postayla eşleşmediği anda açılır.


Ancak bu, "abc @ gmail" gibi durumları geçersiz kılmaz.
nbsamar

evet öyle düşünüyorum, eğer kullanıcı gmail veya hotmail koyarsa valide isterim, mesela benim kullanıcım başka koyarsa benim girişime devam etmesine izin verme, bunu nasıl yapabilirim biliyor musun?
simon

2

Bu kalıbı da takip edebilirsiniz

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

Ref: W3Schools'ta


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">ayrıca bir geçerlilik mesajı göstermek için başlık ekleyebilirsiniz.
imdzeeshan

1

MDN'ye göre , bu RegExp, e-postaları doğrulamak için uygundur, çünkü özellikleri karşılayan e-postalar onunla eşleşmelidir.

/^[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])?)*$/

0

E-postayı yalnızca HTML5 özelliği "desen" kullanarak doğru şekilde doğrulamak çok zordur. Bir "desen" kullanmazsanız, birisi @ işlenecektir. bu geçerli bir e-posta DEĞİLDİR.

Kullanmak pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}", biçimin olmasını gerektirir, someone@email.comancak gönderenin someone@email.net.au(veya benzeri) bir biçime sahip olması, bunu düzeltmek için doğrulanmazsa, bunu pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"".com.au veya .net.au" veya benzeri bir şekilde doğrulayabilirsiniz.

Ancak bunu kullanmak, birisi@email.com'un doğrulama yapmasına izin vermez. E-posta adreslerini doğrulamak için basitçe HTML5 kullanmak hala tam olarak bizde değil. Bunu tamamlamak için şunun gibi bir şey kullanırsınız:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

veya:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

Ancak, HTML5 kalıbı özniteliğini kullanarak e-posta adreslerinin her ikisini veya tüm sürümlerini nasıl doğrulayacağımı bilmiyorum.


1
normal ifade kontrolleri hiçbir koşulda asla kullanılmamalıdır. Çok fazla desen var ve çok fazla kusurları var. Örneğin, birisi+customwordhere@email.com, aslında% 100 geçerliyken birçok normal ifade denetimi için geçersiz sayılır. Regex benim ve diğer birçok kullanıcı tarafında bir dikendir ve gitmesi gerekir. Bir kullanıcının geçerli bir e-posta adresi girdiğinden emin olmak için alternatif bir yöntem kullanılması gerekir.
Soundfx4

Ayrıca, örneğin, postmaster@aigeçerli bir e-posta adresi olduğunu ve bu normal ifadenin bunu da yasaklayacağını unutmayın. (Kaynak: serverfault.com/q/154991/104798 )
Mikko Rantalainen

DeBounce gibi E-posta Doğrulama Aracı da HTML5 ile birlikte önerilir.
Iman Hejazi
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.