Apa yang Anda gunakan untuk memvalidasi alamat email pengguna, dan mengapa?
Saya telah menggunakan validates_email_veracity_of
yang sebenarnya menanyakan server MX. Tetapi itu penuh dengan kegagalan karena berbagai alasan, kebanyakan terkait dengan lalu lintas jaringan dan keandalan.
Saya melihat sekeliling dan saya tidak dapat menemukan sesuatu yang jelas bahwa banyak orang menggunakan untuk melakukan pemeriksaan kewarasan pada alamat email. Apakah ada plugin atau gem yang dipelihara dan cukup akurat untuk ini?
NB: Tolong jangan suruh saya mengirim email dengan link untuk melihat apakah email itu berfungsi. Saya sedang mengembangkan fitur "kirim ke teman", jadi ini tidak praktis.
ruby-on-rails
validation
email
Luke Francl
sumber
sumber
Jawaban:
Dengan Rails 3.0 Anda dapat menggunakan validasi email tanpa regexp menggunakan permata Mail .
Berikut adalah implementasi saya ( dikemas sebagai permata ).
sumber
###@domain.com
akan memvalidasi?Jangan membuat ini lebih sulit dari yang seharusnya. Fitur Anda tidak penting; validasi hanyalah langkah kewarasan dasar untuk menangkap kesalahan ketik. Saya akan melakukannya dengan regex sederhana, dan tidak menyia-nyiakan siklus CPU pada sesuatu yang terlalu rumit:
Itu diadaptasi dari http://www.regular-expressions.info/email.html - yang harus Anda baca jika Anda benar-benar ingin mengetahui semua pengorbanan. Jika Anda menginginkan regex yang lebih benar dan jauh lebih rumit yang sepenuhnya sesuai dengan RFC822, itu juga ada di halaman itu. Tapi masalahnya adalah ini: Anda tidak harus melakukannya dengan benar.
Jika alamat tersebut lolos validasi, Anda akan mengirim email. Jika email gagal, Anda akan mendapatkan pesan kesalahan. Pada tahap mana Anda dapat memberi tahu pengguna "Maaf, teman Anda tidak menerimanya, apakah Anda ingin mencoba lagi?" atau tandai untuk peninjauan manual, atau abaikan saja, atau apa pun.
Ini adalah opsi yang sama yang harus Anda tangani jika alamat tersebut lolos validasi. Karena meskipun validasi Anda sempurna dan Anda memperoleh bukti mutlak bahwa alamat tersebut ada, pengiriman masih bisa gagal.
Biaya positif palsu pada validasi rendah. Manfaat validasi yang lebih baik juga rendah. Validasi dengan murah hati, dan khawatirkan kesalahan saat terjadi.
sumber
Saya membuat permata untuk validasi email di Rails 3. Saya agak terkejut bahwa Rails tidak menyertakan sesuatu seperti ini secara default.
http://github.com/balexand/email_validator
sumber
if
atauunless
? Dokumentasi tampaknya jarang.Proyek ini tampaknya memiliki paling banyak pengamat di github saat ini (untuk validasi email di rel):
https://github.com/alexdunae/validates_email_format_of
sumber
Dari dokumen Rails 4 :
sumber
Di Rails 4 cukup tambahkan
validates :email, email:true
(dengan asumsi field Anda dipanggilemail
) ke model Anda dan kemudian tulis sederhana (atau kompleks †)EmailValidator
untuk menyesuaikan dengan kebutuhan Anda.misalnya: - model Anda:
Validator Anda (masuk
app/validators/email_validator.rb
)Ini akan mengizinkan semua jenis email yang valid, termasuk email yang diberi tag seperti "[email protected]" dan seterusnya.
Untuk mengujinya dengan
rspec
dispec/validators/email_validator_spec.rb
Begitulah cara saya melakukannya. YMMV
† Ekspresi reguler seperti kekerasan; jika tidak berfungsi, Anda tidak cukup menggunakannya.
sumber
Seperti yang disarankan Hallelujah, saya pikir menggunakan permata Mail adalah pendekatan yang baik. Namun, saya tidak menyukai beberapa rintangan di sana.
Saya menggunakan:
Anda bisa lebih tegas dengan menuntut agar TLD (domain tingkat atas) ada dalam daftar ini , namun Anda akan dipaksa untuk memperbarui daftar itu sebagai TLD baru yang muncul (seperti penambahan tahun 2012
.mobi
dan.tel
)Keuntungan dari mengaitkan parser langsung adalah bahwa aturan dalam tata bahasa Mail cukup lebar untuk bagian-bagian yang digunakan permata Mail, ia dirancang untuk memungkinkannya mengurai alamat seperti
user<[email protected]>
yang umum untuk SMTP. Dengan mengonsumsinya dariMail::Address
Anda dipaksa untuk melakukan banyak pemeriksaan tambahan.Catatan lain tentang permata Mail, meskipun kelasnya disebut RFC2822, tata bahasanya memiliki beberapa elemen RFC5322 , misalnya tes ini .
sumber
Di Rails 3 dimungkinkan untuk menulis validator yang dapat digunakan kembali , karena pos hebat ini menjelaskan:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
dan gunakan dengan
validates_with
:sumber
Memperhatikan jawaban lainnya, pertanyaannya masih tersisa - mengapa repot-repot menjadi pintar tentang itu?
Volume kasus edge sebenarnya yang mungkin ditolak atau dilewatkan oleh banyak regex tampaknya bermasalah.
Saya rasa pertanyaannya adalah 'apa yang saya coba capai?', Meskipun Anda 'memvalidasi' alamat email tersebut, Anda sebenarnya tidak memvalidasi bahwa itu adalah alamat email yang berfungsi.
Jika Anda menggunakan regexp, cukup periksa keberadaan @ di sisi klien.
Adapun skenario email yang salah, memiliki cabang 'pesan gagal mengirim' ke kode Anda.
sumber
Pada dasarnya ada 3 opsi paling umum:
Jika Anda tidak ingin menggunakan validates_email_veracity_of dan pembuatan token, saya akan menggunakan pemeriksaan regexp sekolah lama.
sumber
Permata Mail memiliki pengurai alamat bawaan.
sumber
Solusi ini didasarkan pada jawaban oleh @SFEley dan @Alessandro DS, dengan refactor, dan klarifikasi penggunaan.
Anda dapat menggunakan kelas validator ini dalam model Anda seperti:
Mengingat Anda memiliki yang berikut di
app/validators
folder Anda (Rails 3):sumber
Untuk Validasi Milis . (Saya menggunakan Rails 4.1.6)
Saya mendapatkan regexp saya dari sini . Tampaknya ini sangat lengkap, dan telah diuji terhadap banyak kombinasi. Anda dapat melihat hasilnya di halaman itu.
Saya sedikit mengubahnya menjadi Ruby regexp, dan memasukkannya ke file
lib/validators/email_list_validator.rb
Berikut kodenya:
Dan saya menggunakannya seperti ini dalam model:
Ini akan memvalidasi milis seperti ini, dengan pemisah dan sintaks yang berbeda:
Sebelum menggunakan regexp ini, saya menggunakan
Devise.email_regexp
, tapi itu regexp yang sangat sederhana dan tidak mendapatkan semua kasus yang saya butuhkan. Beberapa email terbentur.Saya mencoba regex lain dari web, tapi yang ini mendapatkan hasil terbaik sampai sekarang. Semoga membantu dalam kasus Anda.
sumber