Regex ile Email Kontrolü

Emailin kontrol edilmesi, kullanıcılı sistemlerin hepsinde büyük önem arz ediyor. Kontrol edilmeden veritabanına işlendiğinde ileride işinizi zorlaştırabiliyor. Bunun önemini kavramadan site tasarlayan birinin ardını temizlemekle meşgulüm şu günlerde. Adam tasarladığı sitede, emaili kontrol etmemiş ve doğrudan veritabanına kaydını düşmüş. Bunun üzerine müşteri bizim şirkete gelince, siteyi yapan kişinin hatalarını temizlemekte bize düştü.

Email Kontrolü

Benden ilgili bilgilerin çekilerek gönderilmesini yapacak bir program yazmam isteniyor. Bu arka planda çalışacak bir deamon aslında. İlgili müşterinin serverında bir servis gibi çalışacak. Müşterinin kendi tanımladığı alt gruplar var. Bunlara toplu olarak mail göndermek istiyor. Sorun ise gönderilecek maillerin doğru olmamasından kaynaklanıyor.

Bende bu tip bir mail kontrolünün en kolay regular expression ile yapılacağını düşündüm. Tabi bunu düşünen sadece ben olmayacağımdan, önce google ile başladım işe. İstediğim gibi bir kaç regular expression ifadesi buldum. Fakat hiç biri tam olarak benim istediğim şekilde çalışmıyordu.

En son bir regular-expressions.info sitesinde aradığımı buldum. Daha doğrusu aradığıma en yakın olanı buldum. Temel olarak mail adresini iki kısımdan oluştuğunu düşünelim @ işaretinden önceki ve sonraki kısım. İlk kısımda A’dan Z’ye kadar istenilen haft kullanılabileceği gibi sayı ve bir kaç noktalama işaretlerininde kullanılabilir olması gerekiyor. Hatta bu işaretlerin istenilen sırada kullanılabilmesi gerekiyor. Onun için ilk kısımda [A-Z0-9._%+-]+ ifadesini kullanacağım.

İkinci kısım ise biraz daha karmaşık. Öncelikle yani aynı şekildeki bir alan adıyla başlaması gerekiyor tek farkı kullanılabilecek noktalama işaretleri olacak. Alan adı için ise şu ifadeyi kullanacağım [A-Z0-9.-]+ . Bu ifade ise bir noktayla devam etmeli. Bundan sonra hangi üst alanlara izin vereceğimi belirteceğim. Onuda şu şekildeki bir yapıyla sağlıyorum (com|org|net|edu|gov|mil|biz|info|mobi) . Bundan sonra ise eğer varsa ilgili ülke alanlarına izin vermek kalıyor. Bildiğiniz üzere ülkeler iki hafli yapıdalar. Onuda şu ifadeyle eklemiş oluıyorum (.[A-Z]{2})?.

Son olarak ise bu yapının tüm string yapısı için geçerli olacağını belirtmem gerekiyor. Yani başlangıcı ve bitişi arasında bu yapı olmalı. Bunuda eklediğimde string yapım aşağıdaki gibi oluyor.

^[A-Z0-9._%+-]+@[A-Z0-9.-]+.(com|org|net|edu|gov|mil|biz|info|mobi)(.[A-Z]{2})?$

Java

İlgili pattern’i java’da uygulamak için EmailValidator isimli bir sınıf yaratıyorum.

EmailValidator.java

package blg.bhdrkn.email;

import java.util.regex.Pattern;

public class EmailValidator {

private static final String EMAIL_PATTERN = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+.(com|org|net|edu|gov|mil|biz|info|mobi)(.[A-Z]{2})?$";

public static boolean isEmailValid(String emailInput) {
Pattern pattern = Pattern.compile(EMAIL_PATTERN,
Pattern.CASE_INSENSITIVE);
return pattern.matcher(emailInput).find();
}
}

Şimdi ise bu kodu test edecek Junit testimi yazalım. Bunun için EmailValidatorTest isimli sınıfımızı oluşturuyoruz.

EmailValidatorTest.java

public class EmailValidatorTest {

/**
* Test method for {@link blg.bhdrkn.email.EmailValidator#isEmailValid(java.lang.String)}.
*/
@Test
public void testIsEmailValid() {
// Doğru
assertTrue(EmailValidator.isEmailValid("bhdrkn@gmail.com"));
assertTrue(EmailValidator.isEmailValid("akinb@itu.edu.tr"));
assertTrue(EmailValidator.isEmailValid("bahadir@test.com.tr"));
assertTrue(EmailValidator.isEmailValid("bahadir.akin@test.com.tr"));
// Yanlış
assertFalse(EmailValidator.isEmailValid("bahadir.akin@test.asd"));
}

Kodumuzu çalıştırdığınızda sorunsuz bir şekilde çalıştığını göreceksiniz.

C#

Aynı kodu C#’ya kullanmak isterseniz.

EmailValidator.cs

using System.Text.RegularExpressions;

namespace EmailValidate
{
public class EmailValidator
{
private readonly static string EMAIL_PATTERN = @"^[A-Z0-9._%+-]+@[A-Z0-9.-]+.(com|org|net|edu|gov|mil|biz|info|mobi)(.[A-Z]{2})?$";

public static bool isEmailValid(string emailInput)
{
Regex regex = new Regex(EMAIL_PATTERN, RegexOptions.IgnoreCase);
return regex.IsMatch(emailInput);
}
}
}

Kaynaklar

  • How to Find or Validate an Email Address : Burada ülke kodlarının gerçerli olduğunu söylediği kısımdaki, yapıyı biraz değiştirdim. Burada anlatılan yapıda iki harfli tüm üst alan adlarıda geçerli oluyordu. Yani bhdrkn@gmail.xk geçerli bir alan adı gibi gözüküyordu. Bunu önlemek adına ülke kodlarını ve üst alan adlarını ayırdım.

End Of Line