test_smtpnet.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import unittest
  2. from test import support
  3. from test.support import import_helper
  4. from test.support import socket_helper
  5. import smtplib
  6. import socket
  7. ssl = import_helper.import_module("ssl")
  8. support.requires("network")
  9. def check_ssl_verifiy(host, port):
  10. context = ssl.create_default_context()
  11. with socket.create_connection((host, port)) as sock:
  12. try:
  13. sock = context.wrap_socket(sock, server_hostname=host)
  14. except Exception:
  15. return False
  16. else:
  17. sock.close()
  18. return True
  19. class SmtpTest(unittest.TestCase):
  20. testServer = 'smtp.gmail.com'
  21. remotePort = 587
  22. def test_connect_starttls(self):
  23. support.get_attribute(smtplib, 'SMTP_SSL')
  24. context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
  25. context.check_hostname = False
  26. context.verify_mode = ssl.CERT_NONE
  27. with socket_helper.transient_internet(self.testServer):
  28. server = smtplib.SMTP(self.testServer, self.remotePort)
  29. try:
  30. server.starttls(context=context)
  31. except smtplib.SMTPException as e:
  32. if e.args[0] == 'STARTTLS extension not supported by server.':
  33. unittest.skip(e.args[0])
  34. else:
  35. raise
  36. server.ehlo()
  37. server.quit()
  38. class SmtpSSLTest(unittest.TestCase):
  39. testServer = 'smtp.gmail.com'
  40. remotePort = 465
  41. def test_connect(self):
  42. support.get_attribute(smtplib, 'SMTP_SSL')
  43. with socket_helper.transient_internet(self.testServer):
  44. server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
  45. server.ehlo()
  46. server.quit()
  47. def test_connect_default_port(self):
  48. support.get_attribute(smtplib, 'SMTP_SSL')
  49. with socket_helper.transient_internet(self.testServer):
  50. server = smtplib.SMTP_SSL(self.testServer)
  51. server.ehlo()
  52. server.quit()
  53. def test_connect_using_sslcontext(self):
  54. context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
  55. context.check_hostname = False
  56. context.verify_mode = ssl.CERT_NONE
  57. support.get_attribute(smtplib, 'SMTP_SSL')
  58. with socket_helper.transient_internet(self.testServer):
  59. server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
  60. server.ehlo()
  61. server.quit()
  62. def test_connect_using_sslcontext_verified(self):
  63. with socket_helper.transient_internet(self.testServer):
  64. can_verify = check_ssl_verifiy(self.testServer, self.remotePort)
  65. if not can_verify:
  66. self.skipTest("SSL certificate can't be verified")
  67. support.get_attribute(smtplib, 'SMTP_SSL')
  68. context = ssl.create_default_context()
  69. with socket_helper.transient_internet(self.testServer):
  70. server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
  71. server.ehlo()
  72. server.quit()
  73. if __name__ == "__main__":
  74. unittest.main()