Blog nie jest już dalej prowadzony, ani aktualizowany. Wpisy i komentarze pozostaną dostępne przez jakiś czas. Dzięki.

Poprawność adresu e-mail

Trzeba sprawdzać na stronach poprawność adresu e-mail, bo a nuż ktoś wpisze nam alamakota@abrakadabra i nie dostaniemy jego danych i będzie źle dla nas i w ogóle. Dlatego też wymyśliliśmy, że musi być w adresie małpa, musi być kropka, musi być domena, a domena ma 2 lub trzy znaki… Wróć!

To właśnie przez takie testy, pisane przez webmasterów, którzy zapominają, że domena nie musi mieć trzech znaków maksymalnie, a może mieć więcej, zdarzyło mi się już, że nie mogłem zarejestrować się gdzieś, bądź skorzystać z jakiś usług. Teraz, przed chwilą, sobie o tym przypomniałem próbując skorzystać z subskrypcji serwisu PoradyKomputerowe.pl co było wymagane do pobrania bezpłatnego raportu. A kiedyś, o ile pamiętam, podobna sytuacja przytrafiła mi się na oGame.

Wyrażenie regularne postaci ^([0-9a-z._]{1,25})@([0-9a-z._]{1,25}.[a-z]{2,3})$ (chyba powinno działać, pisałem “na czuja”) nie jest dobre. Ze względu na to, że od jakiegoś czasu dostępne są domeny cztero- i więcej znakowe. Ot choćby właśnie moja .info. Podobnie niedobra .mobi, czy mało popularna .name. A absolutnym rekordzistą pod względem długości jest niedawno wprowadzona .travel. A sam, instalując jakieś aplikacje na wewnętrznym serwerze w sieci lokalnej, stosuję adresy e-mail administratora w postaci admin@costam.local. “Domena” .local jest u mnie w sieci lokalnej szeroko używana.

Podobnie też zastosowane tutaj sprawdzanie długości od jednego do 25 znaków (zaczerpnięte z pewnej książki), nie jest zbyt dobre, bo o ile tak długą część przed “małpą” ciężko mi sobie wyobrazić (najdłuższe znane mi imiona+nazwiska osiągają ledwo 22 znaki) o tyle nazwa serwera może być dłuższa. Ot, przed momentem wymyśliłem kompletnie idiotyczne mailserver.3141592653.travel ;-) Jednak bardziej denerwują mnie wspomniane ograniczenia co do długości domen. Jak się domyślam, to aplikacje były pisane w czasach, gdy .com było ledwo popularne i nikt się dłuższych rzeczy nie spodziewał.

PHP-owy framework, jaki bardzo lubię, CodeIgniter, posiada w swoich zasobach bibliotekę Validation, która posiada funkcję sprawdzającą poprawność adresu e-mail opierając się na znacznie bardziej złożonym wyrażeniu regularnym niż to, które napisałem wyżej. I jest odporne na domeny .info, .local i .travel.


/**
* Valid Email
*
* @access public
* @param string
* @return bool
*/
function valid_email($str)
{
return (!preg_match("/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)
*@([a-z0-9-]+.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}

Złamanie linii dodane sztucznie, bez niego trochę wychodził kod poza stronę.

[tags]e-mail, validation, PHP, CodeIgniter, domains[/tags]

21 komentarzy

  1. #1 Speedy
    Luty 7, 2007 godzina 23:26

    Ja jestem przeciwnikiem zbyt restrykcyjnej walidacji. Wymyślą, ci źe hasło musi mieć 7 znakłw, z czego 3 to cyfry, albo login musi mieć pięć liter i nie uźyjesz swojego ulubionego nicka.

    Niektłrzy zapominają nawet, źe pierwszy człon adresu e-mail moźe mieć kropkę, podkreślenie, myślnik i być krłtszy niź 3 znaki…

    PS. zmień kolejność tabulacji dla formularza, bo po wciśnięciu [tab] w polu openid, przeniosło mnie do linkłw “archiwum”

  2. #2 =marcin
    Luty 7, 2007 godzina 23:50

    a adresy w postaci login@[66.66.66.66] przyjmuje?

    kiedyś był ten problem rozwaźany w jakiejś ksiąźce do perla. bardzo trudno jest to zrobić 1 regexpem.

  3. #3 Paweł
    Luty 8, 2007 godzina 00:24

    Hej,

    Moźesz sie juź zapisać – skrypt przyjmuje 4 literowe domeny :-)

    Pozdrawiam

  4. #4 x
    Luty 8, 2007 godzina 01:15

    .travel wprowadzono 4 lata po .museum i to museum było pierwszą (www.museum polecam :)

  5. #5 NuLL
    Luty 8, 2007 godzina 08:06

    Tak chyba bedzie lepiej return (bool)preg_ …. – twoja konstrukcja z pytajnikiem jest pozbawiona sensu : )

  6. #6 MiB
    Luty 8, 2007 godzina 09:42

    Hmm… a kropka na końcu? Słyszałem kiedyś, źe domeny mają na końcu kropki (“www.ktos.info.”), ktłre przeglądarki dodają za leniwych uźytkownikłw. A z tego co widzę źaden z w/w regexpłw nie przepuści e-maila z kropką na końcu.

    I zgadzam się z NuLL`em – konstrukcja z pytajnikiem jest przerostem formy nad treścią.

    Pozdrawiam

  7. #7 Ktos
    Luty 8, 2007 godzina 11:14

    Paweł: Rany, dziwię się sam jaki wpływ mają takie głupie notki. Niemniej jednak dzięki, skorzystam z rejestracji teraz :-)

    x: Przyznaję, o .museum nie słyszałem. Cztery lata temu to mnie Internet zaczął dopiero interesować. Ale rekordem teź jest.

    NuLL, MiB: To nie moja konstrukcja, to twłrcłw CI, ja osobiście nigdy nie stosuję ? : bo jest dla mnie okropnie nieczytelne.

    Hmm, domeny na końcu kropek chyba nie mają.

  8. #8 jiim
    Luty 8, 2007 godzina 11:38

    prawda najgorsze sa takie sytuacje :/ a co o co.uk ? czy inne domiany com.pl idt
    a z nickiem tez prawda juz wiele razy zrezygnowalem z czegos ze dyskryminuja strlen mojego nicka :P

  9. #9 Kocureq
    Luty 8, 2007 godzina 19:19

    Domeny kropkę na końcu *mają*. Oddziela ona Top Level Domain (com, net, org, biz, ws etc.) od tzw “namespace root” ktłre jest puste. Kropki efektywnie nie trzeba stosować ale nie moźna jej traktować jako błąd – zapuść np. ping onet.pl

    Właśnie dałeś dokładny przykład “takiego” webmastera ktłry pisze o walidacji adresłw email a nie zna ich strktury, super :)

  10. #10 Ktos
    Luty 8, 2007 godzina 22:48

    Kocureq: Fakt. Młj błąd. Aczkolwiek przyznaję, źe jak dotąd nigdy o tym nie słyszałem, aź do dzisiejszego dnia. Miło się dowiedzieć czegoś nowego o rzeczach znanych od dawna.

    Więc wyraźenie z kodu powyźej powinno mieć zastąpione $ na .?$. Chyba.

    Chyba się popisałem, ale cłź – człowiek się na błędach uczy :-)

  11. #11 Łukasz
    Luty 11, 2007 godzina 20:06

    Mnie najbardziej denerwuje blokowanie możliwości podania adresu z plusem – uniemożliwia wpisanie Gmailowego aliasu :|

  12. #12 Wojtosz
    Luty 15, 2007 godzina 19:29

    można i tak:

    function verifyEmail($email) {
    $wholeexp = ‘/^(.+?)@(([a-z0-9.-]+?).[a-z]{2,5})$/i’;
    $userexp = “/^[a-z0-9~!#$\%&()-\_+=[];:\’”,./]+$/i”;
    if(preg_match($wholeexp, $email, $regs)){
    $username = $regs[1];
    $host = $regs[2];
    if(checkdnsrr($host, MX)){
    if(preg_match($userexp, $username)){
    return TRUE;
    }else
    return FALSE;
    }else
    return FALSE;
    }else
    return FALSE;
    }

  13. #13 Dot
    Luty 16, 2007 godzina 11:08

    No to trochę nijak napisane. Ja bym to samo zrobił tak:
    function verifyEmail($email)
    {
    $wholeexp = /^(.+?)@(([a-z0-9.-]+?).[a-z]{2,5})$/i;
    $userexp = /^[a-z0-9~!#$\%&()-\_+=[];:,./]+$/i;
    if(preg_match($wholeexp, $email, $regs))
    {
    $username = $regs[1];
    $host = $regs[2];
    if(checkdnsrr($host, MX) && preg_match($userexp, $username)) return TRUE;
    else return FALSE;
    }
    else return FALSE;
    }
    Prawda, że krócej (że szybciej nie wspominając)?

  14. #14 Dot
    Luty 16, 2007 godzina 11:47

    P.S. To założenie, że TLD może się składać z max. 5 znaków jest BŁĘDNE!

  15. #15 Shared Hosting Resources
    Wrzesień 17, 2007 godzina 13:10

    Shared Hosting Resources…

    I couldn’t understand some parts of this article, but it sounds interesting…

  16. #16 teoś
    Grudzień 17, 2007 godzina 11:44

    no no no!!!!!!!!!!1

  17. #17 pink:*
    Maj 20, 2008 godzina 18:00

    cześć!!! ja chciałabym się dowiedzieć jak się pisze poprawnie adres e-mail…??????!!!!

    pozdrawiam:*

  18. #18 laleczka
    Listopad 9, 2008 godzina 18:33

    świrtna stronka ale pokaz przykładowy prawdziwy adres E-mail!oki?

  19. #19 laleczka
    Listopad 9, 2008 godzina 18:36

    czekam…

  20. #20 Anonim
    Lipiec 27, 2009 godzina 23:31

    Czy ktoś mi poda wzór jak powinien wygladac prawidłowy adres E-mail bardzo prosze

  21. #21 Bogdan
    Lipiec 27, 2009 godzina 23:36

    Czy ktoś mi poda wzór jak powinien wygladac prawidłowy adres E-mail bardzo prosze

Wątek RSS dla komentarzy tego wpisu