class EmailAddress: """Represents an email address, optionally with the person's name.""" email_validator = EmailValidator() def __init__(self, email: str, name: str = ''): """Validate *email* and instantiate.""" self.email_validator.validate_or_raise(email) self.email = email self.name = name def to_mailer(self) -> Union[str, Tuple[str, str]]: """Return either email or a 2-tuple (name, email).""" return (self.name, self.email) if self.name else self.email def __str__(self) -> str: return f'"{self.name}" <{self.email}>' if self.name else self.email
class EmailAddress: """Represents an email address, optionally with the person's name.""" email_validator = EmailValidator() email: TEmailAddress name: TPersonsName def __init__(self, email: TEmailAddress, name: TPersonsName = TPersonsName("")): """Validate *email* and instantiate.""" self.email_validator.validate_or_raise(email) self.__dict__["email"] = email # avoid frozen dataclass error self.__dict__["name"] = name # avoid frozen dataclass error def to_mailer(self) -> Union[str, Tuple[str, str]]: """Return either email or a 2-tuple (name, email).""" return (self.name, self.email) if self.name else self.email def __str__(self) -> str: return f'"{self.name}" <{self.email}>' if self.name else self.email
def test_email_validator(self): v = EmailValidator() # Correct email addresses email, err = v.validate('*****@*****.**') assert not err email, err = v.validate(' [email protected] ') assert not err email, err = v.validate("a.a-a+a_a!a#a$a%a&a'a/a=a`a|a~a?a^a{a}" "a*[email protected]") assert not err email, err = v.validate('*****@*****.**') assert not err email, err = v.validate('customer/[email protected]') assert not err email, err = v.validate('[email protected]') assert not err email, err = v.validate('!def!xyz%[email protected]') assert not err email, err = v.validate('*****@*****.**') assert not err # Incorrect email addresses email, err = v.validate('Abc.example.com') assert err email, err = v.validate('A@[email protected]') assert err email, err = v.validate('*****@*****.**') assert err email, err = v.validate('*****@*****.**') assert err email, err = v.validate('ã@example.com') assert err email, err = v.validate('\@example.com') assert err
assert not err email, err = v.validate('!def!xyz%[email protected]') assert not err email, err = v.validate('*****@*****.**') assert not err # Incorrect email addresses email, err = v.validate('Abc.example.com') assert err email, err = v.validate('A@[email protected]') assert err email, err = v.validate('*****@*****.**') assert err email, err = v.validate('*****@*****.**') assert err email, err = v.validate('ã@example.com') assert err email, err = v.validate('\@example.com') assert err if __name__ == '__main__': # Interactive test v = EmailValidator(lookup_dns='a') while True: email = \ raw_input('Type an email or CTRL-C to quit: ').decode('utf8') email, err = v.validate(email) if err: print('Error: ' + err) else: print('E-mail is valid: ' + email) # the email, corrected