web-dev-qa-db-ja.com

Django / pythonでの電子メールの有効性の確認

メールをニュースレターベースに追加する関数を作成しました。送信した電子メールの有効性のチェックを追加するまで、問題なく機能していました。これで、毎回「間違ったメール」が返ってきます。誰でもここでエラーを見ることができますか?使用される正規表現は次のとおりです。

\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
67
muntu

UPDATE 2017:以下のコードは7年前のもので、変更、修正、および拡張されました。これを今すぐ行いたい人のために、正しいコードがここにあります: https://github.com/Django/django/blob/master/Django/core/validators.py#L168-L18

ここに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そしてあなたの関数でそれを使用するか、さらに良い-import 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で使用されています。

146
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"
125
oblalex

いや、いや、自分でメールアドレスを検証しようとしないでください。それは人々が決して正しくないものの一つです。

すでにDjangoを使用しているので、最も安全なオプションは、電子メールのフォーム検証を利用することです。ドキュメントごと( http://docs.djangoproject.com/en/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.']
48
Nicholas Knight

あなたはそれを間違えたが、それはあなたがとにかくすることができないタスクです。 RFC 2822 アドレスが有効かどうかを知る唯一の方法があります。それは、そこにメールを送信して応答を取得することです。それ以外のことを行っても、データの情報内容は少しでも改善されません。

また、validateEmailのアドレスを与えるときのために、ヒューマンファクターと受け入れプロパティを台無しにします

[email protected]

そして、あなたは私にエラーを犯したと言って、あなたのアプリケーションに別れを告げます。

7
msw

ここでの多くの答えは、PythonのDjangoフレームワークに基づいていることがわかります。しかし、メールアドレスを確認するために、なぜそんなに重いソフトウェアをインストールするのか。 PythonのValidate_emailパッケージを使用して、電子メールが有効で、適切にフォーマットされ、実際に存在するかどうかを確認します。その軽量パッケージ(サイズ<1MB)。

インストール:

pip install validate_email

基本的な使用法:

電子メールが適切な形式であるかどうかを確認します。

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

ドメインmxを確認し、メールが存在することを確認するには、pyDNSパッケージをvalidate_emailと共にインストールできます。

メールが存在することを確認:

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

メールが実際に存在する場合はTrueを返し、そうでない場合はFalseを返します。

1
Himanshu Poddar

この正規表現は、電子メールアドレスを妥当な精度で検証します。

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

英数字、_.および-

1
Zenadix

これからコードを変更します。

re.match( '\ b [\ w .-] + @ [\ w .-] +。\ w {2,4}\b'、email)

これに:

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

私と一緒に動作します。

0
Kent Astudillo