Python のメールアドレスチェック

pydantic EmailStr を使用したバリデーションチェックは
https://github.com/JoshData/python-email-validator
が使用されているのだが、EmailStrは、
"名称" <address@domain>
の形式を受け付けてくれる。

from pydantic import BaseModel, EmailStr, ValidationError

class MyModel(BaseModel):
    email :EmailStr

try:
    model = MyModel(name="ABC", email='"AAA" <aaa123@sample.com>')
    print(f'model.email = {model.email}')
except ValidationError as e:
    print(e)

これは例外にならず、 print(f'model.email = {model.email}') の結果は、

model.email = aaa123@sample.com

とメールアドレスを期待どおりに参照できる。
一見この sample.com はあり得ないと思いますが、実はダミーURLなので、OKになってしまいます。

email_validatorvalidate_email を使用すると、
  email='"AAA" <aaa123@sample.com>'
という書き方は許されず、さらにドメインが有効かもチェックしてくれる。

from email_validator import validate_email, EmailNotValidError,  EmailUndeliverableError

targetmail = 'aaa123@sample.com'

try:
  emailinfo = validate_email(targetmail)
  # email = emailinfo.normalized

except EmailUndeliverableError as e:
  print(e)
except EmailNotValidError as e:
  print(e)