1. ホーム
  2. python

[解決済み] django/pythonでメールの有効性をチェックする [重複].

2023-01-31 05:45:55

質問

私はニュースレターベースにメールを追加する関数を書きました。送信されたメールの有効性をチェックする機能を追加するまでは、完璧に動作していました。今、私は返されるたびに、"間違ったメール"を取得します。誰かこのエラーを見ることができますか?使用されている正規表現は、:

\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b であり、100%有効です ( http://gskinner.com/RegExr/ ) ですが、使い方が間違っているか、ロジックエラーなのかもしれません。

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\.-]+@[\w\.-]+\.\w{2,4}\b', email) != None:
            return 1
    return 0

どのように解決するのですか?

<ブロッククオート

UPDATE 2017 : 下記のコードは7年前のもので、その後修正、修正、拡張されました。今これを行いたい人のために、正しいコードは周りに住んでいる にあります。 .

django.core.validators の一部を紹介します :)

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')

というように、フォームやフォームフィールドを使いたくない場合は、インポートした email_re をインポートして、それを関数で使うか、あるいはもっといい方法として validate_email をインポートし、それを使って、可能な限りキャッチする ValidationError .

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

そして、以下は Mail::RFC822::Address regexpを使用します。 を PERL で使用したものです。