It's complicated but thankfully you don't have to reinvent the wheel:
https://github.com/JoshData/python-email-validator (my project)
The README covers a lot of ground: internationalized domain names, internationalized local parts, SMTPUTF8, Unicode normalization, not performing SMTP checks, not permitting obsolete email syntax, and missing UCS-4 support in Python 2.7.