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