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_SSLv23) 29 with support.transient_internet(self.testServer): 30 server = smtplib.SMTP(self.testServer, self.remotePort) 31 try: 32 server.starttls(context=context) 33 except smtplib.SMTPException as e: 34 if e.args[0] == 'STARTTLS extension not supported by server.': 35 unittest.skip(e.args[0]) 36 else: 37 raise 38 server.ehlo() 39 server.quit() 40 41 42class SmtpSSLTest(unittest.TestCase): 43 testServer = 'smtp.gmail.com' 44 remotePort = 465 45 46 def test_connect(self): 47 support.get_attribute(smtplib, 'SMTP_SSL') 48 with support.transient_internet(self.testServer): 49 server = smtplib.SMTP_SSL(self.testServer, self.remotePort) 50 server.ehlo() 51 server.quit() 52 53 def test_connect_default_port(self): 54 support.get_attribute(smtplib, 'SMTP_SSL') 55 with support.transient_internet(self.testServer): 56 server = smtplib.SMTP_SSL(self.testServer) 57 server.ehlo() 58 server.quit() 59 60 def test_connect_using_sslcontext(self): 61 context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 62 support.get_attribute(smtplib, 'SMTP_SSL') 63 with support.transient_internet(self.testServer): 64 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context) 65 server.ehlo() 66 server.quit() 67 68 def test_connect_using_sslcontext_verified(self): 69 with support.transient_internet(self.testServer): 70 can_verify = check_ssl_verifiy(self.testServer, self.remotePort) 71 if not can_verify: 72 self.skipTest("SSL certificate can't be verified") 73 74 support.get_attribute(smtplib, 'SMTP_SSL') 75 context = ssl.create_default_context() 76 with support.transient_internet(self.testServer): 77 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context) 78 server.ehlo() 79 server.quit() 80 81 82if __name__ == "__main__": 83 unittest.main() 84