• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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