Empat pertanyaan yang berbagi satu kata
“Apakah ini alamat email yang valid?” bukan satu pertanyaan. Ini empat pertanyaan, tingkat kesulitannya makin naik, dan yang terakhir satu-satunya yang sebenarnya ingin dijawab semua orang — itulah sebabnya begitu banyak kode validasi yang rumit soal yang pertama dan diam soal sisanya.
Berikut keempatnya, dalam urutan sebuah formulir pendaftaran menemuinya.
- Apakah bentuknya seperti sebuah alamat?
- Sebuah pemeriksaan sintaks. Ia berjalan di browser, tidak berbiaya apa pun, dan menangkap koma yang salah ketik serta
@yang hilang. Ini satu-satunya lapisan yang jujur bisa menolak sesuatu dengan sendirinya — dan bahkan begitu, ia seharusnya menolak jauh lebih sedikit daripada kebanyakan pola. - Bisakah domain itu menerima surat sama sekali?
- Sebuah pemeriksaan DNS. Satu query mengatakan apakah ada apa pun, di mana pun, yang bersedia menerima surat untuk bagian setelah
@. Ia menangkap nama domain dengan satu huruf hilang dan domain yang sudah kedaluwarsa tahun lalu, dan ia sama sekali tidak bisa memberi tahu apa pun soal kotak suratnya. - Apakah kotak surat itu ada?
- Sebuah pemeriksaan SMTP — dan yang paling lama dibahas panduan ini soal mengapa Anda tidak boleh mempercayainya. Anda bisa bertanya. Jawabannya sering kali sebuah ya yang sopan dari sebuah server yang menerima nama apa pun, atau sebuah kegagalan sementara yang disengaja, atau sebuah penerimaan yang diikuti sebuah bounce beberapa menit kemudian.
- Apakah itu alamat mereka?
- Tidak ada apa pun di sisi teknis yang bisa menjawab ini. Sebuah alamat bisa sempurna, bisa dikirimi surat, dan milik orang lain — salah ketik satu digit, atau diketik dengan sengaja supaya lolos dari Anda. Cuma sebuah pesan yang tiba dan dipakai yang menutup pertanyaan ini.
Tiga yang pertama murah dan cuma membuktikan sedikit. Yang keempat satu-satunya yang pantas menyandang namanya, dan itulah yang berbiaya sebuah pesan. Semua yang ada di bawah ini soal memakai yang tiga murah itu dengan baik supaya yang mahal tidak terbuang percuma.
Lapisan satu: pola, dan empat hal yang tidak bisa diketahuinya
Tidak ada ekspresi reguler resmi untuk sebuah alamat email, dan memang tidak bisa ada. RFC 5322 mendefinisikan sebuah gramatika, bukan sebuah pola, dan gramatika itu mengizinkan komentar dalam tanda kurung, spasi yang terlipat, dan string bertanda kutip yang bisa berisi hampir semua karakter — tidak satu pun dari itu yang seharusnya diterima formulir pendaftaran sungguhan, dan semuanya harus diterima sebuah pola yang setia pada standar.
Yang memang ada adalah sebuah definisi yang sengaja dibuat lebih sempit dan sudah diterapkan browser: yang diberikan spesifikasi HTML untuk sebuah field <input type="email">. Ini sebuah kompromi yang disengaja, bukan sebuah transkripsi dari standarnya, ini yang sudah dipegang formulir Anda bahkan sebelum satu baris kode Anda berjalan, dan ini cukup pendek untuk dibaca sekali baca:
/^[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])?)*$/Pakai itu, atau pakai yang sudah dibawa platform Anda. Keempat yang di bawah ini adalah lapisan yang sama, dan memilih salah satunya adalah keputusan yang lebih kecil daripada apa yang Anda lakukan sesudahnya:
| Di mana Anda berada | Pemeriksaan yang sudah Anda punya | Yang dilakukannya, mungkin di luar dugaan Anda |
|---|---|---|
| Di browser, tanpa kode sama sekali | <input type="email" required> | Menerapkan pola di atas sebelum JavaScript Anda sempat melihat field itu, dan menampilkan pesannya dalam bahasa pengunjung sendiri. |
| Di PHP, tanpa apa pun yang perlu dipasang | filter_var($a, FILTER_VALIDATE_EMAIL) | Lebih ketat daripada yang HTML: ia mengharuskan sebuah titik di domainnya, jadi ia menolak alamat yang cuma akan berfungsi di dalam satu mesin saja. |
| Di Python, dengan satu package kecil | email_validator.validate_email(a) | Melakukan pemeriksaan sintaks dan, kalau Anda izinkan, pencarian domain dari lapisan dua — dua lapisan murah di balik satu pemanggilan fungsi. |
| Di Java atau Kotlin, lewat bean validation | @Email | Sangat longgar dengan sengaja. Ini sebuah anotasi yang dimaksudkan untuk menangkap yang jelas-jelas salah, dan ia dengan senang hati akan menerima sebuah domain yang belum pernah ada. |
Apa pun yang Anda pakai, yang penting adalah apa yang tidak dikatakannya. Sebuah pola yang mengembalikan true sudah memberi tahu Anda satu hal dan empat bukan-hal.
- Bukan bahwa domainnya ada
- Sebuah alamat pada domain yang belum pernah didaftarkan siapa pun lolos dari setiap pola di bagian ini. Tidak ada apa pun yang dicari dan tidak ada apa pun yang dihubungi; tidak ada ekspresi reguler yang pernah membuat sebuah permintaan jaringan.
- Bukan bahwa kotak suratnya ada
- Bahkan pada domain yang sungguhan, polanya tidak punya pendapat soal bagian sebelum
@. Bagian itu cuma milik server penerima, dan itu justru hal yang tidak akan pernah diberitahukan DNS kepada Anda. - Bukan bahwa alamatnya bisa dikirimi surat
- Sebuah domain bisa punya record yang sempurna dan sebuah server surat yang sudah dimatikan selama sebulan. Sintaks adalah sifat sebuah string; keterkiriman adalah sifat dunia pada saat Anda menekan kirim.
- Bukan bahwa itu milik orang yang mengetiknya
- Alamat buruk paling umum di database mana pun adalah alamat yang sungguhan dan bisa dikirimi surat, milik seseorang yang tidak pernah mendaftar — karena satu huruf salah ketik, atau karena formulirnya diisi dengan sebuah kebohongan yang terlihat masuk akal.
Apa yang legal, dan apa yang salah dibuang
Kebanyakan bug validasi bukan alamat buruk yang berhasil masuk. Itu adalah orang-orang yang tidak bisa mendaftar, dan mereka tidak pernah muncul di log yang dibaca siapa pun — formulirnya bilang tidak, dan mereka pergi ke tempat lain. Keenam hal ini yang paling sering melakukannya.
| Yang ditolak formulir | Apakah itu legal? | Apa sebenarnya itu |
|---|---|---|
Sebuah tanda plus, seperti pada name+shop@example.com | Legal, dan dipakai secara luas | Pengalamatan plus: satu kotak surat, dengan sebuah label yang dipilih pemiliknya supaya ia bisa melihat siapa yang membocorkannya. Menolaknya memberi tahu pengunjung yang teliti persis jenis formulir apa ini. |
Sebuah apostrof, seperti pada o'brien@example.com | Legal, dan nama belakang seseorang | Salah satu dari selusin tanda baca yang diizinkan bagian lokal. Kalau sebuah formulir menolaknya, alasannya nyaris tidak pernah alamatnya — itu sebuah bug escaping di suatu tempat lebih jauh ke bawah yang tidak ada yang mau menemukannya. |
Sebuah akhiran yang belum pernah didengar siapa pun, seperti .dev atau .photography | Legal, dan jumlahnya sudah jauh di atas seribu | Sebuah pola dengan daftar akhiran yang ditulis langsung ke dalamnya sudah usang sejak hari ia ditulis, dan itu makin buruk setiap tahun tanpa disadari siapa pun. |
| Sebuah domain tanpa titik di dalamnya | Legal, dan tidak berguna bagi Anda | Sebuah alamat seperti root@localhost valid di dalam satu mesin dan tidak bermakna apa-apa di sebuah formulir publik. Inilah satu-satunya kasus ketika pemeriksa platform yang ketat benar untuk menolaknya. |
Huruf non-Latin, seperti pada 用户@例子.广告 | Legal, dengan sebuah catatan | Alamat yang sudah diinternasionalisasi itu ada dan perlahan menyebar. Apakah mail stack Anda sendiri bisa mengirim ke salah satunya adalah pertanyaan yang terpisah — tapi sebuah field yang menolak menerima karakternya sudah menjawab itu untuk semua orang, secara permanen. |
Huruf kapital sebelum @ | Legal, dan bukan hak Anda untuk mengubahnya | Standarnya menyerahkan huruf besar-kecil bagian lokal kepada server penerima. Nyaris setiap server mengabaikannya; yang tidak mengabaikannya adalah yang tidak akan pernah Anda dengar kabarnya. |
Dan tiga angka, yang layak ditulis langsung ke dalam kode Anda karena tidak pernah berubah:
- 64 karakter
- Jumlah maksimum bagian sebelum
@. Apa pun yang lebih panjang bukan alamat yang panjang, itu bukan alamat. - 255 karakter
- Jumlah maksimum domainnya, termasuk titik-titiknya. Belum pernah ada yang sah mendekati angka ini, dan batas ini ada terutama supaya Anda punya satu batas untuk dipakai.
- 254 karakter
- Jumlah maksimum seluruh alamat saat dibawa sebuah server — yang lebih kecil daripada jumlah dua angka di atas kalau dijumlahkan. Inilah angka yang harus dipakai di kolom database dan di
maxlengthfield-nya.
Lapisan dua: satu pencarian, dan apa yang dipastikannya
Bagian setelah @ adalah sebuah domain, dan sebuah domain entah punya tempat untuk menaruh surat atau tidak. Satu query DNS menjawab itu dalam beberapa milidetik, dan itulah pemeriksaan bernilai paling tinggi di seluruh panduan ini — karena kesalahan yang ditangkapnya, sebuah nama domain yang diketik sedikit salah, dengan jarak yang jauh adalah kegagalan sungguhan paling umum yang ada.
$ dig +short MX example.comSebuah jawaban berarti sebuah host sudah disebutkan namanya. Tidak ada jawaban bukan berarti tidak ada surat: sebuah domain tanpa record MX tapi punya record A tetap menerima, karena pengirim jatuh ke situ sebagai cadangan. Ada empat kemungkinan hasil, dan cuma dua yang merupakan kegagalan.
| Apa yang dikembalikan pencarian | Bisakah ia menerima? | Apa yang harus dilakukan formulir |
|---|---|---|
| Satu atau lebih record MX | Ya | Terima. Ini mayoritas besar dari semua alamat, dan tidak ada lagi yang layak dilakukan sebelum Anda mengirim. |
Tidak ada MX, tapi ada record A atau AAAA | Ya, lewat cadangan | Terima. Ini tidak umum tapi sepenuhnya legal, dan pengirim akan tetap mengantarkan surat ke sana. Menolaknya mengubah sebuah alamat yang berfungsi menjadi seorang pelanggan yang hilang. |
Sebuah record tunggal yang seluruh nilainya 0 . | Tidak, dan memang disengaja | Tolak, dan katakan alasannya. Itu adalah null MX: pemilik domainnya sudah mempublikasikan, dengan satu-satunya cara untuk mempublikasikannya, bahwa tidak ada apa pun di sini yang menerima surat. |
| Domainnya sama sekali tidak me-resolve | Tidak | Tolak, dan tawarkan yang paling mendekati. NXDOMAIN pada sebuah nama yang baru diketik manusia tiga puluh detik lalu nyaris selalu cuma satu huruf yang salah. |
Tempat pemeriksaan ini biasanya salah bukan pada pencariannya. Melainkan pada di mana pencarian itu diletakkan — di jalur kritis, per ketukan tombol, dengan sebuah kegagalan yang memblokir submit-nya. Enam aturan menjaganya tetap berguna:
- Jalankan saat field-nya sudah selesai diisi, bukan selagi sedang diketik. Satu query saat fokusnya pindah, atau satu saat submit. Satu query per ketukan tombol ya tetap satu query per ketukan tombol.
- Ubah domainnya ke huruf kecil dulu. DNS tidak peduli tapi cache Anda peduli: dua ejaan dari domain yang sama adalah satu query, bukan dua.
- Minta MX, dan jatuh ke
Asebagai cadangan. Dua query, dan cuma yang kedua yang bersyarat. Sebuah library yang cuma memeriksa MX saja akan menolak domain yang sebenarnya berfungsi. - Simpan jawabannya di cache selama beberapa menit. Segelintir domain menyumbang kebanyakan pendaftaran di mana pun, jadi kebanyakan pencarian berubah menjadi tanpa pencarian sama sekali.
- Kalau ragu, terima. Kalau resolvernya time out, terima saja alamatnya. Semenit buruk di penyedia DNS Anda tidak boleh pernah berubah menjadi formulir yang menolak semua orang.
- Sarankan sebuah koreksi; jangan pernah menerapkannya sendiri. Kalau domainnya cuma satu huruf beda dari yang umum, tawarkan koreksinya sebagai sesuatu yang bisa diklik. Diam-diam menulis ulang apa yang diketik seseorang adalah cara sebuah tautan konfirmasi berakhir ke orang asing.
Pencarian ini punya satu biaya yang layak diketahui: inilah saat pertama formulir Anda berbicara ke dunia luar soal sesuatu yang diketik pengunjung. Kalau itu penting, alternatifnya adalah melewati lapisan ini sepenuhnya dan biarkan pesannya sendiri yang menjadi keseluruhan pemeriksaan.
Lapisan tiga: bertanya ke server, dan mengapa jawabannya bukan jawaban
Ada sebuah cara untuk bertanya ke sebuah server surat apakah ia akan menerima sebuah alamat tertentu tanpa mengirim apa pun kepadanya. Buka percakapannya, sebutkan nama pengirim, sebutkan nama penerima, baca balasan untuk satu perintah itu, lalu tutup sebelum pesannya:
220 mx1.example.com ESMTP ready
EHLO checker.example.net
250 mx1.example.com
MAIL FROM:<probe@example.net>
250 2.1.0 Ok
RCPT TO:<someone@example.com>
250 2.1.5 Ok
QUIT
221 2.0.0 Bye250 setelah RCPT TO itulah yang pada akhirnya dijual setiap layanan verifikasi alamat di dunia ini. Ada gunanya bersikap tepat soal betapa kecil nilainya itu.
- Sebuah domain catch-all menjawab ya untuk segalanya
- Sebuah domain yang dikonfigurasi untuk menerima nama apa pun — yang persis dilakukan layanan ini, dan yang dilakukan sangat banyak domain perusahaan — membalas
250untuk sebuah alamat yang belum pernah dipakai siapa pun. Jawabannya benar, dan itu bukan informasi. - Sebuah server yang berhati-hati sengaja menjawab
450 - Greylisting menolak percobaan pertama dari sebuah pengirim yang tidak dikenal dan memintanya kembali lagi sebentar lagi. Pengirim sungguhan akan kembali; sebuah penguji tidak akan pernah kembali. Kegagalan sementara itu adalah sebuah bukan-jawaban yang disengaja, dan membacanya sebagai “tidak ada kotak surat seperti itu” persis kesalahan yang memang dirancang untuk dihasilkannya.
- Sebagian server menerima dulu dan menolak belakangan
- Penyedia besar rutin mengambil pesannya selama percakapan dan memutuskan soal itu belakangan, yang mengubah sebuah penolakan menjadi sebuah bounce yang tiba beberapa menit setelah pengujian Anda kembali dengan hasil bersih.
- Sebagian server menjawab tidak kepada semua orang yang tidak mereka kenali
- Sebuah server yang sudah memutuskan alamat Anda adalah orang asing bisa menolak penerimanya karena alasan yang sama sekali tidak berhubungan dengan si penerima. Yang Anda ukur adalah reputasi Anda sendiri, bukan kotak surat mereka.
- Dan itu menghabiskan reputasi yang sedang Anda lindungi
- Sebuah koneksi yang menyebutkan nama-nama penerima dan tidak pernah mengirim apa pun persis berbentuk sebuah directory harvest, karena memang itulah wujudnya. Melakukannya dalam jumlah besar dari alamat Anda sendiri adalah jalan tercepat menuju sebuah blocklist — dan sebuah pengirim yang masuk blocklist adalah pengirim yang pesan-pesan aslinya berhenti sampai.
Ada satu kasus sempit ketika pengujian ini sungguh-sungguh berguna: satu alamat saja, diperiksa dengan tangan, pada sebuah domain yang Anda jalankan sendiri atau punya izin untuk diutak-atik. Sebagai sebuah langkah di dalam formulir pendaftaran, ini lambat, sering salah, dan kadang-kadang malah merugikan justru hal yang seharusnya dilindunginya.
Alamat peran, domain buangan, dan daftar yang akan Anda beli
Di antara pencarian domain dan pesan sungguhan itu ada sekeluarga pemeriksaan yang sama sekali bukan soal validitas. Itu soal apakah Anda menginginkan alamat ini, yang merupakan sebuah keputusan bisnis yang memakai kostum teknis — dan layak dipisahkan dari tiga lapisan di sekitarnya justru karena alasan itu.
- Alamat peran
- Nama-nama seperti
info@,support@danadmin@. Itu sungguhan, dan biasanya sebuah kotak surat bersama, bukan seseorang, yang membuatnya rumah yang buruk untuk apa pun yang di baliknya ada sebuah kata sandi. Layak ditandai. Jarang layak ditolak. - Domain sekali pakai
- Alamat seperti yang dibagikan situs ini, pada domain-domain yang memang ada supaya bisa dibuang. Memeriksa terhadap sebuah daftar publik domain-domain itu cukup wajar, selama Anda jujur bahwa setiap daftar semacam itu tidak lengkap dan sedikit usang pada hari Anda mengunduhnya.
- Alamat dari penyedia gratis
- Sebagian formulir bisnis menolak apa pun yang bukan domain perusahaan. Itu sebuah kebijakan, kadang itu kebijakan yang tepat, dan itu layak dituliskan sebagai sebuah kebijakan — sebuah kalimat yang bisa dibaca pengunjung — bukan disembunyikan di dalam sesuatu yang disebut validasi.
- Domain populer yang salah ketik tipis
- Nama sebuah penyedia yang terkenal dengan satu huruf salah. Yang ini berbeda dari tiga lainnya: ini bukan sebuah kebijakan, ini menangkap sebuah kesalahan sungguhan, dan orangnya selalu senang. Ini satu-satunya entri di sini yang layak dibangun.
Tiga yang pertama berbagi satu sifat yang membuatnya sulit dinilai: Anda bisa mengukur apa yang mereka loloskan dan Anda tidak bisa mengukur apa yang mereka korbankan.
Kami jelas punya kepentingan di sini, jadi berikut versi jujurnya. Kalau yang ada di balik formulir Anda adalah sebuah uji coba gratis dengan sesuatu yang mahal menyertainya, menolak domain buangan akan menghemat uang Anda dan Anda memang sebaiknya melakukannya. Kalau itu sebuah newsletter, sebuah unduhan, atau sebuah akun yang dibayar seseorang, Anda kebanyakan cuma membebani orang yang berhati-hati — dan orang yang berhati-hati itulah yang membaca apa yang Anda kirim.
Lapisan empat: pesan yang menjadi pemeriksaannya
Semua yang di atas mempersempit lapangan. Tidak satu pun darinya memastikan satu-satunya fakta yang penting — bahwa alamat ini sampai ke orang yang ada di depan Anda — dan cuma satu hal yang melakukannya: kirim sesuatu ke sana, dan lihat apakah itu dipakai.
Inilah putaran yang sudah dimiliki nyaris setiap pendaftaran dan diperlakukan sebagai formalitas belaka oleh separuhnya:
- Terima alamatnya lewat satu pemeriksaan yang longgar. Pola di browser, dan tidak ada apa pun lagi yang berdiri di antara pengunjung dan tombolnya.
- Buat akunnya dalam keadaan belum diverifikasi. Bukan sebuah penahanan pada formulirnya, bukan sebuah layar “pending”: orangnya sudah masuk, dan yang belum bisa dilakukannya cuma segelintir hal yang memang membutuhkan alamatnya.
- Kirim satu pesan berisi sebuah tautan atau kode sekali pakai. Satu saja, dengan masa berlaku, terikat pada akun dan alamat itu dan tidak ada yang lain.
- Biarkan tautannya menjadi buktinya. Sebuah klik, atau sebuah kode yang diketik kembali, adalah keseluruhan verifikasinya. Tidak ada apa pun lagi di panduan ini yang menghasilkan jawaban sekokoh itu.
- Beri mereka jalan kembali. Sebuah “kirim ulang” yang terlihat jelas, dan sebuah cara untuk mengubah alamatnya tanpa kehilangan akunnya — karena alasan paling umum sebuah tautan tidak pernah diklik adalah sebuah salah ketik yang akhirnya kini bisa dilihat orangnya sendiri.
- Kedaluwarsakan yang tidak pernah dikonfirmasi siapa pun. Sebuah pembersihan diam-diam setelah jangka waktu tertentu mencegah salah ketik dan alamat buangan menumpuk menjadi sebuah daftar yang tidak dipercaya siapa pun.
Itu menciptakan sebuah masalah praktis, dan itulah alasan situs ini ada. Putaran itu kini jalur paling penting di dalam produknya, dan mengujinya berarti menerima surat sungguhan di sebuah alamat yang Anda kendalikan — berulang-ulang, di dalam sebuah pipeline, tanpa seorang manusia pun yang membuka sebuah kotak masuk.
Sebuah alamat pada salah satu domain publik tidak butuh pendaftaran dan tidak butuh kunci, dan apa pun yang tiba di sana bisa dibaca lewat HTTP sedetik kemudian:
$ curl -sG https://grabmail.io/api/v1/mailbox \
--data-urlencode "address=signup-42@grabmail.io"Dari situ, seluruh alur verifikasi bisa dijalankan dari ujung ke ujung oleh sebuah test suite, atau sebuah domain milik Anda sendiri bisa diarahkan ke sini supaya setiap run mendapat sebuah alamat yang belum pernah ada sebelumnya. Pesan disimpan selama 5 hari lalu dihapus, yang merupakan masa hidup yang tepat untuk sebuah test fixture dan yang salah untuk sebuah kotak surat.
Apa yang sebenarnya harus dipasang di formulir
Diringkas, dalam urutan kode itu berjalan:
- Trim, dan cuma trim. Spasi di salah satu ujungnya adalah bekas copy-paste dan tidak pernah disengaja. Tidak ada lagi apa pun soal string itu yang boleh Anda ubah.
- Cocokkan dengan satu pola yang longgar. Milik browser, atau milik platform Anda. Tolak
@yang hilang dan koma yang salah ketik, dan jangan tolak apa pun yang lain. - Batasi panjangnya sampai 254. Satu angka, di kolom database dan di field-nya, dan satu kelas input penuh yang bisa berhenti Anda pikirkan.
- Cari domainnya, di luar jalur kritis, dan tetap terima kalau gagal. MX lalu
A, disimpan di cache, dan tidak pernah menjadi alasan untuk memblokir sebuah submit yang sebenarnya akan berhasil. - Tawarkan sebuah koreksi; jangan buat sendiri. Satu huruf beda dari domain yang umum adalah sebuah pertanyaan untuk ditanyakan, bukan sebuah temuan untuk ditindaklanjuti.
- Kirim pesannya. Itulah validasinya. Semua yang di atasnya cuma triase.
- Katakan apa yang salah, dengan kata-kata. Inilah bagian yang menentukan apakah ada yang benar-benar menyelesaikannya:
| Apa yang terjadi | Apa yang biasanya dikatakan formulir | Apa yang seharusnya dikatakan |
|---|---|---|
String-nya tidak punya @ di dalamnya | “Masukkan alamat email yang valid” | “Sebuah alamat email butuh tanda @ — maksud Anda name@example.com?” |
| Domainnya tidak me-resolve | “Masukkan alamat email yang valid” | “Kami tidak bisa menemukan domain itu. Apakah ejaannya sudah benar?” |
| Domainnya cuma satu huruf beda dari yang umum | Tidak ada apa-apa sama sekali; formulirnya submit begitu saja | “Maksud Anda … ?”, dengan alamat yang sudah dikoreksi sebagai sebuah tombol untuk ditekan |
| Itu ada di sebuah blocklist yang Anda pilih untuk dipakai | “Masukkan alamat email yang valid” | “Untuk ini kami butuh sebuah alamat yang masih bisa Anda baca bulan depan.” |
| Pesannya sudah terkirim dan tidak pernah dikonfirmasi | Tidak ada apa-apa sama sekali; akunnya cuma diam di sana | “Kami sudah mengirim sebuah tautan ke alamat itu. Belum tiba? Kirim ulang, atau ubah alamatnya.” |
Perhatikan berapa banyak baris yang mengatakan hal salah yang sama. “Masukkan alamat email yang valid” adalah default di mana-mana karena itu benar untuk setiap kasus dan berguna untuk tidak satu pun darinya: di tiga dari lima baris alamatnya memang valid, dan orang yang mengetiknya tidak punya cara untuk mengetahui ia ada di baris yang mana.
Versi singkatnya
- Trim string-nya. Jangan ubah apa pun lagi soal itu.
- Cocokkan dengan satu pola yang longgar — milik browser atau milik platform Anda — dan berhenti di situ. Jangan tulis pola sendiri.
- Tolak apa pun di atas 254 karakter, dan simpan sebuah kolom seukuran itu.
- Cari MX untuk domainnya, jatuh ke
Asebagai cadangan, simpan di cache, lakukan di luar jalur kritis, dan terima alamatnya kalau pencariannya gagal. - Tolak sebuah domain yang tidak me-resolve dan sebuah domain yang mempublikasikan null MX. Terima apa pun yang lain yang diberikan DNS kepada Anda.
- Tawarkan sebuah saran ejaan kalau domainnya salah ketik tipis. Jangan pernah menerapkannya sendiri.
- Putuskan secara terpisah, dan secara tertulis, apakah Anda memblokir alamat buangan atau alamat peran — dan mengapa.
- Kirim sebuah pesan dengan tautan sekali pakai, perlakukan kliknya sebagai verifikasi, dan permudah mengirim ulang serta mengoreksi alamatnya.
- Uji putaran itu terhadap sebuah kotak masuk sungguhan, termasuk jalur-jalur ketika itu gagal, dan hapus akun yang belum dikonfirmasi sesuai jadwal.
Sembilan baris, dan cuma dua yang terakhir yang benar-benar memastikan sesuatu. Tujuh lainnya ada supaya pesan di ujung semua itu layak dikirim.
Pertanyaan
Apakah ada ekspresi reguler resmi untuk alamat email?
Tidak, dan memang tidak bisa ada. RFC 5322 memberikan sebuah gramatika, bukan sebuah pola, dan sebuah pola yang setia padanya akan menerima spasi dalam tanda kutip dan komentar dalam tanda kurung yang tidak pernah diterbitkan penyedia mana pun. Pakai yang didefinisikan spesifikasi HTML untuk sebuah field email, atau pemeriksa apa pun yang sudah dibawa platform Anda, dan pakai usaha yang Anda hemat itu untuk pesan konfirmasinya.
Bisakah saya memeriksa apakah sebuah alamat email ada tanpa mengirim apa pun?
Anda bisa bertanya; Anda tidak bisa tahu. Sebuah domain catch-all menerima nama apa pun, greylisting menjawab dengan sebuah kegagalan sementara yang disengaja, penyedia besar menerima selama percakapan dan bounce belakangan, dan sebuah server yang tidak mengenali Anda mungkin menolak karena alasan soal Anda, bukan soal penerimanya. Pengujian massal juga menaruh alamat pengirim Anda ke dalam blocklist.
Apakah name+tag@example.com alamat yang valid?
Ya. Tanda plus adalah karakter biasa yang diizinkan di bagian lokal, dan di sebagian besar penyedia besar ia juga diarahkan ke kotak surat sebelum tanda itu, yang membuat pengalamatan plus berguna. Sebuah formulir yang menolaknya sedang menolak alamat-alamat yang legal dan sekaligus mengiklankan sesuatu soal dirinya sendiri.
Apakah alamat email sensitif terhadap huruf besar-kecil?
Domainnya tidak pernah begitu. Bagian sebelum @, menurut standarnya, diserahkan kepada server penerima — dan dalam praktiknya setiap penyedia besar mengabaikan huruf besar-kecilnya. Simpan sebuah salinan yang sudah diubah ke huruf kecil untuk mendeteksi duplikat, dan kirim ke string persis seperti yang diketik.
Seberapa panjang sebuah alamat email boleh?
64 karakter sebelum @, 255 untuk domainnya, dan 254 untuk seluruh alamat saat dibawa sebuah server. Yang terakhir dari ketiga angka itulah yang harus dipakai: taruh di kolom database dan di field-nya, dan satu kelas input penuh berhenti menjadi masalah Anda.
Haruskah saya memblokir alamat email sekali pakai?
Kalau ada sesuatu yang mahal di balik sebuah uji coba gratis, ya — dan terimalah bahwa daftar apa pun yang Anda pakai tidak lengkap. Untuk sebuah newsletter, sebuah unduhan, atau sebuah akun yang dibayar, orang-orang yang Anda tolak kebanyakan adalah yang berhati-hati, dan Anda tidak akan pernah melihat mereka di sebuah log. Pertukaran lengkapnya layak dibaca sebelum memasang sebuah package yang membuat keputusan itu untuk Anda.
Bagaimana cara menguji sebuah alur verifikasi pendaftaran tanpa kotak surat sungguhan?
Kirim ke sebuah alamat pada domain sekali pakai publik dan baca kembali lewat API — tanpa pendaftaran, tanpa kunci, dan sebuah alamat baru untuk setiap run. Untuk sebuah suite yang butuh ratusan, arahkan sebuah domain milik Anda sendiri ke sebuah kotak masuk catch-all dan buat sendiri sebuah alamat per pengujian. Panduan lengkapnya ada di menguji sebuah alur verifikasi email dari ujung ke ujung.


