Skip to content

Commit

Permalink
Fix asyncio compatibility issue in windows platform
Browse files Browse the repository at this point in the history
Fix SMTP status checks
Fix debug logs formatting
  • Loading branch information
kakshay21 committed Feb 7, 2021
1 parent e40d5e8 commit b06e815
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 14 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ False
>>> verify_email(['foo@bar.com', 'example@foo.com'])
[False, False]
```
Also, note that some emails will likely fail in validation, if so you can check the reason of failure
using debug flag.
```
>>> from verify_email import verify_email
>>> verify_email('foo@bar.com', debug=True)
```

see for more examples [examples.py](https://github.com/kakshay21/verify_email/blob/master/examples.py)

## Contribute
Expand Down
7 changes: 7 additions & 0 deletions verify_email/tests/test_verify_email.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,12 @@ def test_valid_email(self):
def test_invalid_email(self):
self.assertEqual(False, verify_email(self.emails[1]))

def test_email_with_debugger(self):
self.assertEqual(False, verify_email(self.emails[2], debug=True))

def test_multiple_emails(self):
self.assertEqual([True, False, False, False], verify_email(self.emails))


if __name__ == '__main__':
unittest.main()
33 changes: 19 additions & 14 deletions verify_email/verify_email.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ def verify_email(emails, timeout=None, verify=True, debug=False):
if not is_list(emails):
emails = [emails]

# asyncio events doesn't fully support windows platform
# See: https://github.com/kakshay21/verify_email/issues/34#issuecomment-616971628
if sys.platform == "win32":
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
loop = asyncio.get_event_loop()

for email in emails:
Expand All @@ -119,33 +123,34 @@ async def verify_email_async(emails, timeout=None, verify=True, debug=False):

async def network_calls(mx, email, timeout=20):
logger = logging.getLogger('verify_email')
result = False
try:
smtp = smtplib.SMTP(mx.host, timeout=timeout)
status, _ = smtp.ehlo()
if status != 250:
if status >= 400:
smtp.quit()
logger.debug(f'{mx} answer: {status} - {_}')
logger.debug(f'{mx} answer: {status} - {_}\n')
return False
smtp.mail('')
status, _ = smtp.rcpt(email)
if status >= 500:
smtp.quit()
logger.debug('{mx} answer: {status} - {_}')
return False
if status == 250:
smtp.quit()
return True
if status >= 400:
logger.debug(f'{mx} answer: {status} - {_}\n')
result = False
if status >= 200 and status <= 250:
result = True

logger.debug(f'{mx} answer: {status} - {_}')
logger.debug(f'{mx} answer: {status} - {_}\n')
smtp.quit()

except smtplib.SMTPServerDisconnected:
logger.debug(f'Server does not permit verify user, {mx} disconnected.')
logger.debug(f'Server does not permit verify user, {mx} disconnected.\n')
except smtplib.SMTPConnectError:
logger.debug(f'Unable to connect to {mx}.')
logger.debug(f'Unable to connect to {mx}.\n')
except socket.timeout as e:
logger.debug(f'Timeout connecting to server {mx}: {e}.')
logger.debug(f'Timeout connecting to server {mx}: {e}.\n')
return None
except socket.error as e:
logger.debug(f'ServerError or socket.error exception raised {e}.')
logger.debug(f'ServerError or socket.error exception raised {e}.\n')
return None

return result

0 comments on commit b06e815

Please sign in to comment.