Source code for z3c.schema.email.field

##############################################################################
#
# Copyright (c) 2006 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""

"""
__docformat__ = "reStructuredText"

import zope.interface
import zope.schema

from z3c.schema.email import interfaces

rfc822_specials = '()<>@,;:\\"[]'


[docs]def isValidMailAddress(addr): """Returns True if the email address is valid and False if not.""" # First we validate the name portion (name@domain) c = 0 while c < len(addr): if addr[c] == '@': break # Make sure there are only ASCII characters if ord(addr[c]) <= 32 or ord(addr[c]) >= 127: return False # A RFC-822 address cannot contain certain ASCII characters if addr[c] in rfc822_specials: return False c = c + 1 # check whether we have any input and that the name did not end with a dot if not c or addr[c - 1] == '.': return False # check also starting and ending dots in (name@domain) if addr.startswith('.') or addr.endswith('.'): return False # Next we validate the domain portion (name@domain) domain = c = c + 1 # Ensure that the domain is not empty (name@) if domain >= len(addr): return False count = 0 while c < len(addr): # Make sure that domain does not end with a dot or has two dots in a # row if addr[c] == '.': if c == domain or addr[c - 1] == '.': return False count = count + 1 # Make sure there are only ASCII characters if ord(addr[c]) <= 32 or ord(addr[c]) >= 127: return False # A RFC-822 address cannot contain certain ASCII characters if addr[c] in rfc822_specials: return False c = c + 1 if count >= 1: return True else: return False
[docs]@zope.interface.implementer(interfaces.IRFC822MailAddress) class RFC822MailAddress(zope.schema.TextLine): """A valid email address.""" def constraint(self, value): return '\n' not in value and '\r' not in value def _validate(self, value): super(RFC822MailAddress, self)._validate(value) if not isValidMailAddress(value): raise interfaces.NotValidRFC822MailAdress(value)