Womit überprüfen Sie die E-Mail-Adressen der Benutzer und warum?
Ich hatte benutzt validates_email_veracity_of
die tatsächlich die MX-Server abfragt. Dies ist jedoch aus verschiedenen Gründen voller Fehler, hauptsächlich im Zusammenhang mit dem Netzwerkverkehr und der Zuverlässigkeit.
Ich habe mich umgesehen und konnte nichts Offensichtliches feststellen, mit dem viele Leute eine Überprüfung der Gesundheit einer E-Mail-Adresse durchführen. Gibt es dafür ein gepflegtes, einigermaßen genaues Plugin oder Juwel?
PS: Bitte sag mir nicht, ich soll eine E-Mail mit einem Link senden, um zu sehen, ob die E-Mail funktioniert. Ich entwickle eine Funktion "An einen Freund senden", daher ist dies nicht praktikabel.
ruby-on-rails
validation
email
Luke Francl
quelle
quelle
Antworten:
Mit Rails 3.0 können Sie eine E-Mail-Validierung ohne Regexp mithilfe des Mail- Gems verwenden .
Hier ist meine Implementierung ( als Juwel verpackt ).
quelle
###@domain.com
wird validieren?Mach das nicht schwieriger als es sein muss. Ihre Funktion ist nicht kritisch. Die Validierung ist nur ein grundlegender Schritt, um Tippfehler zu erkennen. Ich würde es mit einem einfachen regulären Ausdruck tun und die CPU-Zyklen nicht mit etwas zu Kompliziertem verschwenden:
Das wurde von http://www.regular-expressions.info/email.html angepasst - was Sie lesen sollten, wenn Sie wirklich alle Kompromisse kennen wollen. Wenn Sie einen korrekteren und viel komplizierteren, vollständig RFC822-kompatiblen regulären Ausdruck wünschen, finden Sie ihn auch auf dieser Seite. Aber die Sache ist folgende: Sie müssen es nicht ganz richtig machen.
Wenn die Adresse die Validierung besteht, senden Sie eine E-Mail. Wenn die E-Mail fehlschlägt, wird eine Fehlermeldung angezeigt. An welchem Punkt können Sie dem Benutzer mitteilen "Entschuldigung, Ihr Freund hat das nicht erhalten. Möchten Sie es erneut versuchen?" oder markieren Sie es zur manuellen Überprüfung oder ignorieren Sie es einfach oder was auch immer.
Dies sind die gleichen Optionen, mit denen Sie sich befassen müssten, wenn die Adresse dies Validierung bestanden hätte. Denn selbst wenn Ihre Validierung perfekt ist und Sie den absoluten Beweis dafür erhalten, dass die Adresse vorhanden ist, kann das Senden dennoch fehlschlagen.
Die Kosten für ein falsches Positiv bei der Validierung sind gering. Der Nutzen einer besseren Validierung ist ebenfalls gering. Validieren Sie großzügig und sorgen Sie sich um Fehler, wenn diese auftreten.
quelle
Ich habe in Rails 3 ein Juwel für die E-Mail-Validierung erstellt. Ich bin ein bisschen überrascht, dass Rails so etwas standardmäßig nicht enthält.
http://github.com/balexand/email_validator
quelle
if
oderunless
-Anweisung verwendet wird? Die Dokumentation scheint spärlich.Dieses Projekt scheint derzeit die meisten Beobachter auf Github zu haben (für die E-Mail-Validierung in Schienen):
https://github.com/alexdunae/validates_email_format_of
quelle
Aus den Rails 4-Dokumenten :
quelle
In Rails 4 fügen
validates :email, email:true
Sie einfach (vorausgesetzt, Ihr Feld wird aufgerufenemail
) zu Ihrem Modell hinzu und schreiben dann ein einfaches (oder komplexes †)EmailValidator
, das Ihren Anforderungen entspricht.zB: - Ihr Modell:
Ihr Validator (geht rein
app/validators/email_validator.rb
)Dies ermöglicht alle Arten von gültigen E-Mails, einschließlich getaggten E-Mails wie "[email protected]" und so weiter.
Um dies mit
rspec
in Ihrem zu testenspec/validators/email_validator_spec.rb
So habe ich es trotzdem gemacht. YMMV
† Reguläre Ausdrücke sind wie Gewalt; Wenn sie nicht funktionieren, verwenden Sie nicht genug davon.
quelle
Wie Halleluja vorschlägt, halte ich die Verwendung des Mail-Edelsteins für einen guten Ansatz. Allerdings mag ich einige der Reifen dort nicht.
Ich benutze:
Sie könnten strenger sein, wenn Sie verlangen, dass die TLDs (Top-Level-Domains) in dieser Liste enthalten sind. Sie wären jedoch gezwungen, diese Liste zu aktualisieren, wenn neue TLDs auftauchen (wie der 2012-Zusatz
.mobi
und.tel
).Der Vorteil des direkten Einbindens des Parsers besteht darin, dass die Regeln in der Mail-Grammatik für die Teile, die das Mail-Juwel verwendet, ziemlich weit gefasst sind. Es soll ihm ermöglichen, eine Adresse zu analysieren, wie
user<[email protected]>
sie für SMTP üblich ist. Wenn Sie es aus dem konsumieren,Mail::Address
sind Sie gezwungen, eine Reihe zusätzlicher Überprüfungen durchzuführen.Ein weiterer Hinweis zum Mail-Juwel, obwohl die Klasse RFC2822 heißt, enthält die Grammatik einige Elemente von RFC5322 , zum Beispiel diesen Test .
quelle
In Rails 3 ist es möglich, ein wiederverwendbares zu schreiben Validator , wie dieser großartige Beitrag erklärt:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
und benutze es mit
validates_with
:quelle
Bei den anderen Antworten bleibt die Frage offen - warum sollte man sich die Mühe machen, klug zu sein?
Das tatsächliche Volumen der Randfälle, die viele reguläre Ausdrücke möglicherweise ablehnen oder übersehen, scheint problematisch.
Ich denke, die Frage lautet: "Was versuche ich zu erreichen?", Selbst wenn Sie die E-Mail-Adresse "validieren", bestätigen Sie nicht, dass es sich um eine funktionierende E-Mail-Adresse handelt.
Wenn Sie sich für Regexp entscheiden, überprüfen Sie einfach, ob auf der Clientseite @ vorhanden ist.
Lassen Sie für das falsche E-Mail-Szenario einen Zweig "Nachricht konnte nicht gesendet werden" an Ihren Code senden.
quelle
Grundsätzlich gibt es 3 häufigste Optionen:
Wenn Sie nicht sowohl validates_email_veracity_of als auch die Token-Generierung verwenden möchten, würde ich die Regexp-Überprüfung der alten Schule durchführen.
quelle
Das Mail-Juwel verfügt über einen integrierten Adressparser.
quelle
Diese Lösung basiert auf Antworten von @SFEley und @Alessandro DS mit einem Refactor und einer Klarstellung der Verwendung.
Sie können diese Validator-Klasse in Ihrem Modell folgendermaßen verwenden:
Vorausgesetzt, Sie haben Folgendes in Ihrem
app/validators
Ordner (Rails 3):quelle
Zur Validierung von Mailinglisten . (Ich benutze Rails 4.1.6)
Ich habe meinen regulären Ausdruck von hier bekommen . Es scheint sehr vollständig zu sein und wurde gegen eine große Anzahl von Kombinationen getestet. Sie können die Ergebnisse auf dieser Seite sehen.
Ich habe es leicht in einen Ruby-Regexp geändert und in meinen eingefügt
lib/validators/email_list_validator.rb
Hier ist der Code:
Und ich benutze es so im Modell:
Mailinglisten wie diese werden mit unterschiedlichen Trennzeichen und Synthax validiert:
Bevor ich diesen regulären Ausdruck verwendet habe, habe ich ihn verwendet
Devise.email_regexp
, aber das ist ein sehr einfacher regulärer Ausdruck und hat nicht alle Fälle erhalten, die ich brauchte. Einige E-Mails sind gestoßen.Ich habe andere reguläre Ausdrücke aus dem Internet ausprobiert, aber dieser hat bis jetzt die besten Ergebnisse erzielt. Hoffe es hilft in deinem Fall.
quelle