Bagaimana cara memeriksa apakah alamat email ada tanpa mengirim email?

123

Saya telah menemukan kode PHP ini untuk memeriksa alamat email menggunakan SMTP tanpa mengirim email .

Adakah yang mencoba sesuatu yang serupa atau apakah itu berhasil untuk Anda? Dapatkah Anda mengetahui apakah email yang dimasukkan pelanggan / pengguna benar & ada?

php-guy
sumber
2
Hanya ingin tahu, mengapa ini memiliki tag Telnet?
Piccolo
2
Ada pustaka PHP yang melakukan hal itu: github.com/kickboxio/kickbox-php
Dan
Kickbox tidak Gratis. API ini hanyalah pembungkus untuk terhubung ke layanan mereka.
Ashit Vora

Jawaban:

92

Ada dua metode yang terkadang dapat Anda gunakan untuk menentukan apakah penerima benar-benar ada:

  1. Anda dapat terhubung ke server, dan mengeluarkan VRFYperintah. Sangat sedikit server yang mendukung perintah ini, tetapi memang ditujukan untuk hal ini. Jika server merespons dengan DSN 2.0.0, pengguna tersebut ada.

    VRFY user
  2. Anda dapat mengeluarkan RCPT, dan melihat apakah surat tersebut ditolak.

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

Jika pengguna tidak ada, Anda akan mendapatkan DSN 5.1.1. Namun, hanya karena email tersebut tidak ditolak, tidak berarti pengguna tersebut ada. Beberapa server diam-diam akan membuang permintaan seperti ini untuk mencegah pencacahan pengguna mereka. Server lain tidak dapat memverifikasi pengguna dan harus menerima pesan tersebut.

Ada juga teknik antispam yang disebut greylisting, yang akan menyebabkan server menolak alamat pada awalnya, mengharapkan server SMTP yang sebenarnya akan mencoba mengirim ulang beberapa waktu kemudian. Ini akan mengacaukan upaya untuk memvalidasi alamat.

Sejujurnya, jika Anda mencoba untuk memvalidasi alamat, pendekatan terbaik adalah dengan menggunakan regex sederhana untuk memblokir alamat yang jelas tidak valid, dan kemudian mengirim email yang sebenarnya dengan link kembali ke sistem Anda yang akan memvalidasi email yang diterima. Ini juga memastikan bahwa pengguna mereka memasukkan email mereka yang sebenarnya, bukan kesalahan ketik kecil yang terjadi pada orang lain.

Joseph Tary
sumber
10
Beberapa server bahkan akan menerima pesan tersebut tetapi kemudian mengirim pesan kesalahan kembali ke pengirim amplop, terutama jika itu adalah organisasi besar dengan banyak departemen internal dengan server email mereka sendiri. Server perbatasan mungkin bahkan tidak mengetahui semua akun di dalamnya.
David Mårtson
3
Lalu mengapa spammer tidak menggunakan metode ini untuk memverifikasi email addies? Maksud saya, selain fakta bahwa metode ini didukung oleh sangat sedikit server. Atau apakah mereka?
Shahriyar Imanov
7
@Shehi: Sebenarnya pelaku spam mungkin menggunakan metode ini, itu sulit untuk dikatakan . Namun, karena pelaku spam mungkin menggunakannya, hampir semua server email menonaktifkan VRFY, jadi dalam praktiknya VRFY mungkin tidak berguna.
sleske
2
Dapatkah Anda memberikan contoh kode cara menggunakan RCPT TO: <user @ domain>? Terima kasih
Papa De Beau
4
Untuk VRFY, gmail menjawab "Kirim beberapa email, saya akan mencoba yang terbaik" ;-)
Armel Larcier
46

Jawaban lain di sini membahas berbagai masalah dengan mencoba melakukan ini. Saya pikir saya akan menunjukkan bagaimana Anda dapat mencoba ini jika Anda ingin belajar dengan melakukannya sendiri.

Anda dapat terhubung ke server email melalui telnet untuk menanyakan apakah ada alamat email. Berikut adalah contoh pengujian alamat email untuk stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Jawaban non-otoritatif:
stackoverflow.com Preferensi MX = 40, penukar surat = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com preferensi MX = 10, mail exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com Preferensi MX = 20, penukar surat = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com preferensi MX = 30, mail exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 siap. Bagian Kode Bisnis dan Profesi CA 17538.45 melarang penggunaan sistem ini untuk iklan surat elektronik yang tidak diminta.

helo hai
250 Postini menyapa kembali

surat dari: <[email protected]>
250 Oke

rcpt ke: <[email protected]>
550-5.1.1 Akun email yang Anda coba hubungi tidak ada. Silakan coba
550-5.1.1 memeriksa ulang alamat email penerima jika ada kesalahan ketik atau
550-5.1.1 spasi yang tidak perlu. Pelajari lebih lanjut di
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Garis yang diawali dengan kode numerik adalah tanggapan dari server SMTP. Saya menambahkan beberapa baris kosong agar lebih mudah dibaca.

Banyak server email tidak akan mengembalikan informasi ini sebagai cara untuk mencegah perampasan alamat email oleh pelaku spam, jadi Anda tidak dapat mengandalkan teknik ini. Namun, Anda mungkin berhasil membersihkan beberapa alamat email yang jelas buruk dengan mendeteksi server email yang tidak valid, atau alamat penerima ditolak seperti di atas.

Perhatikan juga bahwa server email dapat memasukkan Anda ke daftar hitam jika Anda membuat terlalu banyak permintaan.


Di PHP saya yakin Anda dapat menggunakan fsockopen, fwritedan freaduntuk melakukan langkah-langkah di atas secara terprogram:

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <[email protected]>\r\n");
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n");
Drew Noakes
sumber
hormat! satu masalah yang saya temukan adalah, apakah port 25 selalu bekerja dengan catatan mx prioritas rendah ??
Dhruvenkumar Shah
@DhruvenkumarShah, maaf saya tidak tahu. Jika Anda mengetahuinya, silakan beri komentar lagi.
Drew Noakes
Hai, Saya baru saja mencoba akun universitas saya sendiri untuk mencari tahu semua tentang data MX tetapi tidak berhasil untuk 25 .. tetapi situs web jenis verifikasi-email.org online berhasil .. bagaimana mereka melakukannya .. Saya akan memberi tahu Anda tentang hal itu jika saya menemukannya
Dhruvenkumar Shah
1
@DhruvenkumarShah memberikan beberapa nama server pertukaran email. lihat jawabannya untuk penukar surat. jadi jika salah satu gagal, yang lain dari daftar harus berfungsi.
Janaka R Rajapaksha
benar-benar sangat membantu penuh untuk saya .. terima kasih pak .. saya mencobanya dalam dempul dan bekerja seperti pesona .. terima kasih ..
Mohammed Sufian
8

Jawaban umumnya adalah Anda tidak dapat memeriksa apakah ada peristiwa alamat email jika Anda mengirim email ke sana: itu bisa saja masuk ke lubang hitam.

Dengan demikian metode yang dijelaskan di sana cukup efektif. Ini digunakan dalam kode produksi di ZoneCheck kecuali bahwa ia menggunakan RSET, bukan QUIT.

Di mana interaksi pengguna dengan kotak suratnya tidak terlalu mahal, banyak situs yang benar-benar menguji bahwa surat itu tiba di suatu tempat dengan mengirimkan nomor rahasia yang harus dikirim kembali ke emitor (baik dengan membuka URL rahasia atau mengirim kembali nomor rahasia ini melalui email). Kebanyakan milis bekerja seperti itu.

kmkaplan
sumber
6

Tidak juga ..... Beberapa server mungkin tidak memeriksa "rcpt to:"

http://www.freesoft.org/CIE/RFC/1123/92.htm

Melakukannya adalah risiko keamanan .....

Jika server melakukannya, Anda dapat menulis bot untuk menemukan setiap alamat di server ....

l_39217_l
sumber
saya berpikir tentang itu juga :)
Janaka R Rajapaksha
6

Ini akan gagal (di antara kasus lain) ketika server email target menggunakan daftar abu-abu.

Daftar abu-abu : Server SMTP menolak pengiriman pertama kali klien yang sebelumnya tidak dikenal terhubung, memungkinkan waktu berikutnya; hal ini membuat beberapa persentase spambots keluar, sementara memungkinkan penggunaan yang sah - seperti yang diharapkan bahwa pengirim email yang sah akan mencoba lagi , yang akan dilakukan oleh agen transfer email biasa.

Namun, jika kode Anda hanya memeriksa server sekali , server dengan daftar abu-abu akan menolak pengiriman (karena klien Anda terhubung untuk pertama kali); kecuali jika Anda memeriksanya lagi dalam beberapa saat, Anda mungkin salah menolak alamat email yang valid.

Piskvor meninggalkan gedung
sumber
(pengalaman pribadi: Saya harus bolak-balik berdebat dengan penyedia email saya bahwa ya , saya tahu apa yang saya lakukan, dan ya , saya perlu daftar abu-abu - karena pemeriksaan dari layanan pihak ketiga ini gagal )
Piskvor meninggalkan gedung
4

Beberapa isu:

  1. Saya yakin beberapa server SMTP akan segera memberi tahu Anda jika alamat yang Anda berikan tidak ada, tetapi beberapa tidak sebagai ukuran privasi. Mereka hanya akan menerima alamat apa pun yang Anda berikan dan diam-diam mengabaikan alamat yang tidak ada.
  2. Seperti kata artikel tersebut, jika Anda melakukan ini terlalu sering dengan beberapa server, mereka akan memasukkan Anda ke dalam daftar hitam.
  3. Untuk beberapa server SMTP (seperti gmail), Anda perlu menggunakan SSL untuk melakukan apa pun. Ini hanya berlaku jika menggunakan server SMTP Gmail untuk mengirim email.
Graeme Perrow
sumber
Mengenai poin ketiga, hal ini hanya terjadi jika Anda ingin menggunakannya sebagai relay. Saya tidak tahu ada penukar surat yang membutuhkan SSL. Jika ada yang melakukan ini, mereka akan berhenti menerima email dari banyak pengguna.
kmkaplan
Maaf, salah saya. Jika Anda ingin mengirim email menggunakan server SMTP gmail, Anda harus menggunakan SSL.
Graeme Perrow
3

Meskipun pertanyaan ini agak lama, tip layanan ini dapat membantu pengguna yang mencari solusi serupa untuk memeriksa alamat email di luar validasi sintaks sebelum mengirim.

Saya telah menggunakan layanan sumber terbuka ini untuk memvalidasi email yang lebih mendalam (memeriksa catatan mx di domain alamat email, dll.) Untuk beberapa proyek dengan hasil yang baik. Ini juga memeriksa penyihir kesalahan ketik umum yang cukup berguna. Demo di sini .

Henkealg
sumber
Anda mengklaim layanan ini open-source. Bisakah Anda memberikan tautan ke sumbernya?
amaurymartiny
Maaf @amaurymartiny saya tidak bisa. Pada saat penulisan, proyek Mailgun adalah open source jika saya ingat dengan benar tetapi saya tidak dapat menemukan tautan ke repo mana pun yang menyediakan sumber setelah waktu ini.
Henkealg
2

"Dapatkah Anda mengetahui apakah email yang dimasukkan pelanggan / pengguna benar & ada?"

Sebenarnya ini adalah dua hal yang berbeda. Ini mungkin ada tetapi mungkin tidak benar.

Terkadang Anda harus mengambil input pengguna pada nilai nominalnya. Ada banyak cara untuk mengalahkan sistem jika tidak.

Belajar
sumber
2
+1 Anda tidak akan pernah bisa memastikan bahwa ini benar tanpa mengirim email dan benar-benar mendapatkan tanggapan manusia untuk itu, seperti mengklik tautan.
Daniel Daranas
Anda dapat menyimpan tautan (untuk gambar, dll.) di badan email dan menghitung setiap pemuatan untuk tautan itu. tidak perlu menunggu klik
Janaka R Rajapaksha
2

Tentang semua yang dapat Anda lakukan adalah mencari DNS dan memastikan domain yang ada di alamat email memiliki catatan MX, selain itu tidak ada cara yang dapat diandalkan untuk menangani ini.

Beberapa server mungkin bekerja dengan metode rcpt-to di mana Anda berbicara dengan server SMTP, tetapi itu sepenuhnya bergantung pada konfigurasi server. Masalah lain mungkin server yang kelebihan beban dapat mengembalikan kode 550 yang mengatakan pengguna tidak diketahui, tetapi ini adalah kesalahan sementara, ada kesalahan permanen (menurut saya 451?) Yang dapat dikembalikan. Ini sepenuhnya bergantung pada konfigurasi server.

Saya pribadi akan memeriksa data MX DNS, kemudian mengirim verifikasi email jika data MX tersebut ada.

Bryan Rehbein
sumber
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
    }
}
Sachin
sumber
1
port 80 tidak masuk akal
jrosell
5
Saya pikir itu hanya memeriksa nama domain yang ada daripada memeriksa email itu sendiri.
The Angry Saxon
Ini mungkin lebih berguna:getmxrr
jchook
1

Dengan asumsi itu adalah alamat pengguna , beberapa server email mengizinkan perintah SMTP VRFY untuk benar-benar memverifikasi alamat email tersebut terhadap kotak suratnya. Sebagian besar situs utama tidak akan memberi Anda banyak informasi; tanggapan gmail adalah "jika Anda mencoba mengirimkannya, kami akan mencoba mengirimkannya" atau sesuatu yang pintar seperti itu.

Austin Salonen
sumber
1

Saya pikir Anda tidak bisa, ada begitu banyak skenario di mana bahkan pengiriman email bisa gagal. Misalnya. server email di sisi pengguna untuk sementara tidak aktif, kotak surat ada tetapi penuh sehingga pesan tidak dapat dikirim, dll.

Itu mungkin mengapa begitu banyak situs memvalidasi pendaftaran setelah pengguna mengonfirmasi bahwa mereka telah menerima email konfirmasi.

PhiLho
sumber
0

Saya dapat memastikan jawaban Joseph dan Drew untuk digunakan RCTP TO: <address_to_check>. Saya ingin menambahkan sedikit tambahan di atas jawaban tersebut.

Penyedia layanan umum

Beberapa penyedia email menerapkan kebijakan penampung-semua, artinya *@mydomain.comakan mengembalikan RCTP TO:perintah positif . Tetapi ini tidak berarti bahwa kotak surat "ada", seperti dalam "milik manusia". Tidak banyak yang bisa dilakukan di sini, waspadalah.

IP Greylisting / Blacklisting

Daftar abu-abu: Sambungan pertama dari IP yang tidak dikenal diblokir. Solusi: coba lagi setidaknya 2 kali.

Daftar Hitam: jika Anda mengirim terlalu banyak permintaan dari IP yang sama, IP ini diblokir. Solusi: gunakan rotasi IP; Reacher menggunakan Tor.

Permintaan HTTP pada formulir pendaftaran

Ini sangat khusus untuk penyedia, tetapi terkadang Anda dapat menggunakan permintaan HTTP yang dibuat dengan baik, dan mengurai respons permintaan ini untuk melihat apakah nama pengguna sudah terdaftar atau belum dengan penyedia ini.

Berikut adalah fungsi yang relevan dari pustaka sumber terbuka yang saya tulis untuk memeriksa *@yahoo.comalamat menggunakan permintaan HTTP: check-if-email-existing . Saya tahu kode saya Rust dan utas ini diberi tag PHP, tetapi ide yang sama berlaku.

Kotak Masuk Penuh

Ini mungkin kasus tepi, tetapi ketika pengguna memiliki kotak masuk penuh, RCTP TO:akan mengembalikan 5.1.1 DSNpesan kesalahan yang mengatakan itu penuh. Artinya akun tersebut benar-benar ada!

Penyingkapan

Saya menjalankan Reacher , API verifikasi email waktu nyata. Kode saya ditulis dalam Rust, dan 100% open-source. Lihat jika Anda menginginkan solusi yang lebih kuat:

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

Dengan kombinasi berbagai teknik untuk melewati rintangan, saya berhasil memverifikasi sekitar 80% email yang diperiksa pelanggan saya.

amaurymartiny
sumber
-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";

?>
pengguna4314333
sumber
Pengguna meminta solusi .Net bukan php.