Bir e-posta göndermeden bir e-posta adresinin olup olmadığı nasıl kontrol edilir?


123

Bununla karşılaştım E-posta göndermeden SMTP kullanarak e-posta adresini kontrol etmek için PHP koduyla karşılaştım .

Kimse benzer bir şey denedi mi veya sizin için çalışıyor mu? Bir e-posta müşterisinin / kullanıcının girdiği bir e-postanın doğru ve var olup olmadığını söyleyebilir misiniz?



2
Merak ediyorum, neden bunun Telnet etiketi var?
Piccolo

2
Tam olarak bunu yapan bir PHP kitaplığı var: github.com/kickboxio/kickbox-php
Dan

Kickbox Ücretsiz değil. Bu API, hizmetlerine bağlanmak için yalnızca bir sarmalayıcıdır.
Ashit Vora

Yanıtlar:


92

Bir alıcının gerçekten var olup olmadığını belirlemek için bazen kullanabileceğiniz iki yöntem vardır:

  1. Sunucuya bağlanabilir ve bir VRFYkomut verebilirsiniz . Çok az sunucu bu komutu destekler, ancak tam olarak buna yöneliktir. Sunucu bir 2.0.0 DSN ile yanıt verirse, kullanıcı vardır.

    VRFY user
  2. Bir RCPTdüzenleyebilir ve postanın reddedilip reddedilmediğini görebilirsiniz.

    MAIL FROM:<>
    RCPT TO:<user@domain>

Kullanıcı yoksa, 5.1.1 DSN alırsınız. Ancak, e-postanın reddedilmemesi, kullanıcının var olduğu anlamına gelmez. Bazı sunucular, kullanıcılarının numaralandırılmasını önlemek için böyle istekleri sessizce atar. Diğer sunucular kullanıcıyı doğrulayamaz ve ne olursa olsun mesajı kabul etmek zorundadır.

Ayrıca, gerçek bir SMTP sunucusunun bir süre sonra yeniden teslim etmeyi denemesini beklerken, sunucunun adresi başlangıçta reddetmesine neden olan gri listeleme adı verilen bir antispam tekniği de vardır. Bu, adresi doğrulama girişimlerini bozacaktır.

Açıkçası, bir adresi doğrulamaya çalışıyorsanız, en iyi yaklaşım, açıkça geçersiz olan adresleri engellemek için basit bir normal ifade kullanmak ve ardından, e-postanın alındığını doğrulayacak bir bağlantıyı sisteminize geri gönderen gerçek bir e-posta göndermektir. Bu aynı zamanda kullanıcının başka birine ait olan küçük bir yazım hatasını değil, gerçek e-postasını girmesini sağlar.


10
Bazı sunucular mesajı bile kabul eder, ancak daha sonra, özellikle kendi posta sunucularına sahip birçok dahili departmana sahip büyük bir kuruluşsa, zarf gönderenine bir hata mesajı geri gönderir. Sınır sunucusu, içindeki tüm hesapları bile bilmeyebilir.
David Mårtensson

3
Öyleyse neden spam gönderenler e-posta adreslerini doğrulamak için bu yöntemi kullanmıyor? Yani bu yöntemlerin çok az sayıda sunucu tarafından desteklendiği gerçeğini bir kenara bırakıyorum. Yoksa onlar mı?
Shahriyar Imanov

7
@Shehi: Aslında spam olabilir söylemek zor bu yöntemi kullanır. Spam Ancak, belki kullanmak, hemen hemen tüm posta sunucuları VRFY muhtemelen işe yaramaz yani pratikte, VRFY devre dışı bırakın.
sleske

2
RCPT TO: <kullanıcı @ alan> 'ın nasıl kullanılacağına dair bir kod örneği verebilir misiniz? Teşekkürler
Papa De Beau

4
Gmail,
VRFY'ye

46

Buradaki diğer cevaplar, bunu yapmaya çalışmakla ilgili çeşitli sorunları tartışmaktadır. Bunu kendiniz yaparak öğrenmek istemeniz durumunda bunu nasıl deneyebileceğinizi göstereyim diye düşündüm.

Bir e-posta adresinin olup olmadığını sormak için telnet aracılığıyla bir posta sunucusuna bağlanabilirsiniz. Aşağıda bir e-posta adresinin test edilmesine bir örnek verilmiştir stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Yetkisiz cevap:
stackoverflow.com MX tercihi = 40, posta değiştirici = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com MX tercihi = 10, posta değiştirici = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com MX tercihi = 20, posta değiştirici = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com MX tercihi = 30, posta değiştirici = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 hazır. CA İş ve Meslekler Kodu Bölüm 17538.45, bu sistemin istenmeyen elektronik posta reklamları için kullanılmasını yasaklar.

merhaba merhaba
250 Postini tekrar merhaba diyor

posta: <me@myhost.com>
250 Tamam

rcpt to: <fake@stackoverflow.com>
550-5.1.1 Ulaşmaya çalıştığınız e-posta hesabı mevcut değil. Deneyin lütfen
550-5.1.1 alıcının e-posta adresinde yazım hataları veya
550-5.1.1 gereksiz alanlar. Daha fazla bilgi edinin
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Sayısal kodların önüne eklenen satırlar, SMTP sunucusundan gelen yanıtlardır. Daha okunaklı olması için bazı boş satırlar ekledim.

Çoğu posta sunucusu, e-posta adresinin istenmeyen posta gönderenler tarafından toplanmasını önlemek için bu bilgileri döndürmez, bu nedenle bu tekniğe güvenemezsiniz. Bununla birlikte, geçersiz posta sunucularını tespit ederek veya alıcı adreslerinin yukarıdaki gibi reddedilmesini sağlayarak açıkça kötü olan bazı e-posta adreslerini temizlemekte biraz başarılı olabilirsiniz.

Çok fazla istekte bulunursanız posta sunucularının sizi kara listeye alabileceğini de unutmayın.


PHP ben kullanabilirsiniz inanıyoruz fsockopen, fwriteve freadprogramlı yukarıdaki adımları gerçekleştirmek için:

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");

şapkalar çıkar! bulduğum bir sorun, 25 numaralı bağlantı noktası her zaman düşük öncelikli mx kaydıyla mı çalışıyor?
Dhruvenkumar Shah

@DhruvenkumarShah, üzgünüm bilmiyorum. Eğer öğrenirseniz, lütfen tekrar yorum yapın.
Drew Noakes

Merhaba, MX kayıtları hakkında her şeyi öğrenmek için kendi üniversite hesabım için uğraşıyordum ama 25 için işe yaramadı .. ama çevrimiçi doğrulama-e-posta.org türü web sitesi işe yaradı .. nasıl yapıyorlar .. I öğrenirsem size haber veririm
Dhruvenkumar Shah

1
@DhruvenkumarShah birkaç posta değişim sunucusu adı verir. posta değiştiriciler için cevaba bakın. bu yüzden biri başarısız olursa, listedeki diğeri çalışmalıdır.
Janaka R Rajapaksha

bana gerçekten çok yardım ettim .. teşekkür ederim efendim .. macunla denedim ve takılar gibi çalışıyor .. teşekkürler ..
Mohammed Sufian

8

Genel cevap, bir e-posta adresinin var olup olmadığını kontrol edemezsiniz, eğer ona bir e-posta gönderirseniz olay: bir kara deliğe girebilir.

Bununla birlikte, orada açıklanan yöntem oldukça etkilidir. QUIT yerine RSET kullanması dışında ZoneCheck'te üretim kodunda kullanılır .

Posta kutusuyla kullanıcı etkileşiminin pahalı olmadığı durumlarda, pek çok site aslında postanın bir yere ulaşıp ulaşmadığını, göndericiye geri gönderilmesi gereken gizli bir numara göndererek (ya gizli bir URL'ye giderek ya da bu gizli numarayı e-posta ile geri göndererek) test eder. Çoğu posta listesi bu şekilde çalışır.



6

Hedef posta sunucusu gri listeleme kullandığında (diğer durumların yanı sıra) bu başarısız olacaktır.

Gri listeleme : SMTP sunucusu önceden bilinmeyen bir istemci ilk bağlandığında teslimatı reddeder, bir sonraki sefer (ler) e izin verir; Bu, meşru kullanıma izin verirken istenmeyen postaların bir kısmını dışarıda tutar - çünkü meşru bir posta göndericisinin yeniden denemesi beklenir, normal posta aktarım aracıları bunu yapar.

Bununla birlikte, kodunuz sunucuyu yalnızca bir kez kontrol ederse, gri listelemeli bir sunucu teslimatı reddeder (istemciniz ilk kez bağlanırken); Kısa bir süre sonra tekrar kontrol etmezseniz, yanlış bir şekilde geçerli e-posta adreslerini reddediyor olabilirsiniz.


(kişisel deneyim: E-posta sağlayıcımla, evet , ne yaptığımın farkındayım ve evet , gri listelemeyi iptal etmem gerektiğini tartışmak zorunda kaldım - çünkü üçüncü taraf bir hizmetten gelen bu kontroller başarısız oluyordu )
Piskvor,

4

Bazı sorunlar:

  1. Eminim bazı SMTP sunucuları, verdiğiniz bir adres yoksa size hemen haber verecektir, ancak bazıları bir gizlilik önlemi olarak olmayacaktır. Onlara verdiğiniz adresleri kabul edecekler ve var olmayanları sessizce görmezden gelecekler.
  2. Makalede dediği gibi, bunu bazı sunucularda çok sık yaparsanız, sizi kara listeye alacaklardır.
  3. Bazı SMTP sunucuları için (gmail gibi), herhangi bir şey yapmak için SSL kullanmanız gerekir. Bu yalnızca e-posta göndermek için Gmail'in SMTP sunucusunu kullanırken geçerlidir .

Üçüncü nokta ile ilgili olarak, bu yalnızca onu bir aktarıcı olarak kullanmak istiyorsanız olur. SSL gerektiren herhangi bir posta göndericisi bilmiyorum. Herhangi biri bunu yaparsa, birçok kullanıcıdan e-posta almayı durdururlar.
kmkaplan

Üzgünüm, benim hatam. Gmail'in SMTP sunucusunu kullanarak e-posta göndermek istiyorsanız , SSL kullanmanız gerekir.
Graeme Perrow

3

Bu soru biraz eski olsa da, bu hizmet ipucu benzer bir çözüm arayan kullanıcıların göndermeden önce sözdizimi doğrulamasının ötesinde e-posta adreslerini kontrol etmelerine yardımcı olabilir.

Bu açık kaynaklı hizmeti , iyi sonuçları olan birkaç proje için e-postaları daha derinlemesine doğrulamak için (e-posta adresi etki alanında mx kayıtlarını kontrol etmek vb.) Kullanıyorum. Ayrıca yaygın yazım hatalarını denetler cadı oldukça kullanışlıdır. Demo burada .


Bu hizmetin açık kaynak olduğunu iddia ediyorsunuz. Kaynağa bir bağlantı verebilir misiniz?
amaurymartiny

Üzgünüm @amaurymartiny yapamam. Mailgun projesini yazdığım sırada doğru hatırlıyorsam açık kaynak kodluydu ancak bu süreden sonra kaynağı sağlayan herhangi bir depoya bağlantı bulamıyorum.
Henkealg

2

"Giren bir e-posta müşterisinin / kullanıcının doğru olup olmadığını ve var olup olmadığını söyleyebilir misiniz?"

Aslında bunlar iki ayrı şey. Bu belki mevcut ancak doğru olmayabilir.

Bazen kullanıcı girdilerini yüz değerinde almanız gerekir. Aksi takdirde sistemi yenmenin birçok yolu vardır.


2
+1 Bir e-posta göndermeden ve aslında bir bağlantıyı tıklamak gibi bir insan yanıtı almadan asla doğru olduğundan emin olamazsınız .
Daniel Daranas

e-posta gövdesinde bir bağlantıyı (bir resim vb. için) tutabilir ve bu bağlantı için her yükü sayabilirsiniz. tıklamaları beklemeye gerek yok
Janaka R Rajapaksha

2

Yapabileceğiniz tek şey, DNS'de arama yapmak ve e-posta adresindeki etki alanında bir MX kaydı olduğundan emin olmaktır, bunun dışında bununla başa çıkmanın güvenilir bir yolu yoktur.

Bazı sunucular, SMTP sunucusuyla konuştuğunuz yerde rcpt-to yöntemi ile çalışabilir, ancak bu tamamen sunucunun yapılandırmasına bağlıdır. Başka bir sorun, aşırı yüklenmiş bir sunucu, kullanıcının bilinmediğini belirten bir 550 kodu döndürebilir, ancak bu geçici bir hatadır, döndürülebilecek kalıcı bir hata (451 sanırım?) Var. Bu bağlıdır tamamen sunucunun konfigürasyonuna .

Kişisel olarak DNS MX kaydını kontrol eder ve ardından MX kaydı varsa bir e-posta doğrulaması gönderirdim.


2
function EmailValidation($email)
{
    $email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
    if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
        //checks to make sure the email address is in a valid format
        $domain = explode( "@", $email ); //get the domain name
        if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
            //if the connection can be established, the email address is probably valid
            echo "Domain Name is valid ";
            return true;
        } else {
            echo "Con not a email domian";
            return false; //if a connection cannot be established return false
        }
        return false; //if email address is an invalid format return false
    }
}

1
80 numaralı bağlantı noktası mantıklı değil
jrosell

5
Sanırım bu, e-postanın kendisini kontrol etmek yerine alan adının var olup olmadığını kontrol etmek.
The Angry Saxon

Bu daha yararlı olabilir:getmxrr
jchook

1

Bunun kullanıcının adresi olduğunu varsayarsak , bazı posta sunucuları SMTP VRFY komutunun e-posta adresini posta kutularında doğrulamasına izin verir. Büyük sitelerin çoğu size fazla bilgi vermeyecek; gmail yanıtı "e-postayla göndermeye çalışırsanız, biz teslim etmeye çalışırız" veya bunun gibi akıllıca bir şeydir.


1

Bence yapamazsınız, bir e-posta göndermenin bile başarısız olabileceği pek çok senaryo var. Örneğin. kullanıcı tarafındaki posta sunucusu geçici olarak çalışmıyor, posta kutusu var ancak dolu, bu nedenle ileti teslim edilemiyor vb.

Muhtemelen bu kadar çok site, kullanıcı onay e-postasını aldığını onayladıktan sonra bir kaydı onaylar.


0

Joseph ve Drew’un yanıtlarını onaylayabilirim RCTP TO: <address_to_check>. Bu cevapların üstüne biraz ek eklemek istiyorum.

Tümünü yakalama sağlayıcıları

Bazı posta sağlayıcıları bir tümünü yakalama politikası uygular; bu *@mydomain.com,RCTP TO: komuta . Ancak bu, posta kutusunun "bir insana ait olduğu" gibi "var olduğu" anlamına gelmez. Burada pek bir şey yapılamaz, sadece farkında olun.

IP Gri Listeleme / Kara Liste

Gri listeleme: Bilinmeyen IP'den gelen 1. bağlantı engellendi. Çözüm: en az 2 kez yeniden deneyin.

Kara listeye alma: Aynı IP'den çok fazla istek gönderirseniz, bu IP engellenir. Çözüm: IP rotasyonunu kullanın; Reacher , Tor kullanıyor.

Kayıt formlarındaki HTTP istekleri

Bu, sağlayıcıya çok özeldir, ancak bazen iyi hazırlanmış HTTP isteklerini kullanabilir ve bir kullanıcı adının bu sağlayıcıya zaten kayıtlı olup olmadığını görmek için bu isteklerin yanıtlarını ayrıştırabilirsiniz.

*@yahoo.comHTTP isteklerini kullanarak adresleri kontrol etmek için yazdığım açık kaynaklı bir kütüphaneden ilgili işlev : check-if-email-existing . Kodumun Rust olduğunu ve bu iş parçacığının PHP olarak etiketlendiğini biliyorum, ancak aynı fikirler geçerlidir.

Tam Gelen Kutusu

Bu uç bir durum olabilir, ancak kullanıcının gelen kutusu dolu olduğunda, dolu olduğunu belirten RCTP TO:bir 5.1.1 DSNhata mesajı verir. Bu, hesabın gerçekten var olduğu anlamına gelir!

ifşa

Gerçek zamanlı bir e-posta doğrulama API'si olan Reacher'ı çalıştırıyorum . Kodum Rust'ta yazılmıştır ve% 100 açık kaynaklıdır. Daha sağlam bir çözüm istiyorsanız kontrol edin:

Github: https://github.com/amaurymartiny/check-if-email-exists

Çemberleri aşmak için çeşitli tekniklerin bir kombinasyonu ile, müşterilerimin kontrol ettiği e-postaların yaklaşık% 80'ini doğrulamayı başardım .


-8
<?php

   $email = "someone@exa mple.com";

   if(!filter_var($email, FILTER_VALIDATE_EMAIL))
      echo "E-mail is not valid";
   else
      echo "E-mail is valid";

?>

Kullanıcı php değil bir .Net çözümü istiyor.
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.