Home | History | Annotate | Download | only in test
      1 import unittest
      2 from test import support
      3 import smtplib
      4 import socket
      5 
      6 ssl = support.import_module("ssl")
      7 
      8 support.requires("network")
      9 
     10 def 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 
     22 class 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 
     42 class 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 
     82 if __name__ == "__main__":
     83     unittest.main()
     84