authentic/authentic2/validators.py

51 lines
1.6 KiB
Python

from __future__ import unicode_literals
import smtplib
from django.utils.translation import ugettext_lazy as _
from django.core.validators import EmailValidator, email_re
from django.core.exceptions import ValidationError
import dns.resolver
# copied from http://www.djangotips.com/real-email-validation
class EmailValidator(EmailValidator):
def __call__(self, value):
super(EmailValidator, self).__call__(value)
try:
hostname = value.split('@')[-1]
except KeyError:
raise ValidationError(_('Enter a valid email address.'))
try:
for server in [ str(r.exchange).rstrip('.') \
for r \
in dns.resolver.query(hostname, 'MX') ]:
try:
smtp = smtplib.SMTP()
smtp.connect(server)
status = smtp.helo()
if status[0] != 250:
continue
smtp.mail('')
status = smtp.rcpt(value)
if status[0] % 100 == 5:
raise ValidationError(_('Invalid email address.'))
break
except smtplib.SMTPServerDisconnected:
break
except smtplib.SMTPConnectError:
continue
except dns.resolver.NXDOMAIN:
raise ValidationError(_('Nonexistent domain.'))
except dns.resolver.NoAnswer:
raise ValidationError(_('Nonexistent email address.'))
validate_email = EmailValidator(
email_re,
_('Enter a valid email address.'),
'invalid'
)