Apa kode paling elegan untuk memvalidasi bahwa string adalah alamat email yang valid?
c#
email
email-validation
leora
sumber
sumber
Jawaban:
Bagaimana dengan ini?
Untuk memperjelas, pertanyaannya adalah menanyakan apakah string tertentu merupakan representasi yang valid dari alamat email, bukan apakah alamat email adalah tujuan yang valid untuk mengirim pesan. Untuk itu, satu-satunya cara nyata adalah mengirim pesan untuk mengonfirmasi.
Perhatikan bahwa alamat email lebih mudah memaafkan daripada yang mungkin Anda bayangkan sebelumnya. Ini semua adalah formulir yang benar-benar valid:
Untuk sebagian besar kasus penggunaan, "palsu" palsu jauh lebih buruk bagi pengguna Anda dan pembuktian di masa depan daripada "valid" palsu. Inilah artikel yang dulunya adalah jawaban yang diterima untuk pertanyaan ini (jawaban itu telah dihapus). Ini memiliki lebih banyak detail dan beberapa ide lain tentang cara mengatasi masalah.
Memberikan pemeriksaan kewarasan masih merupakan ide bagus untuk pengalaman pengguna. Anggap alamat email itu valid, Anda bisa mencari domain tingkat atas yang diketahui, memeriksa domain untuk data MX, memeriksa kesalahan pengejaan dari nama domain umum (gmail.cmo), dll. Lalu berikan peringatan yang memberi pengguna kesempatan untuk mengatakan "ya, server email saya benar-benar mengizinkan 🌮🍳🎁 sebagai alamat email."
Adapun untuk menggunakan penanganan pengecualian untuk logika bisnis, saya setuju bahwa itu adalah hal yang harus dihindari. Tetapi ini adalah salah satu kasus di mana kenyamanan dan kejelasan mungkin melebihi dogma.
Selain itu, jika Anda melakukan hal lain dengan alamat email, itu mungkin akan melibatkan mengubahnya menjadi MailAddress. Bahkan jika Anda tidak menggunakan fungsi persis ini, Anda mungkin ingin menggunakan pola yang sama. Anda juga dapat memeriksa jenis kegagalan tertentu dengan menangkap pengecualian berbeda : format null, kosong, atau tidak valid.
Per komentar Stuart, ini membandingkan alamat akhir dengan string asli alih-alih selalu kembali benar. MailAddress mencoba mengurai string dengan spasi ke bagian "Nama Tampilan" dan "Alamat", sehingga versi asli mengembalikan positif palsu.
--- Bacaan lebih lanjut ---
Dokumentasi untuk System.Net.Mail.MailAddress
Penjelasan tentang apa yang membuat alamat email yang valid
sumber
System.Net.Mail
kelas - kelas untuk mengirim email, yang mungkin Anda lakukan jika Anda menggunakan .NET. Kami membuat keputusan untuk menggunakan jenis validasi ini hanya karena tidak ada gunanya kami menerima alamat email - bahkan yang valid - yang tidak dapat kami kirimi surat.IsValidEmail("this is not valid@email$com");
Ini adalah pertanyaan lama, tetapi semua jawaban yang saya temukan di SO, termasuk yang lebih baru, dijawab sama dengan yang ini. Namun, di .Net 4.5 / MVC 4 Anda dapat menambahkan validasi alamat email ke formulir dengan menambahkan anotasi [EmailAddress] dari System.ComponentModel.DataAnnotations, jadi saya bertanya-tanya mengapa saya tidak bisa hanya menggunakan fungsi bawaan dari. Bersih secara umum.
Ini sepertinya berhasil, dan menurut saya cukup elegan:
sumber
EmailAddressAttribute
kurang permisif daripadaSystem.Net.Mail.MailAddress
- misalnya,MailAddress
menerima alamat untuk TLD. Hanya sesuatu yang perlu diingat jika Anda harus seizin mungkin.foo.IsValid(null);
kembalitrue
.Saya menggunakan metode single liner ini yang berfungsi untuk saya
Per komentar, ini akan "gagal" jika
source
(alamat email) adalah nol.sumber
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
untuk string nol. Itu sebabnya saya mengusulkan (bahkan lebih baik lebih baik) ++ versi:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Sekarang saya akan pergi dan menemukan Gereja Reformed dari Bahkan Lebih Baik Versiis..net 4.5 menambahkan System.ComponentModel.DataAnnotations.EmailAddressAttribute
Anda dapat menelusuri sumber EmailAddressAttribute , ini adalah Regex yang digunakan secara internal:
sumber
RegexOptions.IgnoreCase
karena pola ini tidak mengizinkan huruf kapital secara eksplisit!Saya mengambil jawaban Phil dari # 1 dan menciptakan kelas ini. Sebut saja seperti ini:
bool isValid = Validator.EmailIsValid(emailString);
Ini kelasnya:
sumber
Secara pribadi, saya akan mengatakan bahwa Anda harus memastikan ada simbol @ di sana, dengan kemungkinan a. karakter. Ada banyak regex yang dapat Anda gunakan dengan kebenaran yang berbeda-beda, tetapi saya rasa sebagian besar dari ini mengabaikan alamat email yang valid, atau membiarkan yang tidak valid melaluinya. Jika orang ingin memasukkan alamat email palsu, mereka akan memasukkan alamat palsu. Jika Anda perlu memverifikasi bahwa alamat email itu sah, dan bahwa orang itu mengendalikan alamat email itu, maka Anda harus mengirimi mereka email dengan tautan kode khusus sehingga mereka dapat memverifikasi bahwa alamat itu memang alamat asli.
sumber
Saya pikir cara terbaik adalah sebagai berikut:
Anda dapat memiliki fungsi statis ini di kelas umum.
sumber
Kode pendek dan akurat
sumber
Cara paling elegan adalah menggunakan metode .Net.
Metode-metode ini:
Sudah dicoba dan diuji. Metode ini digunakan dalam proyek profesional saya sendiri.
Gunakan ekspresi reguler secara internal, yang dapat diandalkan dan cepat.
Dibuat oleh Microsoft untuk C #. Tidak perlu menemukan kembali roda.
Kembalikan hasil bool. Benar artinya email itu valid.
Untuk pengguna .Net 4.5 dan lebih tinggi
Tambahkan Referensi ini ke proyek Anda:
Sekarang Anda dapat menggunakan kode berikut:
Contoh penggunaan
Berikut adalah beberapa metode untuk menyatakan:
... dan kode menunjukkan mereka dalam aksi:
Selain itu, contoh ini:
;
.Alternatif, untuk pengguna versi .Net kurang dari 4,5
Untuk situasi di mana .Net 4.5 tidak tersedia, saya menggunakan solusi berikut:
Secara khusus, saya menggunakan:
sumber
EmailAddressAttribute
hampir empat bulan, meskipun yang satu ini benar-benar menangkapnull
masalah.Sejujurnya, dalam kode produksi, yang terbaik yang saya lakukan adalah memeriksa
@
simbol.Saya tidak pernah di tempat untuk sepenuhnya memvalidasi email. Anda tahu bagaimana saya melihat apakah itu benar-benar valid? Jika itu dikirim. Jika tidak, itu buruk, jika itu terjadi, hidup itu baik. Itu saja yang perlu saya ketahui.
sumber
Saya menemukan regex ini sebagai trade off yang baik antara memeriksa sesuatu lebih dari sekedar tanda @, dan menerima kasus tepi aneh:
Setidaknya itu akan membuat Anda menaruh sesuatu di sekitar tanda @, dan menempatkan setidaknya domain yang terlihat normal.
sumber
bob@companyinternal
?Validasi alamat email tidak semudah kelihatannya. Sebenarnya secara teori tidak mungkin untuk memvalidasi alamat email sepenuhnya hanya dengan menggunakan ekspresi reguler.
Lihat posting blog saya tentang hal ini untuk diskusi tentang subjek dan implementasi F # menggunakan FParsec. [/ shameless_plug]
sumber
Inilah jawaban saya - Solusi Phil gagal untuk domain satu huruf seperti "[email protected]". Percaya atau tidak, itu digunakan =) (pergi ke tautan abad, misalnya).
Jawaban Phil juga akan bekerja hanya dengan standar PCRE ... jadi C # akan menerimanya, tetapi javascript akan mengebom. Terlalu rumit untuk javascript. Jadi, Anda tidak dapat menggunakan solusi Phil untuk atribut validasi MVC.
Ini regex saya. Ini akan bekerja dengan baik dengan atribut validasi MVC.
- Segala sesuatu sebelum @ disederhanakan, sehingga setidaknya javascript akan berfungsi. Saya validasi santai di sini selama server exchange tidak memberi saya 5.1.3. - Semuanya setelah @ adalah solusi Phil yang dimodifikasi untuk domain huruf tunggal.
Bagi orang yang menyarankan menggunakan system.net.mail MailMessage (), hal itu adalah CARA untuk fleksibel. Tentu, C # akan menerima email, tetapi kemudian server pertukaran akan mengebom dengan kesalahan runtime 5.1.3 segera setelah Anda mencoba mengirim email.
sumber
basket@ball
sebagai alamat email yang valid telah mendapatkan jawaban yang benar serta semua upvotes itu. Bagaimanapun, terima kasih!Jika Anda benar-benar dan maksud saya benar-benar ingin tahu apakah alamat email itu valid ... minta penukar email untuk membuktikannya, tidak perlu regex. Saya dapat memberikan kode jika diminta.
Langkah-langkah umum adalah sebagai berikut: 1. apakah alamat email memiliki bagian nama domain? (indeks @> 0) 2. menggunakan kueri DNS, tanyakan apakah domain memiliki penukar mail 3. buka koneksi tcp ke mail exchanger 4. menggunakan protokol smtp, buka pesan ke server menggunakan alamat email sebagai penerima 5. parsing respons server. 6. keluar dari pesan jika Anda sampai sejauh ini, semuanya baik-baik saja.
Ini seperti yang dapat Anda bayangkan, waktu yang sangat mahal dan bergantung pada smtp, tetapi berhasil.
sumber
Secara umum, ekspresi reguler untuk memvalidasi alamat email bukanlah hal yang mudah untuk dibuat; pada saat penulisan ini, sintaksis alamat email harus mengikuti standar yang relatif tinggi dan menerapkan semuanya dalam ekspresi reguler secara praktis tidak mungkin!
Saya sangat menyarankan Anda untuk mencoba EmailVerify.NET kami , perpustakaan .NET dewasa yang dapat memvalidasi alamat email mengikuti semua standar IETF saat ini (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 dan RFC 5322) , menguji catatan DNS terkait, memeriksa apakah kotak surat target dapat menerima pesan dan bahkan dapat mengetahui apakah alamat yang diberikan dapat dibuang atau tidak.
Penafian: Saya adalah pengembang utama untuk komponen ini.
sumber
sumber
Jika Anda menggunakan FluentValidation, Anda dapat menulis sesuatu yang sederhana seperti ini:
sumber
sedikit modifikasi untuk jawaban @Cogwheel
sumber
Console.WriteLine(MailAddress("asdf@asdf.").Address);
menghasilkan "asdf @ asdf.", Yang tidak valid.Ada banyak jawaban kuat di sini. Namun, saya menyarankan agar kita mengambil langkah mundur. @Cogwheel menjawab pertanyaan https://stackoverflow.com/a/1374644/388267 . Namun demikian, ini bisa mahal dalam skenario validasi massal, jika banyak alamat email yang divalidasi tidak valid. Saya menyarankan agar kita menggunakan sedikit logika sebelum kita masuk ke blok try-catch-nya. Saya tahu bahwa kode berikut dapat ditulis menggunakan RegEx tetapi itu bisa mahal bagi pengembang baru untuk mengerti. Ini adalah nilai twopence saya:
sumber
Jawaban yang paling banyak dipilih dari @Cogwheel adalah jawaban terbaik namun saya telah mencoba menerapkan
trim()
metode string sehingga akan memangkas semua ruang putih pengguna dari string mulai dari awal hingga akhir. Periksa kode di bawah untuk contoh lengkap-sumber
SanitizeEmail(string email)
, menggunakan hasil dari metode itu untuk memvalidasi dan mengirim email ke.sumber
Periksa string email adalah format yang benar atau format yang salah oleh
System.Text.RegularExpressions
:sumber
/ Menggunakan Internal Regex yang digunakan dalam membuat "EmailAddressAttribute ();" baru komponen dalam .Net4.5 >>> menggunakan System.ComponentModel.DataAnnotations; // Untuk Memvalidasi Alamat Email ...... Diuji dan Bekerja.
Anda juga dapat menggunakan ini:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
sumber
Saya ringkas jawaban Poyson 1 seperti:
sumber
Cara sederhana untuk mengidentifikasi emailid itu valid atau tidak.
sumber
Ada masalah budaya dalam regex di C # daripada js. Jadi kita perlu menggunakan regex dalam mode AS untuk memeriksa email. Jika Anda tidak menggunakan mode ECMAScript, karakter khusus bahasa Anda tersirat dalam AZ dengan regex.
sumber
Saya akhirnya menggunakan regex ini, karena berhasil memvalidasi koma, komentar, karakter Unicode, dan alamat domain IP (v4).
Alamat yang valid adalah:
sumber
Yang sederhana tanpa menggunakan Regex (yang saya tidak suka karena keterbacaannya yang buruk):
Contoh:
IsValidEmail("@b.com") // false
IsValidEmail("[email protected]") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a [email protected]") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
Ini dimaksudkan untuk menjadi sederhana dan karena itu tidak berurusan dengan kasus-kasus langka seperti email dengan domain yang diberi tanda kurung yang berisi spasi (biasanya diizinkan), email dengan alamat IPv6, dll.
sumber
Ini jawaban untuk pertanyaan Anda.
sumber
Berdasarkan jawaban dari @Cogwheel saya ingin membagikan solusi yang dimodifikasi yang berfungsi untuk SSIS dan "Script Component":
Tempatkan kode ini di metode yang benar:
Kemudian Anda dapat menggunakan Split Bersyarat untuk memfilter semua catatan yang tidak valid atau apa pun yang ingin Anda lakukan.
sumber