wake-up-neo.com

Überprüfung der Gültigkeit von E-Mails in Django/Python

Ich habe eine Funktion zum Hinzufügen von E-Mails zur Newsletter-Basis geschrieben. Bis ich die Gültigkeit der gesendeten E-Mail überprüft habe, funktionierte sie einwandfrei. Jetzt bekomme ich jedes Mal eine falsche E-Mail. Kann jemand hier Fehler sehen? Der verwendete Regex ist:

\b[\w\.-][email protected][\w\.-]+\.\w{2,4}\b und es ist 100% gültig ( http://gskinner.com/RegExr/ ), aber ich verwende es möglicherweise falsch oder es könnte ein logischer Fehler sein:

def newsletter_add(request):
    if request.method == "POST":   
        try:
            e = NewsletterEmails.objects.get(email = request.POST['email'])
            message = _(u"Email is already added.")
            type = "error"
        except NewsletterEmails.DoesNotExist:
            if validateEmail(request.POST['email']):
                try:
                    e = NewsletterEmails(email = request.POST['email'])
                except DoesNotExist:
                    pass
                message = _(u"Email added.")
                type = "success"
                e.save()
            else:
                message = _(u"Wrong email")
                type = "error"

import re

def validateEmail(email):
    if len(email) > 6:
        if re.match('\b[\w\.-][email protected][\w\.-]+\.\w{2,4}\b', email) != None:
            return 1
    return 0
61
muntu

UPDATE 2017: Der folgende Code ist 7 Jahre alt und wurde seitdem geändert, fixiert und erweitert. Für jeden, der dies jetzt tun möchte, lebt der richtige Code hier: https://github.com/Django/django/blob/master/Django/core/validators.py#L168-L180

Hier ist ein Teil von Django.core.validatoren, die Sie interessieren könnten :)

class EmailValidator(RegexValidator):

    def __call__(self, value):
        try:
            super(EmailValidator, self).__call__(value)
        except ValidationError, e:
            # Trivial case failed. Try for possible IDN domain-part
            if value and u'@' in value:
                parts = value.split(u'@')
                domain_part = parts[-1]
                try:
                    parts[-1] = parts[-1].encode('idna')
                except UnicodeError:
                    raise e
                super(EmailValidator, self).__call__(u'@'.join(parts))
            else:
                raise

email_re = re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
    r')@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$', re.IGNORECASE)  # domain
validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')

wenn Sie also keine Formulare und Formularfelder verwenden möchten, können Sie email_re importieren und in Ihrer Funktion verwenden, oder noch besser - importieren Sie validate_email und verwenden Sie es, um mögliche ValidationError zu erfassen.

def validateEmail( email ):
    from Django.core.validators import validate_email
    from Django.core.exceptions import ValidationError
    try:
        validate_email( email )
        return True
    except ValidationError:
        return False

Und hier ist Mail :: RFC822 :: Adresse regexp , die in Perl verwendet wird, wenn Sie wirklich so paranoid sein müssen.

141
cji
from Django.core.exceptions import ValidationError
from Django.core.validators import validate_email
try:
    validate_email("[email protected]")
except ValidationError as e:
    print "oops! wrong email"
else:
    print "hooray! email is valid"
113
oblalex

Nein, bitte versuchen Sie nicht, E-Mail-Adressen selbst zu überprüfen. Es ist eines dieser Dinge, die Menschen niemals richtig machen.

Ihre sicherste Option ist, da Sie bereits Django verwenden, die Formularvalidierung für E-Mail zu nutzen. In den Dokumenten ( http://docs.djangoproject.com/de/dev/ref/forms/fields/ ):

>>> from Django import forms
>>> f = forms.EmailField()
>>> f.clean('[email protected]')
u'[email protected]'
>>> f.clean(u'[email protected]')
u'[email protected]'
>>> f.clean('invalid e-mail address')
...
ValidationError: [u'Enter a valid e-mail address.']
47
Nicholas Knight

Sie haben es falsch verstanden, aber es ist eine Aufgabe, die Sie sowieso nicht machen können. Es gibt nur einen Weg, um zu wissen, ob eine RFC 2822 -Adresse gültig ist, und zwar, E-Mail an sie zu senden und eine Antwort zu erhalten. Wenn Sie etwas anderes tun, wird der Informationsgehalt Ihres Datums nicht einmal um ein Bruchteil verbessert.

Sie schrauben auch den menschlichen Faktor und das Akzeptanz-Eigentum, wenn Sie validateEmail meine Adresse angeben

[email protected]

und Sie sagen mir, ich habe einen Fehler gemacht, ich verabschiede mich von Ihrer Bewerbung.

7
msw

Dieser reguläre Ausdruck überprüft eine E-Mail-Adresse mit angemessener Genauigkeit.

\w[\w\.-]*@\w[\w\.-]+\.\w+

Erlaubt alphanumerische Zeichen, _, . und -.

1
Zenadix

Ich kann sehen, dass viele Antworten hier auf dem Django-Framework von Python basieren. Aber für die Überprüfung einer E-Mail-Adresse, warum eine solche schwere Software installiert werden muss. Wir haben das Validate_email-Paket für Python, das überprüft, ob eine E-Mail gültig ist, richtig formatiert ist und tatsächlich existiert. Es ist ein leichtes Paket (Größe <1 MB).

INSTALLATION: 

pip install validate_email

Grundnutzung:

Überprüft, ob E-Mail das richtige Format hat.

from validate_email import validate_email
is_valid = validate_email('[email protected]')

Um die Domäne "mx" zu überprüfen und zu prüfen, ob E-Mails vorhanden sind, können Sie das pyDNS-Paket zusammen mit "validate_email" installieren.

Überprüfen Sie, ob die E-Mail existiert: 

from validate_email import validate_email
is_valid = validate_email('[email protected]',verify=True)

Gibt True zurück, wenn die E-Mail in der realen Welt existiert, andernfalls False.

0
Himanshu Poddar

Ändern Sie Ihren Code davon:

re.match ('\ b [\ w .-] + @ [\ w .-] +.\w {2,4}\b', E-Mail)

zu diesem:

re.match (r '\ b [\ w .-] + @ [\ w .-] +.\w {2,4}\b', E-Mail)

funktioniert gut mit mir.

0
Kent Astudillo